Python中使用turtle绘制不同边长的六角星

Using turtle in Python to draw six-pointed stars with different side lengths

希望我能解释清楚。我目前正在使用辅助函数在 python 的海龟图形 window 中绘制一个六角星。首先,我们必须创建一个函数来绘制三角形。这是我的代码:

    import turtle

    wn = turtle.Screen()
    tess = turtle.Turtle()
    tess.speed(30)


   def triangle(sz):
       for i in range(3):
         tess.fd(sz)
         tess.lt(120)

然后,我们不得不使用三角函数来绘制一个六角星。这是我的代码:

    def sixPtdStar(sz):
       triangle(sz)
       tess.lt(90)
       tess.pu()
       tess.fd(80)
       tess.rt(90)
       tess.fd(120)
       tess.pd()
       tess.rt(180)
       triangle(sz)

现在,对我来说,这一切 运行 都很顺利。但是我们对这两个函数的测试 运行 的参数是 sz = 120(所以在 shell 中我们输入 sixPtdStar(120) 并且它会 运行。但后来我们有用一个新函数绘制一排星星,然后在另一个函数中用这些星星行绘制一个 BOX 轮廓。这是我的代码:

    def rowOfStars(numInRow,sz):
        for i in range(numInRow):
           sixPtdStar(sz)
           tess.pu()
           tess.lt(90)
           tess.fd(80)
           tess.lt(90)


    def sqrOfRows(numInRow, sz):
        for i in range(4):
          rowOfStars(numInRow, sz)
          tess.rt(90)

虽然这完成了任务,但只有在 sz = 120 时才会这样做。对于我们在 rowOfStars 函数上的测试 运行,参数应该是 (6, 72) 并且对于测试运行 在 sqrOfRows 函数上,我们的参数应该是 (6, 36)。

所以我的问题是这样的。无论 sz 等于什么,我怎样才能使它工作?当我 运行 按原样(rowOfStars 为 (6, 72) 或 sqrOfRows 为 (6, 36))时,笔移动得太远,因为三角形不再那么大了。

如果需要更多信息,请告诉我!谢谢! (我正在使用 Python 3.5.2)

问题出在您的 sixPtdStar() 函数中。

def sixPtdStar(sz):
   triangle(sz)
   tess.lt(90)
   tess.pu()
   tess.fd(80) # here 
   tess.rt(90)
   tess.fd(120) # and here
   tess.pd()
   tess.rt(180)
   triangle(sz)

如果您的函数将大小作为参数,则所有涉及移动的函数(例如 forward()goto())也需要按大小缩放。以下代码应该有效:

def sixPtdStar(sz):
   triangle(sz)
   tess.lt(90)
   tess.pu()
   tess.fd((2.0/3.0)*sz) #formerly 80
   tess.rt(90)
   tess.fd(sz) #formerly 120
   tess.pd()
   tess.rt(180)
   triangle(sz)

这将确保所有向前移动都与您创建的对象的大小成比例。您需要对 rowOfStars() 函数进行类似的调整。我还注意到您的六角星并不完全对称。您可以通过将 tess.fd((2.0/3.0)*sz) 替换为 tess.fd((7.0/12.0)*sz) 来解决该问题。

任何你使用具有维度的单位的地方:

tess.fd(80)
tess.fd(120) # probably should be tess.fd(sz)
tess.fd(80)

您需要按照从 120 (sz) 到 80 时使用的任何逻辑对其进行缩放。但是,正如@wptreanor 所提到的,该逻辑略有缺陷,因为您的星星上的点不均匀:

此外,您的 rowOfStars() 例程并没有真正绘制一排星星(数学关闭,笔有时处于错误状态。)简单地修复缩放比例并不能解决这个问题。最后,在 rowOfStars() 修复之前,您的 sqrOfRows() 例程将无法运行,要使其有用,您需要调整屏幕上的起始位置以为绘图腾出空间。

下面是我对您的代码进行的修改,以解决其中的一些问题。它使用略有不同的计算方式来计算如何从完成下三角到开始上三角的位置,因此数字略有不同:

from turtle import Turtle, Screen

WIDTH_RATIO = 2 * 3**0.5 / 3  # ratio of widest point in star to edge of triangle 

def triangle(size):
    for i in range(3):
        tess.fd(size)
        tess.lt(120)

def sixPtdStar(size):
    triangle(size)
    tess.lt(30)
    tess.pu()
    tess.fd(size * WIDTH_RATIO)
    tess.lt(150)
    tess.pd()
    triangle(size)

def rowOfStars(numInRow, size):
    for i in range(numInRow):
        sixPtdStar(size)
        tess.pu()
        tess.lt(90)
        tess.fd(size * WIDTH_RATIO / 2)
        tess.lt(90)
        tess.pd()

def sqrOfRows(numInRow, size):
    tess.pu()
    halfSize = numInRow * size / 2
    tess.goto(-halfSize, halfSize)  # center on screen
    tess.pd()

    for i in range(4):
        rowOfStars(numInRow, size)
        tess.rt(90)

screen = Screen()
tess = Turtle()
tess.speed("fastest")  # numbers > 10 are all equivalent, safer to use symbols 

sqrOfRows(6, 36)

screen.exitonclick()