Почему мой рисунок черепахи создает разные изображения в зависимости от того, как я настраиваю количество пикселей?

#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