在Python中使用龟来绘制具有不同边长的六角星

时间:2016-10-24 00:10:28

标签: python graphics python-3.5 turtle-graphics

希望我能够很好地解释这一点。我目前正在使用辅助函数在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)

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

    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等于什么,我怎样才能完成这项工作?当我按原样运行(对于rowOfSta使用(6,72)或对于sqrOfRows使用(6,36))时,笔移动得太远,因为三角形不再那么大。

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

2 个答案:

答案 0 :(得分:0)

问题出在您的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)来解决此问题。

答案 1 :(得分:0)

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

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

你需要根据你曾经从120(sz)到80的逻辑来扩展它。然而,正如@wptreanor所提到的那样,由于你的恒星上的点是不均匀的,所以逻辑略有缺陷:

enter image description here

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

以下是我对代码的修改,以解决其中一些问题。它使用略微不同的计算方法,从完成下部到开始上三角形的位置,所以数字略有不同:

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()

enter image description here