在Python 3.2中绘制具有n个边的多边形

在Python 3.2中绘制具有n个边的多边形,python,polygon,turtle-graphics,Python,Polygon,Turtle Graphics,我必须用Python编写一个程序,读取值n并在屏幕上绘制一个n边的多边形。我可以使用turtle graphics模块或graphics.py模块 我知道当n=输入的点数时如何绘制多边形,然后在屏幕上单击n次,但我在如何将多条边转换为多边形方面遇到了一些困难 以下是我为n个点的多边形编写的代码: def newPolygon(self,cmd): p = eval(input("how many points")) print("click",p,"times") num

我必须用Python编写一个程序,读取值n并在屏幕上绘制一个n边的多边形。我可以使用turtle graphics模块或graphics.py模块

我知道当n=输入的点数时如何绘制多边形,然后在屏幕上单击n次,但我在如何将多条边转换为多边形方面遇到了一些困难

以下是我为n个点的多边形编写的代码:

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=[],一个绘制图形的列表

我假设您想要的是一种生成等边多边形坐标的方法,您可以将该坐标输入到绘图程序中。我不确定您使用的是哪一个库,因此我将坚持使用成对值的列表:

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
这里面有很多事情,所以我会好好谈谈。基本方法是扫出一个圆,并在其上放置
n
等间距点。这些将是多边形的点,从12点钟位置开始

首先要做的是计算出每个楔块从中心向外的角度(弧度)。一个圆的总弧度是2π,因此我们的值是每段2π/
n

在那之后,一点基本的trig会给我们分数()。在这一点上,我们按所需的半径进行缩放,并有机会以固定的量抵消旋转

之后,我们将值转换一定量,因为您可能希望多边形位于屏幕的中心,而不是角落

几个例子

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]]

如您所见,这些都是浮点数,因此在使用它们之前,您可能需要将它们压缩为整数。

我不知道这是否有帮助,但要使用边数和长度定义多边形,我将使用我的代码:

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()
在这种情况下,
n
将是边的数量,l将是边的长度


这花了我相当长的时间,因为我只有13岁,并不先进,但这是一个有趣的项目

你应该使用
int(输入(…)
-“
eval
是邪恶的”提示:海龟可能是更容易的方法,因为这样你可以通过N次“向前移动,然后旋转X度”来绘制多边形。唯一困难的部分是找出X应该是什么。@Kevin对于我来说,拥有一支带有方向和相对运动的笔总是听起来更复杂、更无意。在这种情况下,它实际上可能有点帮助。@Kevin我不知道如何计算角度。我不应该要求用户输入学位。在这种情况下,文章可能对您有用。简单而优雅。谢谢此功能是否正常工作?它真的生成等边多边形坐标吗?我正在检查Euqlidean距离(通过
math.sqrt((x1-x2)**2+(y1-y2)**2)
它显示了不同分段的不同长度。我已经对它进行了快速检查,我认为是这样。确保x1和x2来自连续点非常重要。所有点与中心的距离相等,但如果穿过多边形,则彼此之间的距离不同。当然,存在一些浮点噪声。