setworldcoordinates очищает экран от любых рисунков черепахи - PullRequest
2 голосов
/ 11 января 2020
import turtle
import math
turtleSize=1
turtle.speed(1)

turtleA=turtle.Turtle()
turtleA.shape("circle")
turtleA.shapesize(turtleSize)

screenSizeX=180
screenSizeY=3
llx=0
turtle.setworldcoordinates(llx,-screenSizeY,screenSizeX,screenSizeY)

for i in range(180):
    turtleA.goto(i,(2*math.sin(0.1*i)))
    screenSizeX=screenSizeX+1
    llx=llx+1
    turtle.setworldcoordinates(llx,-screenSizeY,screenSizeX,screenSizeY)

То, что я пытаюсь сделать, это создать черепаху, выполняющую синусоидальную функцию, однако настоящая черепаха будет выглядеть так, как будто она остается на месте, потому что каждый раз, когда черепаха движется, мировые координаты будут слегка перемещаться вместе с ней. Представьте себе змею, скользящую по телевизору, но ее голова остается в центре экрана, и камера просто движется вместе с ней. Всякий раз, когда я пытаюсь установить мировую координату после перемещения черепахи, все, что нарисовала черепаха, исчезает. Я понимаю, что это, возможно, не лучшее решение для проблемы, однако я не могу придумать ни одного лучшего.

Ответы [ 2 ]

2 голосов
/ 11 января 2020

Проблема

Как вы знаете, черепаха по умолчанию dr aws с координатой (0,0), а ваш мир по умолчанию отображается в прямоугольнике (-200, -150, 200, 150) и имеет размер 400 x 300.

Вы рисуете из исходного местоположения по умолчанию (0 + offset,0), и ваш экран отображается на
(0 + offset, -3, 180 + offset, 3).

Следовательно, последняя точка всегда dr aws в середине левая граница и все предыдущие нарисованные точки оставлены позади (каламбур). Вот почему вы не видите (симпатичный) график.

enter image description here

Решение

Требуется последняя точка ( круг) всегда должен быть нарисован в центре.

То, что вы хотели бы, выглядит примерно так:

turtle.setworldcoordinates(
    -screenWidth / 2 + point_positionX,
    -screenHeight / 2 + point_positionY,
    screenWidth / 2 + point_positionX,
    screenHeight / 2 + point_positionY
)

Где point_positionX и point_positionY - координаты последней нарисованной точки .

Позвольте мне дать вам кое-что, на что можно опираться:

'''
Graph Simulation (Limited to sine waves with amplitude 0.5 and frequency pi/180)
'''

import turtle       # For drawing graph
import math         # For calculating positions

# Initialise turtle
turtleSize = 1
turtle.speed(1)

# Initialise the sketcher
graphSketcher = turtle.Turtle()
graphSketcher.shape("circle")
graphSketcher.shapesize(turtleSize)

# Some constants
SCREEN_WIDTH = 180
SCREEN_HEIGHT = 3
AMPLITUDE = 0.5
WAVES_IN_SCREEN = 10
ANGULAR_FREQUENCY = math.pi/180

# Set the correct scale
turtle.setworldcoordinates(-SCREEN_WIDTH/2, -SCREEN_HEIGHT/2, SCREEN_WIDTH/2, SCREEN_HEIGHT/2)

for time in range(181):
    # Draw the graph
    graphSketcher.goto(
        time,
        AMPLITUDE * math.sin(2 * ANGULAR_FREQUENCY * time * WAVES_IN_SCREEN)
    )
    # move forward in time and space
    # Try commenting this to see the difference!
    turtle.setworldcoordinates(
        -SCREEN_WIDTH / 2 + time,
        -SCREEN_HEIGHT / 2,
        SCREEN_WIDTH / 2 + time,
        SCREEN_HEIGHT / 2
    )

Вам просто нужно отработать это для смещений y. Удачи!

0 голосов
/ 12 января 2020

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

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

import turtle

turtle.setup(300, 300)
# turtle.mode('world')
turtle.shape('turtle')
turtle.shapesize(5)  # make a large cursor
turtle.setheading(90)  # turtle facing upward
turtle.stamp()  # leave a lasting impression

turtle.setworldcoordinates(-150, 150, 150, -150)  # flip coordinates upsidedown

turtle.exitonclick()

Вызов setworldcoordinates(), чтобы перевернуть систему координат, также удалит штамп и сбросит размер и направление черепахи. Однако, если вы раскомментируете вызов turtle.mode('world'), это предотвратит это.

Последующие вызовы setworldcoordinates() не так разрушительны, как это видно из отличного (+1) ответа @ JaideepShekhar на ваш вопрос. Я работал с примером кода Jaideep и пришел к тому, что, как мне кажется, ближе к тому, что вы описываете:

import turtle
import math

WIDTH = 300
HEIGHT = 1.0
AMPLITUDE = 0.25
WAVES_IN_SCREEN = 10
ANGULAR_FREQUENCY = math.pi / WIDTH

turtle.setworldcoordinates(-WIDTH/2, -HEIGHT/2, WIDTH/2, HEIGHT/2)
turtle.tracer(False)

for time in range(720):
    extent = AMPLITUDE * math.sin(2 * ANGULAR_FREQUENCY * time * WAVES_IN_SCREEN)
    turtle.setposition(time, extent)
    turtle.setworldcoordinates(-WIDTH/2 + time, extent - HEIGHT/2, WIDTH/2 + time, extent + HEIGHT/2)
    turtle.update()

turtle.tracer(True)
turtle.exitonclick()

Обратите внимание, что замена порядка вызовов setposition() и setworldcoordinates() будет иметь плохой результат, несмотря на отсутствие очевидных причин не делать этого. Эта переделка имеет небольшой колчан в курсоре, поскольку знак изменения амплитуды - это не совсем неподвижно, как хотелось бы.

...