2014-10-19 3 views
2

Моего профессор попросил наш класс, чтобы написать функцию Python, которая делает следующим образом:Python привлечь н-звезду с черепахой графикой

Нарисуйте регулярную н-пятиконечную звезду с боковым д - в функцию с именем звезд (черепаха , п, 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-стороннюю звезду, выдает квадрат, 6-сторонний дает треугольник и т. Д.

Я пробовал изменять формулу угла много раз, но она никогда не работает ни с каким n.

Спасибо за помощь!

+0

Я не думаю, что есть [регулярная звезда многоугольники] (http://en.wikipedia.org/wiki/ Star_polygon # Примеры) с менее чем 5 сторонами. – martineau

+0

Я знаю, что нет, но числа, подобные 6, 8, 10 и т. Д., Не работают с приведенной выше формулой. – BryanLavinParmenter

+1

Если есть четное число сторон, вам не нужны две отключенные линии? (Подумайте о шестиконечной звезде как о двух треугольниках) – mdurant

ответ

-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

1

Вы можете сделать большинство из нечетных и даже указывали звезды с тем же кодом, используя процедуру НОД искать 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) 
> 

Пример вывода для аргументов 200, 'красный', 10

enter image description here

Смежные вопросы