ユーザーがタッチしてドラッグすると回転するダイヤルに取り組んでいます。ここまでは順調ですが、ダイヤルが 360 を超えると値が 0 に戻り、アニメーションが続行せずにダイヤルの周りを後方にジャンプします。
dialRotation = (atan2(event->localY()-circleCenterY, event->localX()-circleCenterX) * (180/M_PI));
ジャンプを止める方法を知っている人はいますか?
ユーザーがタッチしてドラッグすると回転するダイヤルに取り組んでいます。ここまでは順調ですが、ダイヤルが 360 を超えると値が 0 に戻り、アニメーションが続行せずにダイヤルの周りを後方にジャンプします。
dialRotation = (atan2(event->localY()-circleCenterY, event->localX()-circleCenterX) * (180/M_PI));
ジャンプを止める方法を知っている人はいますか?
それを行う別の方法は、以前の値と現在の値の間のデルタ (変化) を取得し、それを既存のものに追加することです。差が 180 度を超えない限り、うまくいく可能性があります。このようなもの:
// In your class declaration:
float normalizedRotation; // Always between 0 and 360 degrees
float previousNormalizedRotation;
float dialRotation; // current value, can be any valid value from -inf to +inf
// In your method:
normalizedRotation = (atan2(event->localY()-circleCenterY, event->localX()-circleCenterX) * (180/M_PI));
if (normalizedRotation < 0.0) normalizedRotation += 360.0;
float delta = normalizedRotation - previousNormalizedRotation;
previousNormalizedRotation = normalizedRotation;
dialRotation += delta;
それがうまくいくかどうか教えてください。
既存の値を使用して、360 を超える必要があるかどうかを判断できます。おそらく次のようなものです:
currentValue = dialRotation;
dialRotation = (atan2(event->localY()-circleCenterY, event->localX()-circleCenterX) * (180/M_PI));
dialRotation = 360.0 * floor(fmod(currentValue, 360.0)) + dialRotation;
これは負の方向にも機能すると思いますが、fmod()
負の数に対する s の動作に混乱することがあるので、必ず確認してください。