规范化一个向量,使所有元素之和每次都加1

use*_*723 0 java vector normalization matrix

我正在尝试编写一些代码来规范化带有元素的向量,[x,y,z]但是想知道是否有一种方法来规范化元素,这样每次元素的总和都会增加到1.

我确实遇到过一个公式:(伪代码)

normalized = vectorA/ magnitude(vectorA)
Run Code Online (Sandbox Code Playgroud)

但是,如果vectorA = [1,4,5]那时使用上面的公式会给出:

magnitude = sqrt(1^2 + 4^2 + 5^2)
magnitude = sqrt(42)
magnitude = 6.48
Run Code Online (Sandbox Code Playgroud)

现在基于那个,如果我将矢量的每个元素除以6.48:

1/6.48 = 0.154
4/6.48 = 0.62
5/6.48 = 0.77
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,总和大于1,因此公式不是每次都有效,我想知道是否有人知道如何在任何时候将元素总和等于1.

任何帮助将不胜感激

pax*_*blo 6

让我们从图表开始:

  B-------C
 /|      /|
A-------* |
| *-----|-G
|/      |/
*-------*
Run Code Online (Sandbox Code Playgroud)

让我们进一步说明AG你的向量.为简单起见,我们将说明这A是起源[0, 0, 0].

如果您的目的是简单地以线性方式缩放值(长度和AB,BC以及CG它们总计为1),则只需将每个值除以总和:

/   x       y       z   \
| ----- , ----- , ----- |
\ x+y+z   x+y+z   x+y+z /
Run Code Online (Sandbox Code Playgroud)

在您x+y+z给出的特定情况下10,您最终得到:

[0.1, 0.4, 0.5]
Run Code Online (Sandbox Code Playgroud)

总计一个.


您找到的公式适用于三维向量,您希望向量的长度AG1.

你所拥有的数字(大致)是正确的,因为向量的长度是:

                 2              2            2
  sqrt (   height     +    width    +   depth )

= sqrt (0.154 * 0.154 + 0.62 * 0.62 + 0.77 * 0.77)
= sqrt (  0.023716    +   0.3844    +   0.5929  )
= sqrt (                 1.001016               )

= 1.000507871
Run Code Online (Sandbox Code Playgroud)

将您的数字插入其中会给您一些接近的东西,1.0005这可以理解为原始数字的四舍五入.

所以,底线,如果你想要矢量的长度为1,只需使用你在问题中发布的公式.如果您希望向量坐标总和为1,只需根据三个坐标的总和进行缩放.