如何在Python中将向量投影到由其正交向量定义的平面上?

8
我有一架飞机,叫做plane A,由其垂直向量定义,例如(a, b, c)
(即向量(a, b, c)垂直于plane A
我希望将向量(d, e, f)投影到plane A上。 如何在Python中实现? 我认为一定有一些简单的方法。

7
这不是一个Python的问题,而是一个普通的数学问题。 - Eiyrioü von Kauyf
1个回答

10

(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)(a, b, c) *. (a, b, 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])

*. 似乎未被编译器识别:SyntaxError:无效语法。为什么? - Sibbs Gambling
@perfectionm1ng: 因为它并不是Python。我已经为你详细说明了如何将 *. 翻译成Python。 - jason
哦,我明白了。我在Python方面是个新手。你能给我展示一下代码吗?我知道如何在数学中做到这一点。我不知道的是如何在Python代码中实现它。 - Sibbs Gambling
谢谢提供代码!但是对于 norm(),应该使用 sqrt(dot_product(x, x)) 而不是 dot_product(x, x),对吗? - Sibbs Gambling
@perfectionm1ng:是的,抱歉。 - jason
另外,根据数学计算,应该是 p = [d / norm(n) * normalize(n)[i] for i in range(len(n))]。请检查一下,如果我是正确的,请友善地修改答案。 :) - Sibbs Gambling

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接