Хотя тригонометрия является одним из подходов к математике, она проще и требует гораздо меньше ресурсов процессора, чтобы сделать это с векторами.
Изображение для справки:
Центром циферблата, который вы хотите вращать, является точка C .
Из пользовательского интерфейса вы должны получить начальную точку прокрутки A и «вектор прокрутки» s , который показывает, как движется палец пользователя. Если ОС предоставляет только вторую точку B через некоторое время после A , то вычисляется s = B - A .
Вы хотите вычислить компонент s , который является касательной к окружности с центром в C , проходящей через A . Это позволит пользователю начать свое движение в любом месте и рассматривать его как крутящий момент около точки C . Это должно быть интуитивно понятно.
Это не сложно. Радиус круга отображается в виде вектора r = A - C . Перпендикуляр к этому вектору называется «r perp», обозначенный на рисунке символом «чертёжная кнопка». Это просто точка (-y, x), где x и y являются компонентами r .
Длина проекции со знаком p на perp ( r ) со знаком является просто нормализованным точечным произведением:
Это скаляр, который положителен, если вращение против часовой стрелки вокруг C , и отрицателен, если по часовой стрелке. Так что знак говорит вам направление вращения. Абсолютное значение говорит вам, сколько или как быстро вращаться.
Предположим, у нас уже есть вектор смахивания s , сохраненный как sx
и sy
и центр C как cx
и cy
. Тогда псевдокод просто:
r_perp_x = cy - ay; r_perp_y = ax - cx;
signed_length_p = (sx * r_perp_x + sy * r_perp_y) / sqrt(r_perp_x ^ 2 + r_perp_y ^ 2)
Желаемое число signed_length_p
.
Единственное предостережение - игнорировать прикосновения A , близкие к C . Они могут давать очень большие выходные значения или деление на ноль. Это легко исправить. Просто проверьте длину r и выйдите, если она меньше некоторого разумного значения.