Java:按指定度数旋转点围绕另一点旋转

4

我将尝试在Java中旋转2D点,使其绕另一点旋转指定度数。在这种情况下,只需绕点(0, 0)旋转90度。

方法:

public void rotateAround(Point center, double angle) {
    x = center.x + (Math.cos(Math.toRadians(angle)) * (x - center.x) - Math.sin(Math.toRadians(angle)) * (y - center.y));
    y = center.y + (Math.sin(Math.toRadians(angle)) * (x - center.x) + Math.cos(Math.toRadians(angle)) * (y - center.y));
}

期望结果为(3,0):X = 0,Y = -3

返回结果为(3,0):X = 1.8369701987210297E-16,Y = 1.8369701987210297E-16

期望结果为(0,-10):X = -10,Y = 0

返回结果为(0,-10):X = 10.0,Y = 10.0

方法本身是否有问题?我将该函数从Lua中旋转二维点的方法移植到Java。

编辑:

进行了一些性能测试。 我本以为向量解决方案会输,但它获胜了,所以我将使用这个。

2个回答

11
如果您可以访问java.awt,那么这只是…
double[] pt = {x, y};
AffineTransform.getRotateInstance(Math.toRadians(angle), center.x, center.y)
  .transform(pt, 0, pt, 0, 1); // specifying to use this double[] to hold coords
double newX = pt[0];
double newY = pt[1];

它足够快吗?我需要这个方法在游戏中运行得非常快。本地程序似乎并没有那么针对性能进行优化。 - Aich
AWT是为图形而构建的,通常意味着游戏 - 所以,我不会担心。 - Louis Wasserman

2

在计算Y值之前,您正在改变center的X值。请使用临时点。

此外,该函数需要三个参数。为什么您的只有两个?


在Lua代码中,第一个参数是要移动的点。那里的函数似乎没有绑定到类,就像PHP一样。在我的Java代码中,第一个参数出现在方法调用之前,point.rotateAround(center, angle)。 - Aich
1
你能发一下你的新代码吗?因为@Peter已经正确地解释了为什么你的代码没有做正确的事情。听起来你可能没有正确理解他要求你做的事情。 - Dawood ibn Kareem
1
@Peter @Davidpublic class Point { double x, y; public Point(double x, double y) { this.x = x; this.y = y; } public void rotateAround(Point center, double angle) { double tempx = center.x + (Math.cos(Math.toRadians(angle)) * (x - center.x) - Math.sin(Math.toRadians(angle)) * (y - center.y)); double tempy = center.y + (Math.sin(Math.toRadians(angle)) * (x - center.x) + Math.cos(Math.toRadians(angle)) * (y - center.y)); x = tempx; y = tempy; } public String toString() { return "Point { X = " + String.valueOf(x) + ", Y = " + String.valueOf(y) + " }"; } } - Aich
例如,围绕 <0,0> 旋转 90* 的 <10,0> 返回 <6.123,10>,而我期望的是 <0,-10>。你用这些值得到正确的坐标了吗? - Aich
1
好的,那不是6.123...,而是6.123 x 10^-16。这是一个很小的数字,并且只是在处理浮点数时所预期的通常的不准确性。也就是说,它实际上与零无法区分。而y为什么会输出为10而不是-10,是因为您的公式是逆时针旋转的;所以从(10,0)向90度旋转会得到(0,10)。 - Dawood ibn Kareem
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接