2016-08-03 61 views
1

我在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 

這給了我一個45度角,我想要做的是,無論它的位置現在旋轉第二邊緣P2匹配P1的角度在世界空間,因此P1可能是( 1,1),( - 2,-2)和p2可能是(1,1),( - 3,3)以90度旋轉所需要

回答

0

定義一個新的函數調用旋轉:

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相同。讓我知道這是否可以解決您的問題

+0

結果中似乎存在語法錯誤,v之前可能缺少逗號?我認爲v需要v1 – Kenny

+0

有一個負號缺失,糾正它。嘗試新的程序 –

+0

它似乎工作..但後續的問題,我可以做什麼用旋轉矢量?第二個邊(-1,1),( - 3,3)應旋轉90度以匹配第一個邊(1,1),( - 2,-2),其新值應爲(-1,3) ,( - 3,1) – Kenny