Drawing polygon with n number of sides in Python 3.2
我必须用python编写一个程序,读取n值并在屏幕上绘制n个边的多边形。我可以使用Turtle图形模块或graphics.py模块。
当n=你输入的点数,然后在屏幕上点击n次,我知道如何画一个多边形,但是我对如何将许多边转换成多边形有一些困难。
这是我对n个点的多边形的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 | def newPolygon(self,cmd): p = eval(input("how many points")) print("click",p,"times") num = [] for i in range(p): vertices = self.win.getMouse() num.append(vertices) poly = Polygon(num) poly.setFill(self.color) poly.draw(self.win) self.figs.append(poly) |
这不是程序的全部代码(384行)。这只是程序的一部分,其中draw polygon函数是self.figs=[],一个已绘制图形的列表。
我假设你想要的是一种生成等边多边形坐标的方法,你可以把它输入你的绘图程序。我不确定您使用的是哪个库,所以我将坚持使用成对值的列表:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | import math def polygon(sides, radius=1, rotation=0, translation=None): one_segment = math.pi * 2 / sides points = [ (math.sin(one_segment * i + rotation) * radius, math.cos(one_segment * i + rotation) * radius) for i in range(sides)] if translation: points = [[sum(pair) for pair in zip(point, translation)] for point in points] return points |
有一个公平的一点在那里进行,所以我会讨论它。基本方法是扫出一个圆,并在上面放置等距的点。这些将是多边形的点,从12点钟的位置开始。
首先要做的是从中心向外计算出每个楔形物的角度(以弧度为单位)。一个圆的弧度总数是2pi,所以我们的值是每段2pi/
在那之后,一些基本的三角学给了我们一些观点(https://en.wikipedia.org/wiki/trigonometry扩展了的定义)。在这一点上,我们按所需的半径缩放,并有机会将旋转偏移一个固定的量。
之后,我们将值转换一定量,因为您可能希望多边形位于屏幕的中心,而不是角落。
几个例子
1 2 3 4 5 6 7 8 9 10 11 | print polygon(5) # A unit pentagon # [(0.0, 1.0), (0.9510565162951535, 0.30901699437494745), (0.5877852522924732, -0.8090169943749473), (-0.587785252292473, -0.8090169943749476), (-0.9510565162951536, 0.30901699437494723)] print polygon(4, 100) # A square, point up, 100 from the center to the points # [(0.0, 100.0), (100.0, 6.123233995736766e-15), (1.2246467991473532e-14, -100.0), (-100.0, -1.8369701987210297e-14)] print polygon(4, 2, math.pi / 4, [10, 10]) # A flat square centered on 10, 10 # [[11.414213562373096, 11.414213562373096], [11.414213562373096, 8.585786437626904], [8.585786437626904, 8.585786437626904], [8.585786437626904, 11.414213562373094]] |
正如您所看到的,这些都是浮动的,所以您可能需要在使用它们之前将它们挤压成整数。
我不知道这是否有帮助,但要使用边数和长度定义多边形,我将使用我的代码:
1 2 3 4 5 6 7 8 9 | import turtle as t def polygon(n,l): f = (n - 2) * 180/n for i in range(n): t.forward(l) t.right(180 - f) polygon() |
在这种情况下,
这花了我相当长的一段时间,因为我只有13岁,我没有进步,但这是一个有趣的项目!