calculateEndRotate function
double
calculateEndRotate(
- RouletteGroup group,
- int targetIndex,
- bool clockwise,
- int minRotateCircles, {
- double offset = 0,
Calculate the end rotate value by targetIndex
.
The returned value contains the circles to roll.
Make sure when you run this method the group
has at least one RouletteUnit.
group
is the RouletteGroup to run rotate animation.
targetIndex
is the end index in the group
.
clockwise
determin whether the animator should run in closewise didrection.
minRotateCircles
circles rolled before.
random
Provide a random number generator for randomization, default null and no random value.
Implementation
double calculateEndRotate(
RouletteGroup group,
int targetIndex,
bool clockwise,
int minRotateCircles, {
double offset = 0,
}) {
final units = group.units;
assert(units.isNotEmpty, "You cannot roll an empty roulette.");
assert(
targetIndex >= 0 && targetIndex < group.divide,
"targetIndex is out of group range.",
);
final passUnits = clockwise
? units.reversed.take(group.divide - targetIndex - 1)
: units.take(targetIndex);
final preRotation = minRotateCircles * 2 * pi;
final totalRotateWeight =
passUnits.sum((unit) => unit.weight); // Weights should rotate
final targetRotate = 2 * pi * totalRotateWeight / group.totalWeights;
final targetCoverRotate =
2 * pi * units[targetIndex].weight / group.totalWeights;
var offsetValue = offset * targetCoverRotate; // Random rotate out
final totalRotate = preRotation + targetRotate + offsetValue;
return clockwise ? totalRotate : -totalRotate;
}