判断polygon方向:顺逆时针()

判断polygon方向

根据polygon点坐标,判断该多边形绘制逻辑,顺时针 or 逆时针。

多边形坐标

# eg:
points = [(2.7388851109150023, 3.3239332759385984), (-17.760919951693104, 2.222307409516218), (-17.314910496242728, -2.516984005337407), (-12.852000304853743, -2.181040678562682), (-12.593791095515666, -5.8155342680533355), (-4.857700723763328, -5.360086611284489), (-4.72572589218098, -7.919382774996063), (-17.0160820270518, -8.620830962890897), (-17.867133295518986, -0.9456760895428342), (-22.258963842225317, -1.357221390151473), (-22.515649371106914, 1.792758532824255), (-50.111561102018456, 1.020935065299705), (-49.91522402991826, -6.579202348469052), (-39.25591973076352, -6.777074602691823), (-39.3470211782855, -14.14753079960294), (-4.451428730046921, -13.176437404289821), (19.38029991918383, -11.258640459629042), (18.678629198011325, -3.52091868564249), (40.24382063819184, -1.591592108027843), (40.610108155470044, -5.677529622149496), (53.63278351803943, -4.419178715222456), (54.019049536995844, -8.87311208850915), (87.09318512464871, -5.0339697036894435), (86.048475587818, 1.3394651586721347), (70.41625034816182, -1.3933549733832722), (70.05627257055237, 0.32943075873207184), (77.90519487909148, 1.835562744869648), (77.8005383315741, 2.6041726269511902), (83.7250982659767, 3.4304970071188574), (87.12772536434038, 4.021284170346685), (85.85772371362678, 11.705521972785498), (69.0134084370372, 9.44435529400685), (69.37946910976412, 6.777191877663952), (64.65690016784653, 6.192228087150736), (64.38067230336098, 8.457858764430892), (3.679804302962524, 3.3268451469218845)]

1. 通过计算叉乘判断

def calculate_polygon_area(points_list):
    n = len(points_list)
    # 点的个数<3 为line,非polygon
    if n < 3:
        return 0.0
    area = 0
    for i in range(n):
        x = points_list[i][0]
        y = points_list[i][1]
        # (x1*y2 - y1*x2)
        area += x * points_list[(i + 1) % n][1] - y * points_list[(i + 1) % n][0]
    return area * -0.5

2. matplotlib通过画点判断顺逆时针

import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation

result = [(i[0], i[1]) for i in points]
xx = []
yy = []
fig, ax = plt.subplots()
line, = plt.plot([], [], '.-')

def init():
    # 初始化函数用于绘制一块干净的画布,为后续绘图做准备
    # 初始函数,设置绘图范围
    ax.set_xlim(-100, 100)
    ax.set_ylim(-100, 100)
    return line

def update(step):
    # 通过帧数来不断更新新的数值
    ri = result[step]
    # print(ri)
    xx.append(ri[0])
    yy.append(ri[1])

    line.set_data(xx, yy)

    return line

ani = FuncAnimation(fig, update, frames=[i for i in range(len(result))], init_func=init, interval=200, repeat=False)
plt.show()
————————

判断polygon方向

根据polygon点坐标,判断该多边形绘制逻辑,顺时针 or 逆时针。

多边形坐标

# eg:
points = [(2.7388851109150023, 3.3239332759385984), (-17.760919951693104, 2.222307409516218), (-17.314910496242728, -2.516984005337407), (-12.852000304853743, -2.181040678562682), (-12.593791095515666, -5.8155342680533355), (-4.857700723763328, -5.360086611284489), (-4.72572589218098, -7.919382774996063), (-17.0160820270518, -8.620830962890897), (-17.867133295518986, -0.9456760895428342), (-22.258963842225317, -1.357221390151473), (-22.515649371106914, 1.792758532824255), (-50.111561102018456, 1.020935065299705), (-49.91522402991826, -6.579202348469052), (-39.25591973076352, -6.777074602691823), (-39.3470211782855, -14.14753079960294), (-4.451428730046921, -13.176437404289821), (19.38029991918383, -11.258640459629042), (18.678629198011325, -3.52091868564249), (40.24382063819184, -1.591592108027843), (40.610108155470044, -5.677529622149496), (53.63278351803943, -4.419178715222456), (54.019049536995844, -8.87311208850915), (87.09318512464871, -5.0339697036894435), (86.048475587818, 1.3394651586721347), (70.41625034816182, -1.3933549733832722), (70.05627257055237, 0.32943075873207184), (77.90519487909148, 1.835562744869648), (77.8005383315741, 2.6041726269511902), (83.7250982659767, 3.4304970071188574), (87.12772536434038, 4.021284170346685), (85.85772371362678, 11.705521972785498), (69.0134084370372, 9.44435529400685), (69.37946910976412, 6.777191877663952), (64.65690016784653, 6.192228087150736), (64.38067230336098, 8.457858764430892), (3.679804302962524, 3.3268451469218845)]

1. 通过计算叉乘判断

def calculate_polygon_area(points_list):
    n = len(points_list)
    # 点的个数<3 为line,非polygon
    if n < 3:
        return 0.0
    area = 0
    for i in range(n):
        x = points_list[i][0]
        y = points_list[i][1]
        # (x1*y2 - y1*x2)
        area += x * points_list[(i + 1) % n][1] - y * points_list[(i + 1) % n][0]
    return area * -0.5

2. matplotlib通过画点判断顺逆时针

import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation

result = [(i[0], i[1]) for i in points]
xx = []
yy = []
fig, ax = plt.subplots()
line, = plt.plot([], [], '.-')

def init():
    # 初始化函数用于绘制一块干净的画布,为后续绘图做准备
    # 初始函数,设置绘图范围
    ax.set_xlim(-100, 100)
    ax.set_ylim(-100, 100)
    return line

def update(step):
    # 通过帧数来不断更新新的数值
    ri = result[step]
    # print(ri)
    xx.append(ri[0])
    yy.append(ri[1])

    line.set_data(xx, yy)

    return line

ani = FuncAnimation(fig, update, frames=[i for i in range(len(result))], init_func=init, interval=200, repeat=False)
plt.show()