2014-10-19 272 views
2

我的教授已经要求我们班编写Python函数,它如下:Python的绘制龟图正五角星

一张端正正五角星与侧d - 在一个函数名为星(龟,N,d)

下面的代码,我到目前为止有:

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边形的星形输出一个正方形,六边形给出一个三角形,等等。

我试过多次改变角度公式,但它从来不适用于任何给定的n。

感谢您的帮助!

+0

我不认为有任何[常规星多边形(http://en.wikipedia.org/wiki/ Star_polygon#示例),边数少于5。 – martineau 2014-10-19 21:12:04

+0

我知道没有,但像6,8,10等数字不符合上述公式。 – BryanLavinParmenter 2014-10-19 21:23:15

+1

如果有偶数的边,你不需要两条断开的线? (把六角星看成两个三角形) – mdurant 2014-10-19 21:41:53

回答

-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)` 
+0

这个答案没有解决OP主要关心的问题,即“画出一个具有偶数边的恒星”。 – cdlane 2016-12-26 19:19:20

1

您可以通过使用一个GCD例行寻找coprimes和治疗失败例外画出最奇数和偶数五角星代码相同的:

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

输出例如, '红色',10

enter image description here