我有一个代表一个点的类(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]
你知道如何解决这个问题吗?提前谢谢。
答案 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()的结果仍然只是双精度。