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

2024-10-02 12:29:33 发布

您现在位置:Python中文网/ 问答频道 /正文

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

    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)

然后,我们要用三角形函数画一个六角星。这是我的代码:

^{pr2}$

现在,对我来说,一切顺利。但是我们测试这两个函数的参数是sz=120(所以在shell中我们输入sixPtdStar(120),它就会运行。但是我们必须用一个新的函数画出一排星星,然后在另一个函数中,用这些行星星画一个方框轮廓。这是我的代码:

    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是多少,我怎么能让它工作?当我按原样运行它(用(6,72)表示行星,用(6,36)表示sqrOfRows),笔移动得太远了,因为三角形不再那么大了。在

如果需要更多信息,请告诉我!谢谢!(我使用的是python3.5.2)


Tags: 函数代码inltfor参数defrange
2条回答

在任何地方使用具有尺寸的单位:

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

你需要根据你以前从120(sz)到80(sz)的逻辑来调整它。然而,正如@wptranor提到的,这种逻辑有点缺陷,因为你的星上的点是不均匀的:

enter image description here

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

下面是我为解决这些问题而重新编写的代码。它使用了一种稍微不同的计算方法来计算从完成下部三角形到开始上部三角形的位置,因此数字略有不同:

^{pr2}$

enter image description here

问题出在您的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()或{})也需要按大小缩放。以下代码应该有效:

^{pr2}$

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

相关问题 更多 >

    热门问题