希望我能够很好地解释这一点。我目前正在使用辅助函数在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)
答案 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所提到的那样,由于你的恒星上的点是不均匀的,所以逻辑略有缺陷:
另外,你的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()