Python 更改边以匹配角度

Python 更改边以匹配角度,python,math,rotation,Python,Math,Rotation,我是用python编写脚本的,对此我很陌生,对向量数学没有太多经验,我可以得到两个向量的点积、长度和角度,我已经设法得到两点之间的差角(一条边),但我不确定实际修改第二组点以匹配第一组点的角度的数学/过程。我要做的是旋转第二组点以匹配第一组点,而不管其当前位置如何。例如: #python import math def dot (v1, v2): return (v1[0]*v2[0] + v1[1]*v2[1]) def length (v): return math.sqrt

我是用python编写脚本的,对此我很陌生,对向量数学没有太多经验,我可以得到两个向量的点积、长度和角度,我已经设法得到两点之间的差角(一条边),但我不确定实际修改第二组点以匹配第一组点的角度的数学/过程。我要做的是旋转第二组点以匹配第一组点,而不管其当前位置如何。例如:

#python
import math
def dot (v1, v2):
    return (v1[0]*v2[0] + v1[1]*v2[1])
def length (v):
    return math.sqrt(dot(v,v))
def normalize (v):
    r = [0.0] * 2
    v_len = length (v)
    if v_len > 0.0:
            v_invLen = 1.0 / v_len
            r[0] = v[0] * v_invLen
            r[1] = v[1] * v_invLen                
    return r
def direction (v1, v2):
    return (v2[0]-v1[0], v2[1]-v1[1])
def angle(dotProduct):
    return math.degrees(math.acos(dotProduct))

p1,p2 = (0,0),(0,1) <--- first edge
p3,p4 = (0,0),(2,2) <--- second edge
dir = direction(p1,p2)
dir2 = direction(p3,p4)
dir_n = normalize(dir)
dir2_n = normalize(dir2)
dotProduct = dot(dir_n, dir2_n)
ang1 = math.degrees(math.acos(dotProduct))
print ang1  
#python
输入数学
def dot(v1、v2):
返回(v1[0]*v2[0]+v1[1]*v2[1])
def长度(v):
返回数学sqrt(点(v,v))
def正常化(v):
r=[0.0]*2
v_len=长度(v)
如果v_len>0.0:
v_invLen=1.0/v_len
r[0]=v[0]*v_invLen
r[1]=v[1]*v_invLen
返回r
def方向(v1、v2):
返回(v2[0]-v1[0],v2[1]-v1[1])
def角度(点积):
返回math.degrees(math.acos(dotProduct))

p1,p2=(0,0),(0,1)定义一个名为rotate的新函数:

def rotate(v,ang):
    result =[v[0]*math.cos(ang)-v[1]*math.sin(ang),v[0]*math.sin(ang)+v[1]*math.cos(ang)]
    return result

# So to rotate a given vector,lets take your example
p1,p2 = (1,1),(-2,-2)
p3,p4 = (-1,1),(-3,3)

p1,p2 = (1,1),(-2,-2)
p3,p4 = (-1,1),(-3,3)

dir = direction(p1,p2)
dir2 = direction(p3,p4)

dir_n = normalize(dir)
print ("Direction1")
print (dir_n)
dir2_n = normalize(dir2)
print ("Direction2")
print (dir2_n)
dotProduct = dot(dir_n, dir2_n)
ang1 = math.degrees(math.acos(dotProduct))

#Rotate dir2_n in direction of dir_n
new_vec = rotate(dir2_n,math.radians(ang1))
print ("rotated_vector")
print (new_vec)

Output:
Direction1
[-0.7071067811865476, -0.7071067811865476]
Direction2
[-0.7071067811865475, 0.7071067811865475]
rotated_vector
[-0.7071067811865475, -0.7071067811865475]

旋转向量应与dir_1相同。让我知道这是否解决了您的问题

定义一个名为旋转的新函数:

def rotate(v,ang):
    result =[v[0]*math.cos(ang)-v[1]*math.sin(ang),v[0]*math.sin(ang)+v[1]*math.cos(ang)]
    return result

# So to rotate a given vector,lets take your example
p1,p2 = (1,1),(-2,-2)
p3,p4 = (-1,1),(-3,3)

p1,p2 = (1,1),(-2,-2)
p3,p4 = (-1,1),(-3,3)

dir = direction(p1,p2)
dir2 = direction(p3,p4)

dir_n = normalize(dir)
print ("Direction1")
print (dir_n)
dir2_n = normalize(dir2)
print ("Direction2")
print (dir2_n)
dotProduct = dot(dir_n, dir2_n)
ang1 = math.degrees(math.acos(dotProduct))

#Rotate dir2_n in direction of dir_n
new_vec = rotate(dir2_n,math.radians(ang1))
print ("rotated_vector")
print (new_vec)

Output:
Direction1
[-0.7071067811865476, -0.7071067811865476]
Direction2
[-0.7071067811865475, 0.7071067811865475]
rotated_vector
[-0.7071067811865475, -0.7071067811865475]

旋转向量应与dir_1相同。让我知道这是否解决了您的问题

结果中似乎有语法错误,v前面可能缺少逗号?我认为v应该是v1,缺少一个负号,更正了。尝试新的程序,它似乎可以工作。。但接下来的问题是,我能用旋转向量做什么?第二条边(-1,1),(-3,3)应旋转90度以匹配第一条边(1,1),(-2,-2),其新值应为(-1,3),(-3,1)。结果中似乎存在语法错误,v之前可能缺少逗号?我认为v应该是v1,缺少一个负号,更正了。尝试新的程序,它似乎可以工作。。但接下来的问题是,我能用旋转向量做什么?第二条边(-1,1),(-3,3)应旋转90度以匹配第一条边(1,1),(-2,-2),其新值应为(-1,3),(-3,1)