私はあなたが何を求めているかを理解しています。
したがって、
approach()
の場合、パラメータ "current"は現在の角度を示します。パラメータ「目標」は、所望の角度を示す。パラメータ「デルタ」は、角度が「目標」に到達しなければならない時間(秒を想定)を示す。今
、あなたは、単にこのような何かを行うことができます角度への最短経路を計算するために:私たちはあなたの必要な値(現在= 45、目標を取る場合ので、私たちが実際に動作することをテストすることができ
if(current + (360 - goal) <= 180) // If goal is 180° away it will rotate to the right automatically.
// ... Rotate to the right
else
// ... Rotate to the left
を= 315)、上記の計算を正しく実行する必要があります。
45 + (360 - 315) <= 180
45 + 45 <= 180
90 <= 180, true.
We turn it right.
デルタに基づいてローテーション量を計算するだけです。これはかなり簡単です。
"totalAngle"を変数として宣言し、現在の角度と目的地の角度の差を記録します。この変数はif/elseコードブロックに割り当てます。また、私は回転する必要がある方向を追跡するのに役立つブール値を宣言します。
boolean rotateRight;
float totalAngle;
if(current + (360 - goal) <= 180) {
totalAngle = current + (360 - goal);
rotateRight = true;
}
else {
totalAngle = goal - current;
rotateRight = false;
}
は、今では1秒に1回回転すると仮定すると、私はtotalAngleを取り、(別名「デルタ」パラメータ)渡された秒数で割ります。次に、私は "現在の"パラメータを変更し、それを返します。
public static float approach(float current, float goal, float delta) {
boolean rotateRight;
float totalAngle;
if(current + (360 - goal) <= 180) {
totalAngle = current + (360 - goal);
rotateRight = true;
}
else {
totalAngle = goal - current;
rotateRight = false;
}
current -= rotateRight ? (totalAngle/delta) : -(totalAngle/delta);
return current;
}
編集:
current -= rotateRight ? (totalAngle/delta) : -(total/delta);
エンド機能は、次のようになります最短経路が実際に最長であれば、と仮定し "現在 - (360 - 目標)< = 180" があります左回転、右ではありません&逆です。
ありがとうございます!これはほとんどの部分で機能します!申し訳ありませんが、私はapproach()関数を非常に明確にしませんでした。関数のデルタパラメータは、実際に目標角度に向かって回転させたい角度です。しかし、あなたの実装はこのために調整するのが簡単です。 – ASasseCreations
問題ありません!お役に立てて嬉しいです :) – Nepromine