1
coordinates = [(0, 2), (0, 1), (1, 2), (1, 1), (0, 0), (1, 0), (1, 1), (0, 1), (0, 0)]

上記のPython配列を作成しました。ポイント (x,y) のタプルが含まれます。最初のポイント (原点ではない) から始めると仮定します。与えられた順番でポイントに移動したい。私が持っている唯一の移動関数はrotate90Degrees(direction)、方向がそれぞれ左と右の 1 または -1 である場合です。そしてforward(time)、移動する時間はどこにありますか。time = 1 は、座標系の 1 単位に相当すると仮定します。巨大な if/else if/else なしで this を動きの命令に簡単に変更する賢い方法はありますか? 私がこれまでに持っているもの:

start = coordinates[0]
for x in range(1,len(coordinates)):
    finish = coordinates[x]
    change.append((finish[0] - start[0],finish[1] - start[1]))
    start = coordinates[x]
4

2 に答える 2

1

さて、あなたのロボットは既知の基本的な方向を向いており、既知の場所にいます。別の場所に移動させたいとします。

最初に、方向を変位にマップするタプルのリストが必要です。標準の単位円を使用します。角度は 90 度の倍数です。

atod = [(1, 0), (0, 1), (-1, 0), (0, -1)]

したがって、方向を向いて移動する0と、単位時間ごとに x 座標が 1 増加し、y 座標は変化しません。方向は 0 から 3 までの整数です。

ここで、コードは続行する方法を理解する必要があります。ロボットが現在向いている方向から始めます。目的の変位が であり(-2, 1)、であるとします。です。ゼロのものは無視してください。で割るとになるので、この方向はダメです。回転させなければなりません。どちら?それぞれをチェックして、どの方法が役立つかを確認してください。どちらの方法でも解決しない場合は、180 度を行う必要があります。お好きな方向に行ってください。dir0atod[dir](1, 0)-21-2

回転を行ったので、方向が に1なり、atod[dir]です (0, 1)。で進めたいと思い1ます。そうする。ここで、もう一度回転し、もう一度移動する必要があります。これで完了です。

于 2016-02-22T22:29:36.813 に答える
0

回転は 90 度に制限されているため、南北または東西の軸に沿って移動できます。

どの動きにも北/南の要素と東/西の要素があることがわかります。

動きに一貫性がある場合は、次のステップから 90 度回転するだけです。

1. turn east or west
2. move east or west
3. turn north or south
4. move north or south
5. You should be at your target
6. turn east or west
7. move east or west
8. turn north or south
9. move north or south
10. you should be at your (next) target

...など

ロボットが最初に北を向いていると仮定すると、ループは最初に東/西に向きを変え、次に移動し、次に北/南に向きを変える必要があります。

ここから始めます。これは、グローバル データとメイン コードである可能性があります。

Robot_pos = coordinates[0]
Robot_facing = NORTH

for next_pos in coordinates[1:]:
    move_robot(next_pos)

x が東/西、y が北/南であると仮定すると、move_robot は次のようになります。

def move_robot(new_pos):
    """
    Move robot from ``Robot_pos`` to ``new_pos`` given. The robot
    is assumed to be facing either north or south upon entry, so
    east/west movement is done first.
    """

    delta_x = ...
    turn_robot(EAST or WEST)
    forward( some amount )

    # similarly for Y

turn_robot()向きを正方向にするか負方向にするかのターンを最適化するには、コードを少し賢くする必要があります。ただし、常に単一の 90 度回転にする必要があります。

于 2016-02-22T23:27:07.817 に答える