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

kbi*_*irk 9 c++ math vector linear-algebra

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

我目前的方法如下:

Vector shortenLength(Vector A, float reductionLength) {

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

}
Run Code Online (Sandbox Code Playgroud)

有没有更有效的方法来做到这一点?可能会删除标准化B所需的平方根...

cel*_*chk 10

因此,如果我理解正确,你有一个向量A,并希望另一个向量指向相同的向量A,但是更短reductionLength,对吗?

Vector接口是否具有类似"长度"成员函数(返回向量的长度)?然后我认为以下应该更有效:

Vector shortenLength(Vector A, float reductionLength) 
{
    Vector B = A;
    B *= (1 - reduction_length/A.length());
    return B;
}
Run Code Online (Sandbox Code Playgroud)


duf*_*ymo 6

如果你想通过一个标值乘以缩放向量,你应该不会正常化.不是为了效率的原因; 因为结果不是你想要的.

假设您有一个如下所示的向量:

v = (3, 4)
Run Code Online (Sandbox Code Playgroud)

它的大小是sqrt(3^2 + 4^2) = 5.所以让我们将其标准化:

n = (0.6, 0.8)
Run Code Online (Sandbox Code Playgroud)

该向量的大小为1; 它是一个单位向量.

因此,如果你将每个"缩短"0.5倍,你会得到什么?

shortened v = (3, 4) * 0.5 = (1.5, 2.0)
Run Code Online (Sandbox Code Playgroud)

现在让我们按其幅度sqrt(6.25)对其进行标准化:

normalized(shortened v) = (1.5/2.5, 2/2.5) = (0.6, 0.8)
Run Code Online (Sandbox Code Playgroud)

如果我们对单位向量做同样的事情:

shortened(normalized v) = (0.6, 0.8) * 0.5 = (0.3, 0.4)
Run Code Online (Sandbox Code Playgroud)

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