0

ランダムに動くタートルを半径 50 の円の内側に拘束し、円の中心を (0, 0) にするにはどうすればよいでしょうか? したがって、タートルが現在位置 (x, y) にある場合、中心からの距離は math.sqrt(x ** 2 + y ** 2) です。タートルの中心からの距離が 50 を超えるときはいつでも、向きを変えて続けます。画面サイズで動作するようにコードを取得しましたが、math.sqrt(x ** 2 + y ** 2) をどこに配置すれば、円内に拘束されるようになりますか? これまでのコードは次のとおりです。

import turtle, random, math

def bounded_random_walk(num_steps, step_size, max_turn):
    turtle.reset()
    width = turtle.window_width()
    height = turtle.window_height()
    for step in range(num_steps):
       turtle.forward(step_size)
       turn = random.randint(-max_turn, max_turn)
       turtle.left(turn)

       x, y = turtle.position()
       if -width/2 <= x <= width/2 and -height/2 <= y <= height/2:
           pass
       else:  # turn around!
           turtle.left(180)
           turtle.forward(step_size)

このコードは、画面内のタートルには機能しますが、円内には機能しません。

4

2 に答える 2

1

コーディングしている場所:

   if -width/2 <= x <= width/2 and -height/2 <= y <= height/2:

あなたは本当に「ポイント(x、y)が許可された領域内にある場合」を意味します。したがって、「許可された領域」が「原点を中心とする半径 50 の円」である場合、距離と半径の 2 乗を比較すると (平方根を取るよりも明確です...!-)、次のようになります。

   if (x*x + y*y) <= 50*50:

コードの残りの部分はすべて変更しないでください。

編集:OPがこれは彼には機能しないとコメントしたので、if/elseを次のように変更しました:

   x, y = turtle.position()
   # if -width/3 <= x <= width/3 and -height/3 <= y <= height/3:
   if (x*x + y*y) <= 50*50:
       pass
   else:  # turn around!
       print 'Bounce', step, x, y
       turtle.left(180)
       turtle.forward(step_size)

bounded_random_walk(200, 10, 30)Mac OS XのTerminal.Appから実行したため、print表示されます。その結果、約 50 から 60 の「バウンス」のプリントが得られ、タートルは明らかに目的の円の内側に境界付けられています。これは、ロジックとジオメトリもそうしなければならないと言われています。

したがって、OPがこれらの行に沿って独自の回答を編集し(理想的には、システム上で、出力の結果printまたは他の方法で出力を表示し、理想的にはそれらを表示できる配置で)、彼のデバッグを支援できるようにすることを願っています彼のコード。

于 2009-09-20T23:45:25.130 に答える
0

このコードに対する提案された修正が機能するかどうかについての意見の相違は、私の興味を引きました。@user176073 のコードを @AlexMartelli の 1000 ステップの変更で実行したところ、奇妙なことが起こりました。

ここに画像の説明を入力

フレアは複数の実行で発生し、タートルが離れたらサークルに戻そうとする修正ロジックに関連しているようです。タートルに新しい角度が適用された後に誤って適用されています。タートルを円の外に導いた元の角度の 180 度ではないため、タートルが内側に戻るまで少しさまよう傾向があります。

いくつかの変更を加えて新しい実装を試みました。修正前ではなく、修正後に新しい角度の更新を適用します。Python 3 タートルの元に戻す機能を使用して、自分でやろうとするのではなく、タートルを内部に戻します。結果は次のとおりです。

ここに画像の説明を入力

更新されたコード:

import turtle
import random

RADIUS = 50

def bounded_random_walk(num_steps, step_size, max_turn):

    for _ in range(num_steps):
        turtle.forward(step_size)

        x, y = turtle.position()

        if (x * x + y * y) > RADIUS * RADIUS:
            turtle.undo()  # undo misstep
            turtle.left(180)

        turn = random.randint(-max_turn, max_turn)
        turtle.left(turn)

bounded_random_walk(1000, 10, 30)

turtle.exitonclick()
于 2016-12-05T04:49:18.927 に答える