2012-02-09 17 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

ラジアン/度で対処する必要はありません。サインとコサインの幾何学的定義に戻ります。サインはopposite/hypotenuse、コサインはadjacent/hypotenuseです。 (「反対側」および「隣接」は、サインまたはコサインを取っている角度の反対側で、それぞれに隣接する直角三角形の脚を意味します)。

ので:Math.cosMath.sinradiansに引数を必要としながら、あなたのコード内で

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個のピクセルですので、追加それは、xとy
  3. を整数の長さを有するようにスケーリングされたベクトルラウンド
  4. 長いスケーリング、エンドポイントを計算する(400、400)にベクターを丸め
+0

ありがとうございました!これは完全に機能しました。この答えは、角度をつけて回っていた方がはるかに意味がありました。 – user1198765

1

エラーは、あなたが度を使用していることです。
Math.toDegreesの代わりにMath.toRadiansを使用すると、コードが機能し始めます。

関連する問題