旋转2向量,向后移动和跳过区域。 C#

时间:2016-10-02 21:35:06

标签: c# rotation 2d vectormath

我正在尝试使用2向量的旋转,但我遇到了两个问题。首先,向量似乎向后旋转,其次,向量在两个区域旋转时跳过。

这是我用于轮换的代码(在矢量类中,带有private handleError(err: any) { if (err.status) { console.log("status = " + err.status); console.log("statusText = " + err.statusText); console.log("text = " + err.text()); } else { console.log('sever error:', err); } return Observable.throw(err || 'backend server error'); } double x):

double y

当我使用它们来旋转矢量时,它会逆时针旋转,而不是顺时针旋转我认为它应该旋转。为了演示,一张图片:

original vector in gold, rotated in blue

它也比我想象的要旋转了很多。另一个更难以解释的问题是旋转在其跨度的大约两个季度内平滑地工作,但是跳过另外两个。我发现的另一个问题是,如果我旋转矢量的角度很小(在我的测试中,任何过去(1,10)),旋转开始强烈,但减慢并最终停止。这看起来像C#' public double radians() { return Math.Atan2(y, x); } public double len() { return Math.Sqrt(Math.Pow(x, 2) + Math.Pow(y, 2)); } public vector mul(double d) { return new vector(x * d, y * d); } public vector div(double d) { return new vector(x / d, y / d); } public vector unit() { return div(len()); } public vector rotate(vector v) { double theta = v.radians(); return new vector( x * Math.Cos(theta) - y * Math.Sin(theta), x * Math.Cos(theta) + y * Math.Sin(theta)) .unit().mul(len()); // without this, the rotated vector is smaller than the original } 的精确问题,但我试图通过确保旋转矢量的长度不会改变来修复它。

无论如何,如果你能找到我的一个或所有问题的原因,那将非常感激。

1 个答案:

答案 0 :(得分:0)

我通过更改radians()rotate()函数解决了我的问题。其他功能都很好。

radians()已修复:

public double radians()
{
    return Math.Atan2(x, y); // swap the x and y
}

rotate()已修复:

public vector rotate(vector v)
{
    double theta = v.radians();

    // use the clockwise rotation matrix:
    // |  cos(theta) sin(theta) |
    // | -sin(theta) cos(theta) |
    return new vector(
        x * Math.Cos(theta) + y * Math.Sin(theta),
        x * -Math.Sin(theta) + y * Math.Cos(theta));
}

这解决了跳过,向后旋转,长度缩短和停止的问题。

希望这有助于像我这样的人。