绘制具有一个顶点的中心点,半径和坐标的n边正多边形

时间:2018-06-18 19:58:21

标签: python-3.x tkinter

不确定是否应该将其作为编程问题或数学问题发布,但我需要绘制一个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,因为它是我最熟悉的包,但是我愿意学习一个不同的包,如果有一个可以更好地处理它,但不是一个能为我画出格子的包。我希望能够理解格子的构成,而不仅仅是为它画出来。

1 个答案:

答案 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()

结果:

Un-rotated and rotated pentagons

(那就是说:唯一重复的n面多边形格子用于n = [3,4,6],唯一有问题的是3,你可以用硬编码。)