0

我正在研究一个当用户触摸它并拖动它时会旋转的表盘。到目前为止一切顺利,但是当刻度盘超过 360 度时,该值又回到 0,使动画围绕刻度盘向后跳,而不是继续。

dialRotation = (atan2(event->localY()-circleCenterY, event->localX()-circleCenterX) * (180/M_PI));

有谁知道如何阻止它跳?

4

2 回答 2

0

您可以使用现有值来确定是否应该超过 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 对负数的行为感到困惑,所以一定要检查一下。

于 2012-11-04T17:04:51.350 回答
0

另一种方法是获取先前值和当前值之间的增量(更改),然后将其添加到您已有的值中。只要差异不大于 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;

让我知道这是否有效。

于 2012-11-04T23:17:12.423 回答