0

我昨天也问过这个问题,并被告知我需要使用弧度。我以为这是答案,但下面的代码似乎确实存在另一个问题。我正在尝试编写一种方法,该方法允许我的角斗士在两者之间旋转一个中心点,可以说是相互环绕。下面是我的代码。角斗士变量目标是角斗士类型,设置为轮换中的第二方。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:请注意,移动方法的参数是所需的更改,而不是实际坐标。

4

1 回答 1

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);
于 2013-06-07T19:58:01.817 回答