2012-02-21 10 views
1
public void TurnTowardsPoint(double DestinationX, double DestinationY) 
{ 
    int distX = (int) (DestinationX - x); 
    int distY = (int) (DestinationY - y); 

    double angleRadians = Math.atan2(distY, distX); 
    int angleDegrees = (int)Math.toDegrees(angleRadians); 

    //angleDegrees = Math.abs(angleDegrees); 

    Log.w("Angle", Integer.toString(angleDegrees)); 
    Log.w("Degrees", Integer.toString((int) this._degrees)); 

    if((this._degrees) - 360 != angleDegrees) 
    { 
     if(this._degrees >= 0) 
     { 
      RotateItem(true); 
     } 
     else 
     { 
      RotateItem(false); 
     } 


    } 
} 

RotateItem(trueは時計回りのfalseは反復で、それ以外の場合は0にリセットされますが、これは変更可能です)。角度と度からより低い回転値を得る

私が達成しようとしているのは、角度の起点を指すときに&も回転する最短の方法を得ることです。

私はこれで2,3時間前から問題を抱えていましたが、私は学校で三角法を学んだことがありませんでしたので、ときには何を使うのか理解しているコンセプトに苦しんでいます。 (私はそれを読んでいる)。

どうすればよいですか?私はオンラインで何かを見つけることができないので、最終的にあきらめなければならず、2時間紙を見つめてどこにいなくても頼んだことがあります。

注:右舷側は360/0Dです。 船がその地点のすぐ下にある場合、それは-90です。船が右にある場合は180Dです。

問題は2 if文にあります。最初のifステートメントは、角度を指しているときに回転を停止する必要があり、2番目のステートメントは、どの方法が最短であるかを決定すると考えられます。それら2つのステートメントは間違っています。

問題はこの部分である:

if((this._degrees) - 360 != angleDegrees) 
    { 
     if(this._degrees >= 0) 
     { 
      RotateItem(true); 
     } 
     else 
     { 
      RotateItem(false); 
     } 


    } 
+1

いいえ、値にはどのような値がありますか?通常は0から360までです。この場合、360から減算すると常に<= 0になります – L7ColWinters

+0

直面度が360の場合も、角度は180度を超えることはありません.180度から180度のようです。船は-90°の直下にあったか、それ以上は角度で+90°になります。 –

答えて

1

オーケー、私が誤解していない場合、あなたはあなたのオブジェクトが現在の整数度に、中を向いている方向を与えるthis._degreesを、持っている、との間に横たわるように正規化0(包括)と360(同値または排他)?また、回転後にオブジェクトが指す方向を計算すると、angleDegreesとなります。

正しく理解していれば、コンベンションは反時計回りの方向が正の方向になるためです(ただし、Y軸が0より大きい場合はキャンセルされます)。 angleDegreesがそのとおりであるかどうかを確認して判断するか、否定する必要があります)。

とにかく、angleDegreesは、-180度から180度の範囲で、向きを変えたい方向を示します。方向360の範囲0であるように正規化し、今

if (angleDegrees < 0) { 
    angleDegrees += 360; 
} 

、減算することによって得ることができる有効にするれた量及び方向、

int turn = angleDegrees - this._degrees; 

-360の間に位置をその値を360度(より正確には、-this._degreesangleDegreesの間)である。そして、それは差が-180度または180より大きくよりも小さい場合、それは半回転以上だと、他の方法が短くなり、したがって、私たちはもう一度正常化、

if (turn < -180) { 
    turn += 360; 
} else if (turn > 180) { 
    turn -= 360; 
} 
、まだ最短ターンを与えないかもしれません

今度は-180と180の間になり、希望の方向に最も短いターンを与えます。 turn >= 0場合は、他の反時計回り、時計回りに回すために

boolean clockwise = (turn >= 0); 

たいと今、あなただけabs(turn)度、例えばを回転させる必要があり

int amount = (turn < 0) ? (-turn) : turn; 
for(int i = 0; i < amount; ++i) { 
    RotateItem(clockwise); 
} 
+0

問題を解決するために時間を割いていただきありがとうございます。あなたの説明は素晴らしいです:-)。私は今それを適用しています。 –

関連する問題