0

我试图进入一些基本的 JavaFX 游戏开发,但我对一些循环数学感到困惑。

我在 (x:250, y:250) 有一个半径为 50 的圆。

我的目标是根据鼠标的位置在上述圆圈的圆周上制作一个较小的圆圈。

我感到困惑的是坐标空间和它背后的Trig。

我的问题来自屏幕上的 X/Y 空间未以 0,0 为中心。但屏幕左上角是 0,0,右下角是 500,500。

我的计算是:

var xpos:Number = mouseEvent.getX();
var ypos:Number = mouseEvent.getY();

var center_pos_x:Number = 250;
var center_pos_y:Number = 250;

var length = ypos - center_pos_y;
var height = xpos - center_pos_x;

var angle_deg = Math.toDegrees(Math.atan(height / length));
var angle_rad = Math.toRadians(angle_deg);

var radius = 50;

moving_circ_xpos = (radius * Math.cos(angle_rad)) + center_pos_x;
moving_circ_ypos = (radius * Math.sin(angle_rad)) + center_pos_y;

我让应用程序打印出我在移动鼠标时计算出的角度(angle_deg),我的输出如下:

当鼠标(以度为单位逆时针移动)时:

  • 在圆的正上方并与中心水平对齐,角度为-0
  • 向左垂直居中,角度为-90
  • 在圆的正下方并与中心水平对齐,角度为 0
  • 向右垂直居中,角度为 90

那么,我该怎么做才能使其成为 0、90、180、270?

我知道它一定是小东西,但我就是想不出它是什么......

感谢您的帮助(不,这不是任务)

4

3 回答 3

4

atan(height/length)是不够的角度。您需要补偿每个象限,以及“被零除”的可能性。大多数编程语言库都提供一个名为的方法atan2,该方法接受两个参数;yx。此方法为您执行此计算。

有关维基百科的更多信息:atan2

于 2008-11-06T04:14:11.940 回答
3

你可以在不计算角度的情况下离开。而是使用圆心 (250,250) 和鼠标位置 (xpos,ypos) 来定义一条线。当它的长度等于你的圆的半径时,这条线与你的圆相交:

// 计算中心到鼠标的距离。
xlen = xpos - x_center_pos;
ylen = ypos - y_center_pos;

line_len = sqrt(xlen*xlen + ylen*ylen); // 毕达哥拉斯:x^2 + y^2 = 距离^2

// 找到与圆的交点。
move_circ_xpos = x_center_pos + (xlen * radius / line_len);
move_circ_ypos = y_center_pos + (ylen * radius / line_len);

只需验证鼠标不在圆圈的中心,否则 line_len 将为零,鼠标将被吸入黑洞。

于 2008-11-06T04:37:47.010 回答
0

有一本名为“Graphics Gems”的好书可以帮助解决这类问题。它是算法和源代码的食谱(在 CI 思维中),允许您使用经过测试的功能快速解决问题。我完全建议您动手使用它 - 当我需要快速添加代码以对表面的法线和碰撞检测进行相当复杂的操作时,它为我节省了大量时间。

于 2008-11-06T04:45:32.970 回答