我在Processing中编写程序,我将矢量规范化为单位矢量。 当我这样做时,我希望我的矢量的幅度为1.但是,我的矢量幅度是这个(见下文)
幅度接近于1,但它不是完全 1.我发现如果我声明一个等于的变量,我可以将矢量的幅度设为1向量的大小和直接用向量的大小代替来划分我的向量分量,如下所示。
当我使用变量时,知道为什么我的向量幅度更准确吗?
mag
等于mag()
,mag
是一个浮点数而mag()
返回一个浮点数,所以我不明白为什么我的数量会有所不同。< / p>
我的整个代码都在下面。
PVector center, mouse;
void setup() {
size(1000,300);
background(0);
stroke(255);
center = new PVector(width/2,height/2);
}
void draw() {
background(0);
mouse = new PVector(mouseX, mouseY);
mouse.sub(center); //Mouse is now the vector between mouse and center.
mouse.normalize();
println("magnitude: " + mouse.mag() +
", Vector coordinates: (" + mouse.xPos + "," + mouse.yPos + ")" );
/* These values are getting normalized already, so the magnitude of the
vectors should be equal to 1.
*/
translate(center.xPos, center.yPos);
line(0,0,mouse.xPos,mouse.yPos);
}
class PVector {
float xPos; // xPos and yPos are the vector's components.
float yPos;
PVector (float xTemp, float yTemp) {
xPos = xTemp;
yPos = yTemp;
}
void sub(PVector vectorTemp) {
xPos = xPos - vectorTemp.xPos;
yPos = yPos - vectorTemp.yPos;
}
float mag() {
float magnitude = sqrt(xPos * xPos + yPos * yPos);
return magnitude;
}
void normalize() {
float mag = mag(); // My vector's magnitude is 1 when I use a variable.
xPos = xPos/mag;
yPos = yPos/mag;
}
}
答案 0 :(得分:5)
第一个(不精确)版本有一个缺陷:
它会更新xPos
,然后 使用更新的mag()
计算xPos
。这意味着yPos
相对于完全不同的顶点缩放。
E.g。向量(3, 4)
的该方法的示例流程如下所示:
xPos = 3
yPos = 4
mag() = sqrt(3^2 + 4^2) = 5
xPos = 3 / 5
mag() = sqrt(3^2/5^2 + 4^2) ~= 4.045
yPos = 4 / ~4.045
在上面的例子中导致整体幅度为~1,2605。
另一方面,另一个版本正确地首先计算幅度,然后更新位置值。