2013-07-29 15 views
5

Ich habe eine Ebene, plane A, definiert durch seinen orthogonalen Vektor, sagen (a, b, c).Wie kann ich Vektoren in eine Ebene projizieren, die durch ihren orthogonalen Vektor in Python definiert ist?

(das heißt der Vektor (a, b, c) zu plane A orthogonal ist)

Ich möchte einen Vektor (d, e, f) auf plane A projizieren.

Wie kann ich es in Python tun? Ich denke, es muss einige einfache Wege geben.

+6

ist dies kein Problem Python; Dies ist ein normales mathematisches Problem –

Antwort

6

Nehmen Sie (d, e, f) und subtrahieren Sie die Projektion davon auf die normalisierte Normale zur Ebene (in Ihrem Fall (a, b, c)). Also:

v = (d, e, f) 
     - sum((d, e, f) *. (a, b, c)) * (a, b, c)/sum((a, b, c) *. (a, b, c)) 

hier durch *. meine ich die komponentenweise Produkt. So würde dies bedeuten:

sum([x * y for x, y in zip([d, e, f], [a, b, c])]) 

oder

d * a + e * b + f * c 

, wenn Sie gerade sein wollen klar, aber pedantisch

und in ähnlicher Weise für . So wird in Python:

from math import sqrt 

def dot_product(x, y): 
    return sum([x[i] * y[i] for i in range(len(x))]) 

def norm(x): 
    return sqrt(dot_product(x, x)) 

def normalize(x): 
    return [x[i]/norm(x) for i in range(len(x))] 

def project_onto_plane(x, n): 
    d = dot_product(x, n)/norm(n) 
    p = [d * normalize(n)[i] for i in range(len(n))] 
    return [x[i] - p[i] for i in range(len(x))] 

Dann können Sie sagen:

p = project_onto_plane([3, 4, 5], [1, 2, 3]) 
+0

*. scheint vom Compiler nicht erkannt zu werden: SyntaxError: Ungültige Syntax. Warum? –

+0

@ perfectionm1ng: Weil es * nicht * Python ist. Ich habe für dich geschrieben, wie man '* .' in Python übersetzt. – jason

+0

Oh, ich verstehe. Ich bin so ein Neuling in Python. Könnten Sie mir bitte den Code zeigen? Ich weiß, hacke es in Mathe. Was ich nicht weiß und deshalb frage ist, wie man es in Python-Codes macht. –