如何定位的一个节点沿着一个圆形的轨道上围绕一个固定中心的基础上鼠标(系统)?

StackOverflow https://stackoverflow.com/questions/267613

我试图进入一些基本样的游戏发展,我感到困惑的一些圈子的数学。

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

我的目标是使一个小圈子要放在周长的上述圆基于的位置老鼠。

在那里即时得到困惑的是,与协调空间和触发这一切的背后。

我的问题来自一个事实,即X/Y空间的屏幕是不是集中在0,0.但是左边的屏幕是0,0和右是500、500a.

我的计算是:

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??

我知道它必须是一些小事情,但是我只是不能认为它是什么...

谢谢你任何帮助 (不,这不是一个分配)

有帮助吗?

解决方案

atan(height/length) 是不足以获得角度。你需要弥补每一个象限,以及可能的"司的零"。最编程语言的图书馆提供一个方法被称为 atan2 这需要两个参数; yx.这种方法不会这样计算。

更多信息 维基百科:atan2

其他提示

你可以离开而不计算的角度。相反,使用该中心的你的圈子(250、250a)和鼠标的位置(xpos,ypos)来定义的一线。线相交你的圈子时,其长度相等的半径圈:

// Calculate distance from center to mouse.
xlen = xpos - x_center_pos;
ylen = ypos - y_center_pos;

line_len = sqrt(xlen*xlen + ylen*ylen);  // Pythagoras: x^2 + y^2 = distance^2

// Find the intersection with the circle.
moving_circ_xpos = x_center_pos + (xlen * radius / line_len);
moving_circ_ypos = y_center_pos + (ylen * radius / line_len);

只是验证老鼠不是在中心的你的圈子,或line_len将是零和鼠标将被吸进黑洞。

还有一个 伟大的书名为"图形宝石" 这可以帮助这样的问题。这是一个食谱算法和源代码(C我认为),并允许快速解决的一个问题,使用试验的功能。我完全让你得到你的手上它-它救了我很大的时候我很快就需要增加码做到相当复杂的操作法的表面,以及碰撞的检测。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top