You need to enable JavaScript to run this app. Java实现鼠标移动时点绕指定中心点旋转的代码Bug解决
优惠活动
大模型
产品
解决方案
定价
更多

Java实现鼠标移动时点绕指定中心点旋转的代码Bug解决

核心问题定位

你的代码存在直接导致旋转异常的书写错误,这也是仅x=y坐标点旋转正常的根本原因:

  • 旋转矩阵公式书写错误
    平面点绕任意中心旋转的完整计算逻辑为:
    1. 将原始全局坐标平移为相对于旋转中心的局部坐标:localX = x - centerx,localY = y - centery
    2. 对局部坐标应用旋转矩阵变换:
      • rotatedLocalX = localX * cosθ - localY * sinθ
      • rotatedLocalY = localX * sinθ + localY * cosθ
    3. 将旋转后的局部坐标平移回全局坐标系,得到最终坐标:newX = rotatedLocalX + centerx,newY = rotatedLocalY + centery
      对比现有代码,你在所有计算旋转后Y坐标的语句中,本该参与运算的localX(即x - centerx)被错写成了localY(即y - centery)。这种错误下,仅当localX = localY(也就是坐标x值等于y值的对角线点)时,错误公式的计算结果和正确公式结果数值相等,才会表现为旋转正常;非对角线点因为x、y局部值不相等,会完全丢失旋转维度的偏移分量,最终出现坐标往复运动、穿越中心点的异常。
  • 存在笔误隐患
    计算测试点(100,150)的旋转后X坐标时,你把公式末尾本该加上的centerx错写成了centery。在当前测试用例中,因为centerx和centery数值相等(均为125),这个笔误不会引发额外偏移,但如果后续调整旋转中心的x、y坐标不相等,会直接导致X坐标计算错误。
  • 存在变量覆盖导致的计算污染风险
    你直接将旋转结果赋值回原始坐标变量的写法,一旦修正了Y坐标的公式错误,会立刻触发计算偏差:计算完X坐标后,原始的局部X值会被新值覆盖,后续计算Y坐标时再读取原X值就会拿到被污染的错误数值,无法得到正确的旋转结果。
修正后的可运行示例代码
int centerx = 125, centery = 125;
// 鼠标角度计算逻辑本身无问题,可直接保留
int mousex, mousey; // 实际使用时替换为真实鼠标坐标值
double dx = mousex - centerx;
double dy = mousey - centery;
double theta = Math.atan2(dy, dx);

// 预定义测试点原始坐标
int onex = 100, oney = 100;
int twox = 150, twoy = 100;
int threex = 100, threey = 150;
int fourx = 150, foury = 150;

// 逐点计算时,先缓存原始局部坐标,避免变量被覆盖
// 计算(100,100)旋转后坐标
double localOneX = onex - centerx;
double localOneY = oney - centery;
onex = (int) (localOneX * Math.cos(theta) - localOneY * Math.sin(theta) + centerx);
oney = (int) (localOneX * Math.sin(theta) + localOneY * Math.cos(theta) + centery);

// 计算(150,100)旋转后坐标
double localTwoX = twox - centerx;
double localTwoY = twoy - centery;
twox = (int) (localTwoX * Math.cos(theta) - localTwoY * Math.sin(theta) + centerx);
twoy = (int) (localTwoX * Math.sin(theta) + localTwoY * Math.cos(theta) + centery);

// 计算(100,150)旋转后坐标
double localThreeX = threex - centerx;
double localThreeY = threey - centery;
threex = (int) (localThreeX * Math.cos(theta) - localThreeY * Math.sin(theta) + centerx);
threey = (int) (localThreeX * Math.sin(theta) + localThreeY * Math.cos(theta) + centery);

// 计算(150,150)旋转后坐标
double localFourX = fourx - centerx;
double localFourY = foury - centery;
fourx = (int) (localFourX * Math.cos(theta) - localFourY * Math.sin(theta) + centerx);
foury = (int) (localFourX * Math.sin(theta) + localFourY * Math.cos(theta) + centery);
弧度与角度的转换说明

Java标准库的Math.cos()、Math.sin()方法仅接受弧度值作为入参,不存在直接传入角度值参与计算的接口,换算关系为:

  • 弧度转角度:角度值 = 弧度值 * (180.0 / Math.PI)
  • 角度转弧度:弧度值 = 角度值 * (Math.PI / 180.0)
    如果需要用角度值定义旋转角,只需要在调用三角函数前,把角度值按上述公式转回弧度即可,计算逻辑和基于弧度的旋转完全一致。

内容的提问来源于stack exchange,提问作者JJZ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.31 09:15:04