2016-02-22 153 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度旋转。