Я написал код для этого очень давно. Проект, над которым я работал, определял 2D-объекты с использованием кусочных границ Безье, которые были сгенерированы как пути PostScipt.
Я использовал следующий подход:
Пусть кривые p, q определены контрольными точками Безье. Они пересекаются?
Вычислите ограничивающие рамки контрольных точек. Если они не перекрываются, две кривые не пересекаются. В противном случае:
p.x (t), p.y (t), q.x (u), q.y (u) - кубические многочлены от 0 ‹= t, u‹ = 1.0. Квадрат расстояния (p.x - q.x) ** 2 + (p.y - q.y) ** 2 является полиномом на (t, u). Используйте метод Ньютона-Рафсона, чтобы попытаться решить это с нулевым значением. Отбросить любые решения вне 0 ‹= t, u‹ = 1.0
N-R может сходиться, а может и не сходиться. Кривые могут не пересекаться, или N-R может просто взорваться, когда две кривые почти параллельны. Так что отключите N-R, если он не сходится после некоторого произвольного количества итераций. Это может быть довольно небольшое количество.
Если N-R не сходится в решении, разделите одну кривую (скажем, p) на две кривые pa, pb при t = 0,5. Это просто, это просто вычисление средних точек, как показано в связанной статье. Затем рекурсивно проверьте (q, pa) и (q, pb) на наличие пересечений. (Обратите внимание, что на следующем уровне рекурсии q стало p, так что p и q поочередно разделяются на каждом слое рекурсии.)
Большинство рекурсивных вызовов возвращаются быстро, потому что ограничивающие рамки не перекрываются.
Вам придется обрезать рекурсию на некоторой произвольной глубине, чтобы обрабатывать странные случаи, когда две кривые параллельны и не совсем касаются друг друга, но расстояние между ними произвольно мало - возможно, всего 1 ULP разницы.
Когда вы действительно находите пересечение, вы еще не закончили, потому что кубические кривые могут иметь несколько пересечений. Таким образом, вам нужно разделить каждую кривую в точке пересечения и рекурсивно проверить наличие дополнительных взаимодействий между (pa, qa), (pa, qb), (pb, qa), (pb, qb).
person
Die in Sente
schedule
10.01.2009