#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()
метода.