【问题标题】:How to set my screen boundaries on a turtle drawing如何在海龟绘图上设置我的屏幕边界
【发布时间】:2018-01-02 14:27:09
【问题描述】:

我在这里有一组代码,每次运行代码时我都会使用它来生成唯一的图像;如何将其设置为仅在 tkinter 屏幕的边界内绘制?

代码如下:

import random
import turtle
maker=turtle.Turtle()
maker.getscreen().delay(0)
maker.getscreen().tracer(0)
n=random.randint(1,360)
m=random.randint(0,100)
r=random.randint(0,50)
d=random.randint(1,2)
maker2=maker.clone()
maker3=maker.clone()
maker4=maker.clone()
maker.goto(0,0)
maker2.goto(0,0)
maker3.goto(0,0)
maker4.goto(0,0)
#top right
maker.goto(50, 50)
#bottom right
maker2.goto(50, -50)
#bottom left
maker3.goto(-50, -50)
#top left
maker4.goto(-50, 50)
while r<50:
    for i in range (0,m):
        maker.forward(m)
        maker2.forward(m)
        maker3.backward(m)
        maker4.backward(m)
        for i in range (0,r):
            if d == 1: 
                maker.right(n)
                maker2.right(n*-1)
                maker3.left(n*-1)
                maker4.left(n)
            elif d == 2:
                maker.left(n)
                maker2.left(n*-1)
                maker3.right(n*-1)
                maker4.right(n)
        maker.forward(m)
        maker2.forward(m)
        maker3.backward(m)
        maker4.backward(m)
    n=n+1
    r = r + 1
    n=random.randint(0,359)
maker.goto(0,0)
maker2.goto(0,0)
maker3.goto(0,0)
maker4.goto(0,0)
turtle.exitonclick() 

【问题讨论】:

  • 您可以获得当前位置和“添加”值,您将在forward 中使用(也使用anglesin()cos())在移动之前获取目标位置。然后你可以检查目的地是否在束缚中。如果不是,则跳过移动或在forward 中使用较小的值。
  • 如果您注意到,代码本身并没有一遍又一遍地绘制相同的东西,因为它会随机设置自己的方向和前进值,我无法设置更短的“前进” ' 并且实际上仍将其保留在屏幕中,因为它可能会选择仅前进多次相同的数字。方向值不会使它转动;等等我也希望将窗口设置为 tkinter 屏幕值,而不是设置的像素数,所以在不同的计算机上,这可能会有所不同。我想让它知道,如果它碰到画布的边缘,它需要达到另一个值并以其他方式转动。怎么样?
  • 移动的随机性无关紧要-您可以在使用forward()之前获取m并计算dx = m*sin(angel)dy = m*cos(angle)并添加到当前位置x,y = pos() ; x += dx ; y += dy以获得目的地位置。您还可以随时获取画布大小(canvas['width']canvas['height'])并检查x,y 是否仍在画布中。
  • 谢谢;检查画布并在另一个 if 语句中运行整个循环可能会起作用。
  • 将绘图(大部分)保留在画布的可见部分的一种简单方法是创建一个函数,在移动每个海龟后对其进行测试,如果它离中心太远,移动它朝向中心。例如,如果海龟是t,您可以使用x, y = t.position() if abs(x) &gt; width or abs(y) &gt; height: t.goto(x / 2, y / 2)。但是,这会使许多图形非常密集,因此您需要减小某些参数的范围。

标签: python tkinter turtle-graphics


【解决方案1】:

由于在完成之前您不会显示绘图,因此一个简单的解决方法是进行移动,检查移动是否将您带出画布,如果是,只需撤消该移动:

from random import randint, choice
from turtle import Turtle, Screen

screen = Screen()
screen.tracer(0)

width, height = screen.window_width() - 30, screen.window_height() - 30  # -30 to account for window borders, etc.

maker1 = Turtle(visible=False)
maker2 = maker1.clone()
maker3 = maker1.clone()
maker4 = maker1.clone()

maker1.goto(50, 50)  # top right
maker2.goto(50, -50)  # bottom right
maker3.goto(-50, -50)  # bottom left
maker4.goto(-50, 50)  # top left

n = randint(1, 360)
m = randint(0, 100)
r = randint(0, 50)
d = choice([True, False])

def out_of_bounds(turtle):
    return not (-width//2 < turtle.xcor() < width//2 and -height//2 < turtle.ycor() < height//2)

while r < 50:
    for i in range(0, m):

        maker1.forward(m)
        maker2.forward(m)
        maker3.backward(m)
        maker4.backward(m)

        if any(out_of_bounds(turtle) for turtle in screen.turtles()):
            for turtle in screen.turtles():
                turtle.undo()

        if d:
            maker1.right(r * n)
            maker2.right(-r * n)
            maker3.left(-r * n)
            maker4.left(r * n)
        else:
            maker1.left(r * n)
            maker2.left(-r * n)
            maker3.right(-r * n)
            maker4.right(r * n)

        maker1.forward(m)
        maker2.forward(m)
        maker3.backward(m)
        maker4.backward(m)

        if any(out_of_bounds(turtle) for turtle in screen.turtles()):
            for turtle in screen.turtles():
                turtle.undo()

    r += 1
    n = randint(0, 359)

screen.update()
screen.exitonclick()

我同意@PM2Ring 关于调整图像密度的观点(以上不是示例,但您很快就会看到)。

【讨论】:

  • 我知道我刚刚用你刚刚发布的代码标记了这个问题,但不幸的是,我需要继续解决它。我用该代码进行了一些测试,但它实际上无法正常工作。某些方式,在某些情况下,它已经更改了代码,因此它不再在每次运行时为画布的四个角中的每一个执行完全相同的图像,这是目标,因此它会形成一个连续的图案。我可以看到你的看起来是对称的,但我的四个测试中有两个没有。图片来了。
  • 由于某种原因无法上传图片。
  • @fantascey,我相信我已经修改了我的代码来纠正这个问题——再试一次。我真的很喜欢受约束的代码创建的图像。
  • 是的,我花了一段时间才弄到它,但我真的在玩我能做的一切,以及如何让电脑自己创作艺术。
  • 这看起来确实很正确。在 3 次测试运行中,我的四个角都没有错误。然而,就线路而言,我确实有一个设置了非常多的循环,我想知道它。就图像而言,我确实曾尝试将输出保存为 .png 文件,但有一个我需要的模块无法正常运行。我很想保存它们,但是当我编写 .png 文件时,它会覆盖它们,除非我也可以将每个新文件保存在另一个数字索引下。没有把握。无论如何,谢谢你。
猜你喜欢
  • 1970-01-01
  • 2021-11-25
  • 1970-01-01
  • 2021-12-23
  • 2020-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多