#python #python-turtle
#python #python-turtle
Вопрос:
Не могли бы вы объяснить мне, почему я получаю разные рисунки после настройки количества пикселей, определяющих движения?
Например, в приведенном ниже коде я получаю это изображение (в обоих случаях number_of_angles = 3
и initial_radius = 100
):
import turtle
import math
turtle.speed(1)
turtle.shape("turtle")
number_of_angles = int(input("Number of angles? "))
initial_radius = int(input("Initial Radius? "))
sum_angle = 180*(number_of_angles-2)
angle = sum_angle/number_of_angles
Q = 180-(180/number_of_angles)/2
turtle.left(Q)
for i in range(number_of_angles):
turtle.forward(100)
turtle.left(180-angle)
turtle.done()
Но когда я пытаюсь определить количество пикселей для перемещения (вместо 100
я определяю initial_size
) Я получаю эту картинку:
import turtle
import math
turtle.speed(1)
turtle.shape("turtle")
number_of_angles = int(input("Number of angles? "))
initial_radius = int(input("Initial Radius? "))
sum_angle = 180*(number_of_angles-2)
angle = sum_angle/number_of_angles
Q = 180-(180/number_of_angles)/2
turtle.left(Q)
initial_size = initial_radius*(2*math.sin(360/(2*number_of_angles)))
for i in range(number_of_angles):
turtle.forward(initial_size)
turtle.left(180-angle)
turtle.done()
Ответ №1:
Потому что ваш расчет начального размера не равен 100.
Более конкретно, math.sin() использует радианы вместо градусов, что приводит к конечному значению -60.962124220443336. Это заставляет черепаху двигаться назад, в результате чего получается зеркальный и слегка уменьшенный треугольник.
Самое быстрое решение — преобразовать вычисление угла в радианы, прежде чем передавать его в math.sin() .
initial_size = initial_radius*(2*math.sin(math.radians(360/(2*number_of_angles))))
Ответ №2:
@sphennings правильно определяет вашу проблему ( 1), но я считаю, что есть лучшее, хотя и не самое быстрое решение. Черепахи с удовольствием работают в радианах, например, в модуле math, если вы попросите их об этом:
from turtle import Screen, Turtle
from math import pi, sin
number_of_angles = int(input("Number of angles? "))
initial_radius = int(input("Initial radius? "))
screen = Screen()
turtle = Turtle()
turtle.radians()
turtle.shape('turtle')
turtle.speed('slowest')
sum_angle = pi * (number_of_angles - 2)
angle = sum_angle / number_of_angles
Q = pi - (pi / number_of_angles) / 2
turtle.left(Q)
initial_size = 2 * initial_radius * sin(pi / number_of_angles)
for _ in range(number_of_angles):
turtle.forward(initial_size)
turtle.left(pi - angle)
screen.exitonclick()
Поскольку вы действительно используете только 180 градусов в своей логике, его легко заменить math.pi