轮换 - 缺乏精确度 - Java

时间:2014-03-08 21:06:06

标签: java rotation double

我有一个代表一个点的类(x和y坐标是双重类型)和一个围绕另一个点旋转点的函数:

public Point2D rotate(double angle, Point2D origin) {
    double sin = Math.sin(angle);
    double cos = Math.cos(angle);

    x -= origin.getX();
    y -= origin.getY();

    x = x*cos - y*sin;
    y = x*sin + y*cos;

    x += origin.getX();
    y += origin.getY();

    return this;
}

然而,当我多次重复旋转(即1度)时,我失去了很多精度。例如:

    Point2D point = new Point2D(10, 10);
    System.out.println(point);
    for(int i = 0; i < 360; i++)
        point.rotate(Math.toRadians(1), new Point2D(300, 150));
    System.out.println(point);

结果:

[10.0, 10.0]
[25.5048671135757, 17.40466547204096]

你知道如何解决这个问题吗?提前谢谢。

1 个答案:

答案 0 :(得分:0)

首先,你的公式出现错误......

x = x*cos - y*sin;

修改x的值,修改后的值用于下一行

y = x*sin + y*cos;

你必须使用一个临时变量来存储x和y的新值,这就是user2602548对他的消息的意义。 我猜你已经使用了double,因为否则你需要使用强制转换为这两行。

如果你修复了算法错误,你会得到类似[9.99999999999659,9.999999999998778]的内容。

如果这对你来说不够好,你可以在旋转之后进行回合,如果这还不够好,可以使用提供三角函数的lib,如apfloat更精确。

将BigDecimal用于该问题不会给你更多的精度,因为这里的问题是sin()和cos()的结果仍然只是双精度。