Python рисует n-конечную звезду с графикой черепахи

Мой профессор попросил наш класс написать функцию Python, которая делает следующее:

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

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

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


person BryanLavinParmenter    schedule 19.10.2014    source источник
comment
Я не думаю, что существуют правильные звездчатые многоугольники с менее чем 5 сторонами.   -  person martineau    schedule 20.10.2014
comment
Я знаю, что их нет, но такие числа, как 6, 8, 10 и т. д., не работают с приведенной выше формулой.   -  person BryanLavinParmenter    schedule 20.10.2014
comment
Если есть четное количество сторон, разве вам не нужны две несвязанные линии? (Представьте себе шестиконечную звезду как два треугольника)   -  person mdurant    schedule 20.10.2014


Ответы (3)


Вы можете нарисовать большинство нечетных и четных звезд с одним и тем же кодом, используя подпрограмму 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,'красный',10

введите здесь описание изображения

person cdlane    schedule 26.12.2016

Этот код нарисует звезду с любым количеством точек больше 5. Он принимает два аргумента: n — количество вершин, а size управляет размером шагов черепашки.

import turtle
turtle.showturtle()
turtle.shape("classic")

def turtle_star(n, size = 100):
    extent = 360 / n
    if n % 2 == 0:
        coords = []
        for a in range(0, n):
            turtle.penup()
            coords.append(turtle.pos())
            turtle.circle(size, extent)
        for b in range(0, len(coords)):
            if b % 2 == 0:
                turtle.pendown()
                turtle.goto(coords[b][0], coords[b][1])
            else:
                continue
        turtle.goto(coords[0][0], coords[0][1])
        turtle.penup()
        for c in range(0, (len(coords) + 1)):
            if c % 2 != 0:
                turtle.goto(coords[c][0], coords[c][1])
                turtle.pendown()
            else:
                continue
        turtle.goto(coords[1][0], coords[1][1])
    else:
        angle = 180 - (180 / n)
        for a in range(n):
            turtle.forward(size)
            turtle.right(angle)

turtle_star(11) (нечетное) и turtle(6) (четное), показанные ниже:

введите здесь описание изображения

введите здесь описание изображения

person jaroelfsema    schedule 09.06.2019
comment
любое количество точек больше 5 исключает нечетные числа. Для 7 и выше, как ни странно, он просто рисует линию. Похоже, в предложении else отсутствует цикл. - person cdlane; 09.06.2019

Ваша формула немного неверна:

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)`
person chabislav    schedule 23.10.2014
comment
Этот ответ не решает основную задачу ОП — нарисовать звезду с четным числом сторон. - person cdlane; 26.12.2016