Как подразделить UIBezierPath и сохранить его в двух разных объектах - PullRequest
7 голосов
/ 19 декабря 2011

У меня есть UIBezierPath в приложении. Когда распознается касание пальцем пути, я хочу подразделить эту кривую и сохранить эти две кривые в два разных объекта. Таким образом, сенсорные координаты будут работать в качестве конечной точки для одной кривой и начальной точки для второй кривой.

Опять же, если я коснусь какой-либо из этой кривой, эта кривая разделится на две другие кривые и т. Д.

Я много искал это. Но не смог найти хорошего решения.

Также я понятия не имею, есть ли другой способ сделать это. Любая помощь будет принята с благодарностью. Спасибо

1 Ответ

1 голос
/ 03 апреля 2012

Вы можете сделать это с помощью алгоритма de Casteljau . Если вы действительно в математике этого проверьте страницу Википедии здесь , но если вы не в математике, это, вероятно, запутает вас больше всего, когда это на самом деле довольно просто ...

  1. Рассчитать параметризованное значение вдоль кривой (между 0,0 и 1,0) касания. Для этого вы можете рассчитать набор точек через равные промежутки времени (0,1, 0,2, 0,3 и т. Д.), А затем найти две ближайшие точки к вашим точкам касания и повторить параметризацию между этими точками, если вы хотите большей точности (0,21, 0,22, 0,23 и т. Д.). Это приведет к числу от 0,0 до 1,0 вдоль сегмента кривой, представляющему, где вы коснулись.
  2. Этот бит трудно объяснить в тексте, но есть хорошая визуализация на этой странице примерно на полпути вниз под заголовком Подразделение кривой Безье . Используйте ползунок под диаграммой, чтобы увидеть, как он работает, вот мое текстовое объяснение: вам нужно разделить прямые линии между контрольными точками вашего сегмента кривой пропорционально параметризованному значению, которое вы вычислили на шаге 1. Итак, если вы вычислили 0,4, вы Имея четыре точки (A, B, C, D) плюс точку разделения на кривой, ближайшей к вашему касанию, в точке 0,4 вдоль кривой, мы назовем эту точку разделения S:
    • Рассчитать временную точку T, которая равна 0,4 вдоль линии B & C; 1016 *
    • Пусть точка A1 равна точке A
    • Рассчитайте точку B1, которая равна 0,4 вдоль линии A & rarr; B
    • Рассчитайте точку С1, которая равна 0,4 вдоль линии B1 & rarr; T
    • Пусть точка D1 равна точке разделения S
    • Пусть точка D2 равна точке D
    • Рассчитайте точку C2, которая равна 0,4 вдоль линии C & D; 1028 *
    • Рассчитайте точку B2, которая равна 0,4 вдоль линии T & rar; C2
    • Пусть точка A2 равна точке разделения S

Теперь у вас есть две новые кривые Безье, первая с использованием контрольных точек A1, B1, C1, D1 и вторая с использованием A2, B2, C2, D2.

...