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)
我正在尝试创建一个具有正弦函数的乌龟,但是实际的乌龟看起来好像仍然在原地,因为每次乌龟移动时,世界坐标都会随之移动。试想一下,一条蛇在电视上slit绕,但其头部仍在屏幕的中央,而相机也随之移动。每当移动乌龟后尝试设置世界坐标时,乌龟绘制的所有内容都会消失。我意识到这可能不是应对挑战的最佳解决方案,但是我想不到更好的解决方案。
答案 0 :(得分:2)
如您所知,默认情况下,乌龟从坐标(0,0)
绘制,并且您的世界默认在矩形(-200, -150, 200, 150)
中渲染,大小为400 x 300
。
您正在从默认的原位置(0 + offset,0)
进行绘制,并且屏幕呈现为
(0 + offset, -3, 180 + offset, 3)
。
因此,最后一点总是绘制在左边框的中间,而所有先前绘制的点都留在后面(双关语是意图)。这就是为什么您看不到(漂亮)图形的原因。
您希望最后一个点(圆)总是在中心绘制。
您想要的是这样的
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偏移量即可。祝你好运!
答案 1 :(得分:0)
每当我移动坐标系后尝试设置世界坐标时 乌龟,乌龟画的一切都消失了。
对setworldcoordinates()
的 first 调用可能会破坏当前的乌龟状态,因此,我始终建议您在程序中尽早调用它。例如:
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()
的破坏性不如@JaideepShekhar对您的问题的出色(+1)回答所示。我已经处理了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()
的顺序将产生不好的结果,尽管没有明显的理由不这样做。当幅度改变符号时,此返工在光标中略有 quiver 。它并不是按要求的那样完全静止。