沿着已知角度绘制已知距离的线

时间:2012-02-09 04:35:21

标签: java trigonometry javafx-2

我知道这不是一个严重的问题,但遗憾的是我是数学迟钝的。

我需要从一个已知角度的已知起点到未知终点绘制一条50像素的线。角度来自起点(400,400)和鼠标点击;需要朝着鼠标单击绘制线条,但是朝向点击仅需50个像素。

我已经广泛地进行了谷歌搜索并找到了许多解决方案,但它并没有为我提供帮助。

以下是我如何获得角度。:

float angle = (float) Math.toDegrees(Math.atan2(400 - event.getY(), 400 - event.getX()));
float angleInDegrees = (angle + 270) % 360;

“event”是鼠标点击。

float endX = 250 + 50 * (float)Math.cos(angleInDegrees);
float endY 250 + 50 * (float)Math.sin(angleInDegrees);

line.setStartX(400);
line.setStartY(400);
line.setEndX(endX);
line.setEndY(endY);

我发现的一切都围绕着Math.cos和Math.sin,但我仍然没有得到它。我认为这个问题与将弧度映射到场景坐标有关,但我不确定。所以人们,我以什么方式愚蠢?我很感激任何帮助。

3 个答案:

答案 0 :(得分:5)

我不会为角度而烦恼。您只需使用比率即可:

int startX = 400;
int startY = 400;
int dx = event.getX() - startX;
int dy = event.getY() - startY;
float distToTarget = Math.sqrt(dx * dx + dy * dy);
float ratio = 50 / distToTarget;
int endX = startX + Math.round(ratio * dx);
int endY = startY + Math.round(ratio * dy);

然后从(startX,startY)绘制到(endX,endY)。

这是&#39>正在进行的事情:

  1. 计算从(400,400)到鼠标单击的向量(这是(dx,dy))
  2. 缩放矢量,使其长度为50像素
  3. 对缩放的向量进行舍入,使其在x和y
  4. 中具有整数长度
  5. 将缩放的圆形矢量添加到(400,400)以计算终点

答案 1 :(得分:3)

你甚至不需要处理弧度/度数。回到正弦和余弦的几何定义:正弦是opposite/hypotenuse,余弦是adjacent/hypotenuse。 (“相反”和“相邻”表示右三角形的腿分别与您正在拍摄正弦或余弦的角度相对且相邻)。

所以:

float opposite = event.getY() - 400;
float adjacent = event.getX() - 400;
float hypotenuse = Math.sqrt(opposite*opposite + adjacent*adjacent);

float cosine = adjacent/hypotenuse;
float sine = opposite/hypotenuse;

float endX = 400 + 50 * cosine;
float endY = 400 + 50 * sine;

答案 2 :(得分:1)

代码中的错误是您使用学位,而Math.cosMath.sin需要radians中的参数。
使用Math.toRadians代替Math.toDegrees,您的代码就会开始运作。