不确定是否应该将其作为编程问题或数学问题发布,但我需要绘制一个n边正多边形,提供一条边的中心,半径和末端坐标。
到目前为止,这是我的代码,但它只能绘制多边形垂直最右边的多边形:
from tkinter import *
import math
class App:
def __init__(self, master):
self.w = Canvas(width=800, height=600, bg='black')
self.w.draw_regular_polygon((400,400), 100, 3, outline='green')
self.w.grid(row=0, column=0)
def _draw_regular_polygon(self, center, radius, n, **kwargs):
coord_list = []
for i in range(n):
coord_x = center[0] + radius * math.cos((math.pi/n) * (1 + 2 * i))
coord_y = center[1] + radius * math.sin((math.pi/n) * (1 + 2 * i))
coord_list.append(coord_x)
coord_list.append(coord_y)
return self.create_polygon(coord_list, **kwargs)
Canvas.draw_regular_polygon = _draw_regular_polygon
root = Tk()
app = App(root)
root.mainloop()
我需要能够提供垂直线的端点,或者能够旋转多边形,使每个点朝向指定的方向。
这个项目的最终目标是绘制一个n边形正多边形的网格。我正在使用tkinter,因为它是我最熟悉的包,但是我愿意学习一个不同的包,如果有一个可以更好地处理它,但不是一个能为我画出格子的包。我希望能够理解格子的构成,而不仅仅是为它画出来。
答案 0 :(得分:1)
为您的功能添加额外的旋转角度;将该常量值添加到围绕创建坐标列表的圆的旋转中。
我稍微重新排序了你的坐标系,并添加了一个固定值,因此 bottom 线总是以0
的角度直线绘制。要旋转到两点之间的下一个半间隔,请将math.pi/n
添加为角度。
from tkinter import *
import math
class App:
def __init__(self, master):
self.w = Canvas(width=800, height=600, bg='black')
self.w.draw_regular_polygon((400,400), 100, 5, 0, outline='green')
self.w.draw_regular_polygon((400,400), 100, 5, math.pi/5, outline='red')
self.w.grid(row=0, column=0)
def _draw_regular_polygon(self, center, radius, n, angle, **kwargs):
angle -= (math.pi/n)
coord_list = [[center[0] + radius * math.sin((2*math.pi/n) * i - angle),
center[1] + radius * math.cos((2*math.pi/n) * i - angle)] for i in range(n)]
return self.create_polygon(coord_list, **kwargs)
Canvas.draw_regular_polygon = _draw_regular_polygon
root = Tk()
app = App(root)
root.mainloop()
结果:
(那就是说:唯一重复的n面多边形格子用于n = [3,4,6]
,唯一有问题的是3
,你可以用硬编码。)