# 计算多边形内角
def polygon_inner_angle(n):
return (n - 2)*180 / n
# 绘制一组边
def generate_edges(x, y, n, flag=True):
inner_angle = deg2rad(polygon_inner_angle(n))
if flag is True:
xr, yr = rotation_2D(x - x[-1], y - y[-1], theta=inner_angle)
return xr + x[-1], yr + y[-1]
else:
xr, yr = rotation_2D(x - x[0], y - y[0], theta=inner_angle)
return xr + x[0], yr + y[0]
# 绘制基准边
def bessel(start, end, step=0.01):
bx, by = np.array([]), np.array([])
for t in np.linspace(0, 1 + step, int(1/step)):
fx = t*start[0] + (1 - t)*end[0]
fy = t*start[1] + (1 - t)*end[1]
bx, by = map(np.append, [bx, by], [fx, fy])
return bx, by
# 绘制整个图形
def polygon(start, end, n):
ox, oy = np.array([]), np.array([])
x, y = bessel(start, end)
flags = [True, False]*n
for fg in flags:
ox, oy = map(np.concatenate, [(ox, x), (oy, y)])
x, y = generate_edges(x, y, n, fg)
return ox, oy
def main():
# 边数
n = 8
# 基准边起始点
start, end = [-5, 0], [5, 0]
x, y = polygon(start, end, n)
plt.plot(x, y, 'r')
plt.axis("equal")
plt.show()
if __name__ == "__main__":
main()
def deg2rad(deg):
return PI*deg/180
def rotation_2D(ex, ey, theta=PI/2):
ex_r = cos(theta)*ex + sin(theta)*ey
ex_y = cos(theta)*ey - sin(theta)*ex
return ex_r, ex_y