我在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]
,这样路径不仅可以旋转,还可以调整大小?
答案 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