2013-07-29 27 views
5

Tôi có một mặt phẳng, plane A, được xác định bởi vectơ trực giao của nó, nói (a, b, c).Làm thế nào tôi có thể chiếu vectơ lên ​​mặt phẳng được xác định bởi vectơ trực giao của nó trong Python?

(ví dụ: vector (a, b, c) là trực giao với plane A)

Tôi muốn dự một vector (d, e, f) vào plane A.

Tôi có thể làm điều đó bằng Python bằng cách nào? Tôi nghĩ rằng phải có một số cách dễ dàng.

+6

đây không phải là một vấn đề trăn; đây là một vấn đề toán học thông thường –

Trả lời

6

Lấy (d, e, f) và trừ phép chiếu của nó vào bình thường hóa bình thường sang mặt phẳng (trong trường hợp của bạn là (a, b, c)). Vì vậy:

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

Ở đây, bởi *. tôi có nghĩa là các sản phẩm thành phần khôn ngoan. Vì vậy, điều này có nghĩa:

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

hoặc

d * a + e * b + f * c 

nếu bạn chỉ muốn được rõ ràng nhưng pedantic

và tương tự cho . Như vậy, trong 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))] 

Sau đó, bạn có thể nói:

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

*. dường như không được trình biên dịch xác định: Cú pháp Cú pháp: cú pháp không hợp lệ. Tại sao? –

+0

@ perfectionm1ng: Bởi vì nó * không * Python. Tôi đã viết cho bạn cách dịch '* .' sang Python. – jason

+0

oh, tôi hiểu rồi. Tôi là một newbie trong Python. Bạn vui lòng cho tôi xem mã không? Tôi biết cuốc để làm điều đó trong toán học. Những gì tôi không biết và do đó đang yêu cầu là làm thế nào để làm điều đó trong mã Python .. –

Các vấn đề liên quan