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.
任何帮助将不胜感激
让我们从图表开始:
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,只需根据三个坐标的总和进行缩放.