2013-07-29 9 views
5

私は、その直交ベクトル、例えば(a, b, c)によって定義される平面plane Aを持っています。Pythonで直交ベクトルで定義された平面にベクトルを投影するにはどうすればよいですか?

(即ちベクター(a, b, c)plane Aに直交する)

Iはplane A上ベクター(d, e, f)を投影することを望みます。

どうすればPythonで実行できますか?私はいくつかの簡単な方法があると思う。

+6

これはPythonの問題ではありません。これは正規の数学問題 –

答えて

6

(d, e, f)とし、平面への正規化された法線(その場合は(a, b, c))に投影を取り除きます。だから、:ここに

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

*.によって私は成分ごと製品を意味します。だから、これは意味します:

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

または

d * a + e * b + f * c 

あなただけについても同様に明確でなく、知識をひけらかす

とになりたい場合。このように、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))] 

次に、あなたが言うことができる:

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

*です。コンパイラによって識別されないようです:SyntaxError:無効な構文です。どうして? –

+0

@ perfectionm1ng:Pythonではないからです。 '* .'をPythonに翻訳する方法を教えてくれました。 – jason

+0

ああ、私は参照してください。私はPythonの初心者です。私にコードを教えてください。私は鍬が数学でそれをするのを知っています。私が知りませんので、Pythonコードでそれを行う方法です質問です。 –

関連する問題