2013-07-29 1 views
5

저는 직교 벡터에 의해 정의 된 평면, plane A을 가지고 있습니다 (예 : (a, b, c)).파이썬에서 직교 벡터로 정의 된 평면에 벡터를 어떻게 투영 할 수 있습니까?

(즉, 벡터는 (a, b, c)plane A 직교)

I는 plane A(d, e, f) 벡터를 투영하고 싶다.

어떻게 파이썬에서 할 수 있습니까? 나는 쉬운 방법이 있어야한다고 생각합니다.

+6

를이 파이썬 문제가되지 않습니다; 이것은 정규 수학 문제 –

답변

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 

그냥 (a, b, c) *. (a, b, c)에 대한 유사 분명하지만

현학적 및 수 있도록하려면

. 따라서, 파이썬 :

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 : invalid syntax. 왜? –

+0

@ perfectionm1ng : 파이썬이 아니기 때문에. '* .'을 파이썬으로 어떻게 변환 할 수 있는지 설명했습니다. – jason

+0

오, 알았어. 나는 파이썬에서 그런 초보자이다. 코드를 보여 주시겠습니까? 나는 수학에서 그것을하기 위해 괭이를 안다. 내가 모르는 것이고 그러므로 묻는 것은 파이썬 코드로 그것을하는 방법입니다. –

관련 문제