将矢量幅度减少特定长度的有效方法?

时间:2012-01-08 22:36:28

标签: c++ math vector linear-algebra

假设我有一个任意向量A.将向量幅度减少任意数量的最有效方法是什么?

我目前的方法如下:

Vector shortenLength(Vector A, float reductionLength) {

    Vector B = A;
    B.normalize();
    B *= reductionLength;
    return A - B;

}

有更好的方法吗?可能会删除标准化B所需的平方根...

2 个答案:

答案 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)

这些根本不是一回事。你的方法做了两件事,而且它们不是可交换的。