寻找位置所需的变化以围绕圆周#2移动

时间:2013-06-07 19:14:53

标签: java math methods geometry

我昨天也问过这个,并被告知我需要使用弧度。我认为这是答案,但下面的代码似乎确实存在另一个问题。我正在尝试编写一种方法,允许我的角斗士旋转两者之间的中心点,以便相互圈出。以下是我的代码。角斗士变量目标是角斗士类型,并在旋转中设置为第二方。 center [0]是x位置,center [1]是y。

public void rotate(Gladiator a, int angle) {
    double x1;
    double y1;
    double x2;
    double y2;
    double r;
    double midx;
    double midy;
    int currentAngle;

    r = getDistance(a,a.target)/2;
    midx = (a.center[0]-a.target.center[0])/2;
    midy = (a.center[1]-a.target.center[1])/2;
    currentAngle = (int)Math.toDegrees(Math.atan2(a.center[1] - midy, a.center[0] - midx));

    x1 = Math.cos(Math.toRadians(currentAngle+angle)) * r;
    y1 = Math.sin(Math.toRadians(currentAngle+angle)) * r;
    x2 = Math.cos(Math.toRadians(currentAngle+angle)) * -r;
    y2 = Math.sin(Math.toRadians(currentAngle+angle)) * -r;
    a.move((int)x1,(int)y1);
    a.target.move((int)x2,(int)y2);


}

有人认为这有什么问题吗?目前,他们最终会遇到我认为是我圈子中间的东西,比他们更接近。有什么想法吗?

编辑:此外,我目前正在运行两次......每个参与角斗士一次。我可以做到这一点,让它们每次旋转一半所需的量,但如果我可以将它们作为一个整体旋转然后从我正在迭代的角斗士列表中排除第二方将更好。什么是最简单的实现?

Edit2:我认为我的部分问题在于我没有在我的atan2等式上调用Math.toDegrees。我注意到它没有获得除0之外的任何新角度值,现在它是。还是有一些问题。它们从水平旋转到垂直,但在每次旋转时彼此移动得更远,一旦它们达到垂直对齐,它们最终会向另一个方向旋转几度(而不是45度,我当前的输入),然后得到很多像以前一样靠得更近。

Edit3:请注意,move方法的参数是所需的更改,而不是实际坐标。

1 个答案:

答案 0 :(得分:1)

我发现你经常使用int,因为根据angle可能会卡住,所以要非常小心。

我快速重写以简化重复并使用推荐的弧度逻辑。 (未测试)。

我还将您的位置转换为double,以避免奇数整数运算问题。 (您的midx / midy计算位于int数学)

完成后我意识到你正在转动(0,0)而不是中点,你的中间变量被混淆地命名。

//I would do double inline with the initialization, but left here in case you had another reason
double x1,y1, x2,y2, r, midx,midy, newAngle;

x1 = a.center[0];
y1 = a.center[1];
x2 = a.target.center[0];
y1 = a.target.center[1];

r = getDistance(a, a.target)/2;
midx = x1 + (x2 - x1)/2;
midy = y1 + (y2 - y1)/2;

newAngle = Math.toRadians(angle) +
           Math.atan2(midy, midx);

x1 = Math.cos(newAngle) * r + midx;
y1 = Math.sin(newAngle) * r + midy;
x2 = Math.cos(newAngle) * -r + midx;
y2 = Math.sin(newAngle) * -r + midy;
a.move((int)x1,(int)y1);
a.target.move((int)x2,(int)y2);