【问题标题】:Turtle inner circle boundary in pythonpython中的乌龟内圈边界
【发布时间】:2016-12-12 06:46:30
【问题描述】:

好吧,我整天都在做这件事,但一点头绪都没有。我需要让我的海龟对象在圆的画出随机线。

我之前编写了将随机线限制在边界内的代码,所以我认为我所要做的就是更改符号,但这不起作用。我不允许使用坐标几何 - 它必须是更基本的东西......

这是我当前格式的代码:

import turtle, random
mRoshi = turtle.Turtle()

def draw_any_shape(myTurtle, sideLength, numSides):
    turnAng = 360/numSides
    for i in range(numSides):
        myTurtle.forward(sideLength)
        myTurtle.right(turnAng)

def drawCircle(myTurtle, radius, startX, startY):
    circumference = 2*3.1415*radius
    sideLength = circumference/360
    myTurtle.penup()
    myTurtle.goto(startX, startY)
    #myTurtle.dot()
    myTurtle.goto(startX, startY+radius)
    myTurtle.pendown()
    draw_any_shape(myTurtle, sideLength, 360)


def stumblingTurtle(myTurtle, radius, startX, startY, paramN5):
    circumference = 2*3.1415*radius
    myTurtle.speed(6)
    drawCircle(myTurtle, radius, startX, startY)
    myTurtle.penup()
    for i in range(paramN5):
        drx = random.randint(-800, 800)
        drw = random.randint(-800, 800)
        if (drx**2 + drw**2) > radius**2:
            myTurtle.goto(drx,drw)
        crx = random.randint(-800, 800)
        crw = random.randint(-800, 800)
        xdif = crx-drx
        ydif = crw-drw
        for j in range(drx, crx):
            for k in range(drw, crw):
                if (xdif**2 + ydif**2) > radius**2:
                    myTurtle.goto(crx,crw)

【问题讨论】:

    标签: python-3.x turtle-graphics


    【解决方案1】:

    这是你想要的吗?它也基于最初kept the turtle within a circle 的代码。它使用 Python3 乌龟的 undo 能力让乌龟意外地游走在圆圈中,然后像从未发生过一样撤消该意外:

    import turtle
    import random
    
    RADIUS = 50
    MAXIMUM_TURN = 45
    STEP_SIZE = 10
    BORDER = 20
    
    def bounded_random_move():
    
        yertle.forward(STEP_SIZE)
    
        x, y = yertle.position()
    
        if (x * x + y * y) < RADIUS * RADIUS or x < -window_width/2 or x > window_width/2 or y < -window_height/2 or y > window_height/2:
            yertle.undo()  # undo misstep
            turn = random.randint(180 - MAXIMUM_TURN, 180 + MAXIMUM_TURN)
            yertle.left(turn)
    
        turtle.ontimer(bounded_random_move, 100)
    
    turtle.setup(RADIUS * 10, RADIUS * 10)
    
    window_width = turtle.window_width() - BORDER
    window_height = turtle.window_height() - BORDER
    
    magic_marker = turtle.Turtle(visible=False)
    magic_marker.penup()
    magic_marker.color("red")
    magic_marker.sety(-RADIUS)
    magic_marker.pendown()
    magic_marker.circle(RADIUS)
    
    yertle = turtle.Turtle(shape="turtle", visible=False)
    yertle.speed("fastest")
    yertle.penup()
    yertle.goto(RADIUS * 2, RADIUS * 2)  # start outside circle
    yertle.pendown()
    yertle.showturtle()
    
    turtle.ontimer(bounded_random_move, 100)
    
    turtle.exitonclick()
    

    但是,我的撤消技巧可能对每个人都不够严格。

    【讨论】:

    • 好的,我喜欢你所做的,但是,当我尝试调整你的代码以适应我的(用于作业)时,它仍然交叉。也许我过于简单化了,但我所做的只是在 crw 之后删除所有内容,然后添加您的第一个 if 条件(我无法让代码在 cmets 中正确显示)。
    • 你能给我解释一下你的 bounded_random_move 函数吗?
    • @PolitEcon2016,bounded_random_move() 函数朝着当前方向迈出了一步。它测试这是否不是一个好主意(即我们是进入圆圈还是离开窗口的边界)。如果这是一个坏主意,它会撤消它(将它的位置放回移动之前)并进行 U 形转弯(但不会向前移动。)无论移动的好坏,它都会进行额外的轻微转弯(绊脚石效果)并在 100 毫秒内为另一个调用此函数设置一个计时器。让我知道您希望更详细地描述其中的哪一部分。
    • 好的,知道了。我意识到我的代码并不清楚,但我不打算让乌龟“绊倒”,而是走直线但随机的路径。本质上,只需从 A 点跳到 B 点,无需指定转弯角度。这是可能的还是必须在这些限制处有一个转角?另外,有什么方法可以不使用屏幕来做到这一点?顺便说一句,撤消功能在您的代码中几乎可以正常工作,但在我的代码中却不行...
    • @PolitEcon2016,我已经消除了你应该能够自己进行的小修改。就远点与角度而言,它们都具有相同的目的,您应该能够将代码从一个切换到另一个。至于不使用“屏幕”,我也这样做了,但所有改变的是屏幕被隐式使用而不是显式使用,这并不是真正的改进。
    猜你喜欢
    • 1970-01-01
    • 2017-09-27
    • 2015-07-04
    • 2023-02-26
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 2017-08-09
    • 2012-09-08
    相关资源
    最近更新 更多