我知道这不是一个严重的问题,但遗憾的是我是数学迟钝的。
我需要从一个已知角度的已知起点到未知终点绘制一条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,但我仍然没有得到它。我认为这个问题与将弧度映射到场景坐标有关,但我不确定。所以人们,我以什么方式愚蠢?我很感激任何帮助。
答案 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 :(得分: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.cos
和Math.sin
需要radians中的参数。
使用Math.toRadians
代替Math.toDegrees
,您的代码就会开始运作。