java - 如何根据鼠标坐标(JavaFX)沿着围绕固定中心的圆形轨道定位节点?

标签 java geometry javafx trigonometry javafx-1

我正在尝试进行一些基本的 JavaFX 游戏开发,但我对一些圆形数学感到困惑。

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

我的目标是根据鼠标的位置制作一个较小的圆,并将其放置在上述圆的圆周上。

我感到困惑的是坐标空间和它背后的三角函数。

我的问题来自于屏幕上的 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?

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

感谢您的帮助 (不,这不是作业)

最佳答案

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

有关 Wikipedia: atan2 的更多信息

关于java - 如何根据鼠标坐标(JavaFX)沿着围绕固定中心的圆形轨道定位节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/267613/

相关文章:

c++ - 用SDL2画圆吗?

JavaFX 分页 : setPageCount(int) calls the page factory again but does not show the page

JavaFX - TableCell 中带有添加数据按钮的单选按钮

select - 在 JavaFX 中搜索 TableView 列表

java - 代码并没有完全按照我想要的方式执行。提前退出循环

java - 自定义 POJO 的 Guava 缓存

java - XStream:如何忽略空格

c - 使用 nrel 计算太阳高度

java - Java 中的两个类之间如何使用接口(interface)进行通信?

javascript - 计算贝塞尔曲线下的面积