java - 找到绕圆圆周移动所需的位置变化#2

标签 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方法的参数是需要改变的,而不是实际的坐标。

最佳答案

我发现您经常使用 int,请务必小心,因为您可能会因角度而陷入困境。

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

我还将您的位置转换为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);

关于java - 找到绕圆圆周移动所需的位置变化#2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16991379/

相关文章:

java - GC 如何阻止新创建的内存/对象在 GC 周期期间进行清理 (Java/C#)

java - 如何将 MultipartFile 转换为所需类型 byte[]

javascript - 使用 BigInt 进行数学计算时的精度问题

mysql - MySQL 中的递归数学

javascript - 从另一个调用 javascript 原型(prototype)方法

java - ViewPager 的 fragment 被隐藏

2台机器上的Java调试

algorithm - 替换方法 : Why this recurrence changes inequality & equality sign And Why inductive step used smaller values as a next value

java - 引用构造函数而不重置参数值?

c# - 在方法中抛出异常会导致方法返回吗?