如果您是一名涂鸦者,那么您肯定曾在生活中的某个时刻涂鸦过五角星或大卫之星。
也许你们中的一些人还尝试添加更多线条来绘制更复杂的星星。你知道这些星星也有名字吗?
无论如何,我认为尝试用 Python 绘制这些星星可能会很有趣。所以让我们开始绘制这些多边形
星星是多边形吗?
原来上面的星星是一类叫做复杂多边形的多边形。基本上,与普通多边形相反,这些线在复杂多边形中彼此相交
星形多边形是一种复杂的多边形。并且有两种类型。你一定已经意识到,要在一张纸上画大卫之星,你必须举起你的笔,但你不必这样做来画五角星。前一种类型的恒星称为规则星形多边形,而后一种类型称为退化星形多边形
规则星多边形的规则
正如您在上面可能已经注意到的,我们可以通过多种方式绘制具有一定数量顶点的星形。例如,您可以绘制一个具有 9 个顶点的星形多边形,如下所示:
要了解发生了什么,请计算上述每个图中跳过的顶点数。还要注意,当跳过 2 个顶点时,恒星是退化的,而在其他情况下,恒星是规则的。您可以尝试跳过更多顶点,但最终会绘制相同的星星。
以下是对我们有用的规则和公式
- 对于带有N顶点的星星,您可以绘制abs(N/2)-1星星
例如,对于具有 9 个顶点的星星,您只能绘制abs(9/2)-1=3星星
- 星的顺序M可以定义为跳过的顶点数+1。
因此,对于 1、2 和 3 个顶点分别跳过的 9 顶点星的可能顺序是 2、3 和 4
- 如果N被 整除M,则恒星退化
恒星的外角
在我们追踪恒星之前,我们需要知道角度,特别是外角。这是为了知道每次向前移动后乌龟转动多少。我们不会严格地推导出公式,而只会尝试理解以下内容:
当海龟从一个点开始,绕一圈然后返回时,总是转一圈360度(也是多边形外角和=360度的原因)
在星星的情况下,海龟执行多次完整旋转
旋转的次数等于星的阶数—— M
因此,恒星的外角和为 360M
这意味着对于具有N顶点的每个外角的规则星=360M/N
希望这足够有说服力
废话不多说让我们画画
现在我们了解了我们最喜欢的涂鸦,我们准备在 Python 乌龟中对其进行编码。请注意,转弯角度设置为我们刚刚讨论的
import turtle as t
LENGTH=500
def regular_star(n,m):
"""Draws a regular star polygon (not a degenerate one)
n = number of pointies
m = number of points to skip
"""
angle = 360*m/n
for count in range(n):
t.forward(LENGTH)
t.right(angle)
t.hideturtle()
t.pensize(2)
t.color("green")
regular_star(103,51)
上面的代码只绘制了任何规则的星形多边形(不用提笔就可以绘制的那个)。我们将留到另一个帖子来画一颗退化的星星
这是一颗 103 尖的星星
耶!