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

10

我需要用Python编写一个程序,读取值n并在屏幕上绘制一个n边形。我可以使用turtle图形模块或者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行)。这只是程序中绘制多边形函数的部分,其中self.figs是一个已绘制图形的列表。


你应该使用int(input(...)) - "eval是邪恶的" - jonrsharpe
2
提示:使用海龟绘图可能是更简单的方法,因为你可以通过执行“前进,然后以X度旋转” N次来绘制多边形。唯一困难的部分是找出X应该是多少。 - Kevin
@Kevin 对我来说,拥有一个带有方向和相对移动的笔听起来更加复杂和无意义。但在这种情况下,可能会有一些帮助。 - danijar
@Kevin 我不知道如何计算角度。我不应该要求用户输入角度。 - Goose LaMoose
1
在这种情况下,这篇文章可能对您有用。 - Kevin
2个回答

11

我猜你想要的是一种生成等边多边形坐标的方法,以便将其提供给你的绘图程序。我不确定你使用的是哪个库,所以我会使用一些成对数值的列表:

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

之后进行一些基本的三角函数运算,就可以得到我们的点(https://en.wikipedia.org/wiki/Trigonometry#Extending_the_definitions)。此时,我们按照所需的半径进行缩放,并有机会通过固定量来偏移旋转。

之后,我们将这些值平移一定量,因为您可能希望将多边形放在屏幕中央,而不是在角落里。

几个例子

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

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


简单而优雅。谢谢! - Itay
这个函数是否正常工作?它真的可以生成“等边多边形坐标”吗?我正在检查欧几里得距离(通过math.sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2)),但对于不同的线段长度显示出不同的结果。 - Chiefir
我已经快速检查过了,我认为没问题。确保你的x1和x2来自连续的点非常重要。所有的点距离中心点相等,但如果你穿越多边形,它们之间并不等距。当然有一些浮点噪声。 - Jon Betts

1

我不知道这是否有帮助,但如果要使用边数和长度定义多边形,则可以使用以下代码:

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岁,不是很高级,但这是一个有趣的项目!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接