在Python

时间:2017-08-02 07:45:34

标签: python coordinates

我在Python中有以下2D坐标对列表的几个序列(实际上表示路径):

a = [[0, 0], [1, 0.4], [1.2, 0.6], [1.6, 0.9], [1.9, 2.1]]
b = [[-0.3, 0.5], [1.33, 0.46], [2.34, 0.6], [2.6, 1]]
c = [[10, 0.2], [10.1, 0.3], [10.2, 0.4], [11.6, 0.5], [13.9, 0.77]]

列表的长度不同,并非每个列表都从[0,0]

开始

现在,我想"规范化"它们每个都从[0, 0]开始并按比例旋转它们,使最终点位于X轴的正方向[+something, 0]。我怎样才能实现这种转变,以保持原始比例?

奖金问题:我怎么能解决这个问题,以便最后一点总是在[1, 0],这样路径不仅可以旋转,还可以调整大小?

1 个答案:

答案 0 :(得分:1)

第一步很简单。

对于第二个,您可以使用atan2来计算X轴和最后一个点之间的角度。 <{1}} -theta from math import cos, sin, atan2 a = [[0, 0], [1, 0.4], [1.2, 0.6], [1.6, 0.9], [1.9, 2.1]] b = [[-0.3, 0.5], [1.33, 0.46], [2.34, 0.6], [2.6, 1]] c = [[10, 0.2], [10.1, 0.3], [10.2, 0.4], [11.6, 0.5], [13.9, 0.77]] def move_to_origin(l): x0, y0 = l[0] return [(x - x0, y - y0) for x, y in l] def rotate_to_x_axis(l): xn, yn = l[-1] theta = atan2(-yn, xn) return [(x*cos(theta) - y*sin(theta), x*sin(theta) + y*cos(theta)) for x, y in l] print(move_to_origin(a)) # [(0, 0), (1, 0.4), (1.2, 0.6), (1.6, 0.9), (1.9, 2.1)] print(move_to_origin(b)) # [(0.0, 0.0), (1.6300000000000001, -0.03999999999999998), (2.6399999999999997, 0.09999999999999998), (2.9, 0.5)] print(move_to_origin(c)) # [(0, 0.0), (0.09999999999999964, 0.09999999999999998), (0.1999999999999993, 0.2), (1.5999999999999996, 0.3), (3.9000000000000004, 0.5700000000000001)] print(rotate_to_x_axis(move_to_origin(a))) # [(0.0, 0.0), (0.9675276356186346, -0.47317044953612064), (1.250017456237214, -0.4872949405670496), (1.740843519561996, -0.5826352550258203), (2.831960451701259, 0.0)] 到每一点,你就完成了。

现在写第3个功能应该不难。

b

这是一个小的matplotlib图,其中包含import matplotlib.pyplot as plt plt.plot(*zip(*b)) plt.plot(*zip(*move_to_origin(b))) plt.plot(*zip(*rotate_to_x_axis(move_to_origin(b)))) plt.gca().set_aspect('equal', adjustable='box') plt.show()

的步骤
matlab -nodisplay <LocalVariation.m

rotation