问题描述
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)
按照标题中的要求,问题是:如何使用乌龟制作六边形的星星,三角形的大小不同?
解决方法
我看到的问题是您正在用龟在一个顶点绘制第一个三角形。绘制这个三角形很简单,但是您不知该从哪里开始绘制下一个三角形。在这种情况下,我将更改设计以绘制以乌龟为中心的三角形。然后,绘制第二个三角形只是在稍微旋转乌龟之后重新开始的问题:
from turtle import Screen,Turtle
def triangle(side):
tess.pendown()
for _ in range(3):
tess.forward(side)
tess.left(120)
tess.penup()
def sixPtdStar(side):
height = side * 3**0.5 / 2 # equilateral triangle
for _ in range(2):
tess.right(30)
tess.forward(2 * height / 3)
tess.left(90 + 60)
triangle(side)
tess.right(90 + 60)
tess.backward(2 * height / 3)
tess.right(30)
tess = Turtle()
tess.penup()
tess.dot() # mark the center of our star
sixPtdStar(100)
screen = Screen()
screen.exitonclick()
每当我尝试绘制居中图形时,我都使用tess.dot()
作为调试辅助工具来知道该中心在哪里,这样我就可以直观地检查自己是否做对了:
仍然使乌龟处于图形中心的另一种方法是将对中工作推入triangle()
并保持sixPtdStar()
简单。一种方法是使用乌龟自己的circle()
函数绘制三角形:
def triangle(side):
height = side * 3**0.5 / 2 # equilateral triangle
radius = 2 * height / 3
# center the circle on tess' position
tess.right(90)
tess.forward(radius)
tess.left(90)
tess.pendown()
tess.circle(radius,steps=3)
tess.penup()
# return tess to where she started
tess.left(90)
tess.forward(radius)
tess.right(90)
def sixPtdStar(side):
triangle(side)
tess.right(60)
triangle(side)
如果我们专注于使用circle()
绘制三角形,而又不在乎将其居中放置在乌龟的当前位置上,那么我们可以简单地做到:
def triangle(radius):
tess.pendown()
tess.circle(radius,steps=3)
tess.penup()
def sixPtdStar(side):
radius = side * 3**0.5 / 3 # equilateral triangle
triangle(radius)
tess.circle(radius,extent=60)
triangle(radius)
保持triangle()
与上面相同,我们将更改sixPtdStar()
从绘制两个重叠三角形改为改为在一个圆中绘制六个三角形:
def sixPtdStar(side):
radius = side * 3**0.5 / 3 # equilateral triangle
for _ in range(6):
triangle(radius / 3)
tess.circle(radius,extent=60)
或者,如果我们想要一颗特别优雅的星星,请将radius / 3
更改为radius / 2
可得到: