6

plane A私は、その直交ベクトルによって定義された平面を持っています(a, b, c)

(つまり、ベクトル(a, b, c)は に直交しplane Aます)

(d, e, f)ベクトルを に投影したいと思いますplane A

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

4

1 に答える 1

9

(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)。したがって、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])
于 2013-07-29T03:21:12.017 に答える