Как разделить UIBezierPath и сохранить его в двух разных объектах

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

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

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

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


person Harsh    schedule 19.12.2011    source источник
comment
Я нашел одну ссылку. Посмотрите на этих ребят. Я думаю, что это может помочь мне разделить кривую Безье. -meca.ac-aix-marseille.fr/Productique/PDF/   -  person Harsh    schedule 27.12.2011
comment
Это может быть полезно или нет, но показывает, как разбить UIBezierPath на отдельные пути: stackoverflow.com/questions/3051760/   -  person titaniumdecoy    schedule 08.02.2012


Ответы (1)


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

  1. Рассчитайте параметризованное значение вдоль кривой (между 0,0 и 1,0) касания. Для этого вы можете вычислить набор точек через равные интервалы (0,1, 0,2, 0,3 и т. д.), а затем найти две ближайшие точки к вашим точкам касания и повторить параметризацию между этими точками, если вы хотите большей точности (0,21, 0,22, 0,23 и др.). Это приведет к появлению числа от 0,0 до 1,0 вдоль сегмента кривой, представляющего место, где вы коснулись.
  2. This bit is difficult to explain in text, but there's a good visualization on this page about half-way down under the heading Subdividing a Bezier curve. Use the slider under the diagram to see how it works, here's my textual explanation: You need to subdivide the straight lines between the control points of your curve segment proportional to the parameterized value you calculated in step 1. So if you calculated 0.4, you have four points (A, B, C, D) plus the split-point on the curve closest to your touch at 0.4 along the curve, we'll call this split-point point S:
    • Calculate a temporary point T which is 0.4 along the line B→C
    • Пусть точка A1 равна точке A
    • Вычислите точку B1, которая составляет 0,4 вдоль линии AB.
    • Вычислите точку C1, которая составляет 0,4 вдоль линии B1T.
    • Пусть точка D1 равна точке разделения S
    • Пусть точка D2 равна точке D
    • Вычислите точку C2, которая составляет 0,4 вдоль линии CD.
    • Вычислите точку B2, которая составляет 0,4 вдоль линии TC2.
    • Пусть точка A2 равна точке разделения S

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

person jhabbott    schedule 03.04.2012