2016-02-22 152 views
1
coordinates = [(0, 2), (0, 1), (1, 2), (1, 1), (0, 0), (1, 0), (1, 1), (0, 1), (0, 0)] 

我已經創建了上述的Python數組。它包含點(x,y)的元組。我會假設我從第一點開始(不是orgin)。我想按照給定的順序移動到點。我所擁有的唯一移動功能是rotate90Degrees(direction),其中方向分別爲左側和右側1或-1。和時間是多少時間移動。我將假設時間= 1相當於座標系中的一個單位。有沒有一種聰明的方法可以輕鬆地將這個變成運動指令而沒有巨大的if/else if/else?我有什麼至今:Python - 座標旋轉/移動指令

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] 
+0

是的,你可以概括這個過程。打印出你的**更改**清單。寫下您每次更改所需的說明。你是如何派生的?描述爲一個通用算法,用於從已知標題進行給定更改(您必須注意標題)。現在,編寫一個遍歷您的更改列表的循環,併爲每個更改生成說明。 – Prune

回答

0

好了,你的機器人正面臨着一些已知的基本方向,是在 一些已知的位置,你想讓它移動到另一個位置。

首先你需要一個元組列表來映射方向到位移。 我將使用標準單位圓的,有角度爲90度 倍數:

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

所以在方向0面對當移動裝置1的x座標增加 每單位時間和您的y座標不變,等等。 方向是從0到3的整數。

現在代碼需要弄清楚如何繼續。我會從機器人當前面向的任何方向開始。假設所需的排量是 (-2, 1)dir0atod[dir](1, 0)。忽略那個爲零的一個 ;將-2除以1即可得到-2,所以此方向爲 不好,我們必須旋轉。哪一條路?檢查每一個,看看 幫助。如果這兩種方法都不能解決問題,那麼你需要做180,然後按照你喜歡的方向進行。

所以我們做了我們的轉動,現在我們在方向1atod[dir](0, 1)。所以我們想要前進1。這樣做。現在你必須 再次旋轉,再次移動,你就完成了。

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度旋轉。