2014-10-19 271 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