我的教授要求我们的班级编写一个Python函数,其功能如下:
在名为star(turtle,n,d)的函数中绘制一个带有d - 的常规n角星
这是我到目前为止的代码:
def star(turtle, n, d):
angle = (180-((180*(n-2))/n))*2
for i in range(n):
t.forward(d)
t.left(angle)
return angle
我遇到的问题是我的功能只能绘制奇数角(5,7,9边星)的星星。当我要求它绘制一个具有偶数边的星形时,它输出边长为n / 2的多边形。所以要求绘制一个8边形的星形输出一个正方形,6边形给出一个三角形,等等。
我已尝试多次改变角度公式,但它从不适用于任何给定的n。
感谢您的帮助!
答案 0 :(得分:1)
通过使用GCD例程查找互质并将失败视为例外,您可以使用相同的代码绘制大多数奇数和偶数明星:
import sys
import turtle
from time import sleep
def gcd(a, b):
while b != 0:
a, b = b, a % b
return a
def normal_star(size, color, points):
if points <= 4:
raise ValueError('Not enough points')
turtle.color(color)
for coprime in range(points // 2, 1, -1):
if gcd(points, coprime) == 1:
print("({},{})".format(points, coprime), file=sys.stderr)
start = turtle.position()
for _ in range(points):
turtle.forward(size)
turtle.left(360.0 / points * coprime)
turtle.setposition(start)
return
abnormal_star(size, color, points)
def abnormal_star(size, color, points):
# deal with special cases here
print("Exception:", points, file=sys.stderr)
for points in range(5, 20):
turtle.reset()
normal_star(200, 'red', points)
sleep(5)
turtle.exitonclick()
对于从5到20的点,这只能找到6的解决方案,你需要将其视为异常,即专门的代码或只是让用户知道它是你无法处理的异常:
> python3 test.py
(5,2)
Exception: 6
(7,3)
(8,3)
(9,4)
(10,3)
(11,5)
(12,5)
(13,6)
(14,5)
(15,7)
(16,7)
(17,8)
(18,7)
(19,9)
(20,9)
>
参数200的输出示例,'red',10
答案 1 :(得分:0)
此代码将绘制点数大于5的星形。
def star(size, points):
t.speed(-1)
t.setheading(0)
ext = 360 / points
if points % 2 == 0:
coords = []
for a in range(0, points):
t.penup()
coords.append(t.pos())
t.circle(size, ext)
for b in range(0, len(coords)):
if b % 2 == 0:
t.pendown()
t.goto(coords[b][0], coords[b][1])
else:
continue
t.goto(coords[0][0], coords[0][1])
t.penup()
for c in range(0, (len(coords) + 1)):
if c % 2 != 0:
t.goto(coords[c][0], coords[c][1])
t.pendown()
else:
continue
t.goto(coords[1][0], coords[1][1])
else:
angle = 180 - (180 / points)
t.forward(size)
t.right(angle)
答案 2 :(得分:0)
jaroelfsema。 您的代码适用于具有偶数边的星星。如果您记得在else异常中添加for循环,则代码的工作面也可能是奇数个。 def应该像这样结束:
else:
angle = 180 - (180 / points)
for a in range(points):
t.forward(size)
t.right(angle)
做得很好。我已经寻找了一段时间了。将s = turtle.Screen()和s.exitonclick()添加到代码中,让turtlewindow等待,而不仅仅是在Windows中使用turtle对我们关闭,也将很不错。但总的来说:老兄,对您表示敬意。
答案 3 :(得分:-1)
你的公式有点不对:
def star(turtle, n, d):
for i in range(n):
angle = 180.0 - 180.0 / n
turtle.forward(d)
turtle.right(angle)
turtle.forward(d)`