Вы хотите, чтобы импульс уменьшился из-за трения; трение - это сила, которая является функцией скорости. Технически, у вас есть дифференциальное уравнение. Однако не стоит вкладывать в это слишком много внимания, потому что решение, вероятно, легче найти, просто взмахнув рукой.
Итак: сохранить текущий угол и текущую угловую скорость. n раз в секунду (возможно, через NSTimer
или CADisplayLink
) прибавьте угловую скорость к углу, затем умножьте угловую скорость на что-то, чтобы сделать ее меньше - например, 0,995. Константы, близкие к 1.0, замедляют процесс; если вы пойдете выше 1,0, он, очевидно, ускорится. По сути, это форма интеграции Эйлера, но, опять же, об этом не стоит беспокоиться.
Возможно, также стоит установить минимальный предел угловой скорости, чтобы, если она упадет ниже, скажем, 0,01 радиана / секунду, вы снизите ее до 0. Это эффективно немного изменит вашу модель трения для перехода от кинетического к статическому трению при подходящий момент и действует как буферная зона точности с плавающей запятой.
Чтобы получить начальную скорость от перетаскивания, вы можете просто обработать вектор от центра колеса до начала перетаскивания, повернуть этот вектор на 90 градусов, сделать с ним точечное произведение, вектор перетаскивания и масштабировать в соответствии с к расстоянию от центра.