假设我有一个任意向量A.将向量幅度减少任意数量的最有效方法是什么?
我目前的方法如下:
Vector shortenLength(Vector A, float reductionLength) {
Vector B = A;
B.normalize();
B *= reductionLength;
return A - B;
}
有更好的方法吗?可能会删除标准化B所需的平方根...
答案 0 :(得分:9)
因此,如果我理解正确,您有一个向量A
,并且想要另一个向量指向A
但向reductionLength
更短的向量,对吗? / p>
Vector
接口是否具有类似“长度”成员函数(返回向量的长度)?然后我认为以下应该更有效:
Vector shortenLength(Vector A, float reductionLength)
{
Vector B = A;
B *= (1 - reduction_length/A.length());
return B;
}
答案 1 :(得分:6)
如果您要通过将矢量乘以标量值来缩放矢量,则不规范化。不是为了效率的原因;因为结果不是你想要的结果。
假设你有一个看起来像这样的矢量:
v = (3, 4)
其幅度为sqrt(3^2 + 4^2) = 5
。所以让我们将其标准化:
n = (0.6, 0.8)
此向量的大小为1;它是一个单位向量。
因此,如果你将每一个“缩短”0.5倍,你会得到什么?
shortened v = (3, 4) * 0.5 = (1.5, 2.0)
现在让我们按照幅度sqrt(6.25)对其进行标准化:
normalized(shortened v) = (1.5/2.5, 2/2.5) = (0.6, 0.8)
如果我们对单位向量做同样的事情:
shortened(normalized v) = (0.6, 0.8) * 0.5 = (0.3, 0.4)
这些根本不是一回事。你的方法做了两件事,而且它们不是可交换的。