Довольно легко нарисовать контрольные точки и позволить пользователю перетаскивать их.К сожалению, кривая не проходит все контрольные точки, поэтому опыт не совсем соответствует тому, что вы предлагаете.
Чтобы сделать то, что вы предлагаете, вам сначала нужно ответить на вопрос "этопользователь касается кривой? "Это то же самое, что и вопрос «является ли данная точка на определенном расстоянии от кривой».Это не тривиальный вопрос, но он может быть рассчитан.Вероятно, самый простой подход состоит в том, чтобы просто вычислить точки X вдоль кривой (где X достаточно высоко, чтобы дать вам разумную точность), и проверить расстояние для каждой из них.В принципе, вы также можете взять производную уравнения расстояния и решить ее для нулей, но это требует итерации.По моему опыту, вы можете достаточно быстро рассчитать необходимые 1000 или около того расстояний (даже на iPad 1), чтобы это не стоило дополнительной сложности.
Как только вы обнаружите, что пользователь фактически касается кривой, легко определить, какая контрольная точка находится ближе всего.Сложнее всего на этом этапе решить, что с этим делать.Некоторые параметры:
- Перемещение ближайшей контрольной точки в направлении, в котором движется пользователь.Возможно, вам придется выполнить несколько вычислений, пока не найдете новую кривую, которая проходит через точку касания.Это самый простой подход, и, вероятно, я бы начал с него.
- Вы можете разделить кривую в точке касания и переместить вновь созданные конечные точки.(См. алгоритм де Кастельжау для этого.) Это будет иметь тенденцию создавать острые углы, если вы не отрегулируете другие контрольные точки для создания согласованных уклонов.Это допускает больше произвольных кривых, но может быть очень трудно понять, чего на самом деле хочет пользователь.Вы также почти наверняка должны будете применить Ramer-Douglas-Peucker , чтобы не допустить взрыва числа кривых.
В настоящее время меня очень интересуют проблемы с кривыми Безье в Objective-С.Вас может заинтересовать мой первый пост на эту тему .Моя первоначальная работа в этой области доступна на GitHub в примере кода iOS: PTL .Надеюсь, у меня будет еще один пост на этой неделе.Ваша конкретная проблема интересна, поэтому я могу посмотреть, что я могу построить вокруг этого.