2012-02-09 38 views
1

我知道这不是一个硬性触发问题,但可悲的是我数学迟缓。沿已知角度绘制已知距离的线

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

我已经google'd广泛,并找到了一些解决方案,但它只是没有为我而来。

这是我应得的角度:

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

“事件”是一个鼠标点击。

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

你甚至不必处理弧度/度数。回到正弦和余弦的几何定义:正弦为,余弦为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; 
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)。

这里是发生了什么事情:

  1. 计算,从(400,400)进入到鼠标点击的载体(这是(DX,DY))
  2. 规模的载体,因此50个像素长
  3. 轮缩放的载体中,从而它具有整数长度在x和y
  4. 添加缩放的,圆形的矢量(400,400)来计算的结束点
+0

非常感谢!这工作完美。这个答案更有意义,然后与角度混杂。 – user1198765 2012-02-09 04:58:07

1

错误在你的代码是您在使用度,而Math.cosMath.sin需要radians说法。
使用Math.toRadians而不是Math.toDegrees,您的代码将开始工作。