2016-08-03 34 views
1

Ich bin Scripting in Python und ich bin sehr neu, und habe nicht viel Erfahrung mit Vektor Mathematik, kann ich Punkt Produkt, Länge und Winkel von zwei Vektoren erhalten, und ich habe es geschafft, den Winkel der Differenz zwischen den zwei Punkten (eine Kante) zu erhalten, aber ich bin mir nicht sicher über die Mathematik/den Prozess der tatsächlichen Änderung der zweiten Menge von Punkten, um den Winkel der ersten anzupassen. Was ich versuche zu tun ist, die zweite Menge von Punkten zu drehen, um mit der ersten Menge übereinzustimmen, unabhängig von ihrer aktuellen Position. Zum Beispiel:Kanten ändern

#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 

Das gibt mir einen Winkel von 45 Grad, was ich versuche jetzt zu tun ist, um die zweite Kante p2 drehen, um den Winkel von p1 unabhängig von seiner Position im Welt-Raum paßt so p1 könnte (sein 1,1), (- 2, -2) und p2 könnte (-1,1) sein, (- 3,3) mit einer 90-Grad-Drehung erforderlich

Antwort

0

eine neue Funktion Drehen genannt definieren:

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] 

Gedrehter Vektor sollte identisch sein mit dir_1. Lassen Sie mich wissen, wenn dies Ihr Problem löst

+0

Es scheint ein Syntaxfehler im Ergebnis, ein fehlendes Komma vor v vielleicht? Und ich denke, v muss sein v1 – Kenny

+0

Es gab ein Minuszeichen fehlt, korrigiert es. Probieren Sie das neue Programm –

+0

Es scheint zu funktionieren .. aber die Follow-up-Frage, was kann ich mit dem gedrehten Vektor tun? Die zweite Kante (-1,1), (- 3,3) sollte sich um 90 Grad drehen, um der ersten Kante (1,1), (- 2, -2) zu entsprechen, und ihre neuen Werte sollten (-1,3) sein. , (- 3,1) – Kenny