Круги не выровнены/симметричны , черепаха питон

#python #turtle-graphics #python-turtle

Вопрос:

Я вижу, что положение и угол курсора черепахи верны после каждого круга, но, похоже, при рисовании последнего круга наблюдается смещение. Кажется, я не могу понять, как избавиться от смещения.

 import turtle import math window = turtle.Screen() window.bgcolor('cyan')  loop = 90 angle = 4 step = 8 c = loop * step r = ((c/2)/(math.pi)) d = c/(math.pi) the_turtle = turtle.Turtle() the_turtle.speed(500) print(the_turtle.heading()) print(the_turtle.position())  for x in range(loop):   the_turtle.forward(step)  the_turtle.left(angle)  print(the_turtle.heading()) the_turtle.penup() the_turtle.setposition(0,r) the_turtle.pendown() print(the_turtle.position())  for x in range(loop):  the_turtle.forward(step)  the_turtle.left(angle)  the_turtle.left(180) print(the_turtle.heading()) the_turtle.penup() the_turtle.setposition(0,r) the_turtle.pendown() print(the_turtle.position())  for x in range(loop):  the_turtle.forward(step)  the_turtle.left(angle)  turtle.exitonclick()  

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

Комментарии:

1. Не могли бы вы, пожалуйста, объяснить свой код немного подробнее? Что он должен делать и что он делает не так? Для меня черепаха рисует 3 круга. Предполагается ли, что это должно рисовать их рядом друг с другом, или что-то еще не так?

2. Похоже, изображение, которое я прикрепил, не сработало. Пожалуйста, посмотрите ссылку ниже, она показывает вам, как рисуется мой код. i.stack.imgur.com/VfQu3.png

3. используется print() для просмотра значений в переменных. Возможно, у вас есть значения с плавающей точкой, и это создает проблему. Или вы используете неправильное значение для последнего круга

4. проблема в том, что вы рисуете в другом направлении, и для этого нужно, чтобы первые круги рисовали первую линию справа от 0 до 8, но последний круг рисовал первую линию слева от 0 до -8. Ему нужна the_turtle.backward(step) предпоследняя цирцея, и он нарисует первую линию от 8 до 0 — она будет на том же месте, что и в других кругах. Кстати: вероятно, если вы попытаетесь нарисовать прямоугольник, вам лучше будет увидеть эту проблему

Ответ №1:

Проблема в том, что вы рисуете последний круг в другом направлении — поэтому первый и второй круги рисуют первую линию справа от 0 до 8, но последний круг рисует первую линию слева от 0 до -8.

Ему нужна the_turtle.backward(step) предпоследняя цирцея, и он нарисует первую линию от 8 до 0 — так что он будет в том же месте, что и в других кругах.

Кстати: вероятно, если вы попытаетесь нарисовать прямоугольники, вам лучше будет увидеть эту проблему.


 import turtle import math  window = turtle.Screen() window.bgcolor('cyan')  loop = 90 angle = 360/loop  step = 8  c = loop * step r = ((c/2)/(math.pi)) d = c/(math.pi)  the_turtle = turtle.Turtle() the_turtle.speed(500)  print(the_turtle.heading()) print(the_turtle.position())  for x in range(loop):   the_turtle.forward(step)  the_turtle.left(angle)  print(the_turtle.heading()) the_turtle.penup()  the_turtle.setposition(0, r) the_turtle.pendown() print(the_turtle.position())  for x in range(loop):  the_turtle.forward(step)  the_turtle.left(angle)  the_turtle.left(180) print(the_turtle.heading()) the_turtle.penup() the_turtle.setposition(0, r) the_turtle.pendown() print(the_turtle.position())  the_turtle.backward(step) # lt;----  for x in range(loop):  the_turtle.forward(step)  the_turtle.left(angle)  turtle.exitonclick()  

Чтобы нарисовать его без backward() вас, вам придется сначала сделать полшага, затем 359 полных шагов и, наконец, полшага.

 import turtle import math  # --- functions ---  def circle(loop, step, angle):  # half step  the_turtle.forward(step//2)  the_turtle.left(angle)   # 359 full steps  for x in range(loop-1):   the_turtle.forward(step)  the_turtle.left(angle)   # half step  the_turtle.forward(step//2)   # --- main ---  window = turtle.Screen() window.bgcolor('cyan')  loop = 90 angle = 360/loop  step = 8  c = loop * step r = ((c/2)/(math.pi)) d = c/(math.pi)  the_turtle = turtle.Turtle() the_turtle.speed(500)  print(the_turtle.heading()) print(the_turtle.position())  circle(loop, step, angle)   print(the_turtle.heading()) the_turtle.penup() the_turtle.setposition(0, r) the_turtle.pendown() print(the_turtle.position())  circle(loop, step, angle)   the_turtle.left(180) print(the_turtle.heading()) the_turtle.penup() the_turtle.setposition(0, r) the_turtle.pendown() print(the_turtle.position())  circle(loop, step, angle)   turtle.exitonclick()  

Ответ №2:

Мне кажется, мы можем значительно упростить ситуацию, если представим два соседних круга как одну восьмерку:

 from turtle import Screen, Turtle from math import pi  steps = 90 step_size = 8 angle = 360 / steps  circumference = steps * step_size diameter = circumference / pi radius = diameter / 2  screen = Screen() screen.bgcolor('cyan')  turtle = Turtle() turtle.speed('fastest')  for _ in range(2):  for _ in range(steps):  turtle.forward(step_size)  turtle.right(angle)   angle = -angle  turtle.penup() turtle.sety(radius) turtle.pendown()  for _ in range(steps):  turtle.forward(step_size)  turtle.right(angle)  turtle.hideturtle() screen.exitonclick()  

В качестве побочного эффекта это рисует фигуру, центрированную вертикально на окне, в отличие от оригинала. Кроме того, мы можем вычислять angle , а не использовать константу. И найдите допустимые аргументы speed() метода.

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