Escribí el código para hacer esto hace mucho, mucho tiempo. El proyecto en el que estaba trabajando definió objetos 2D utilizando límites Bezier por partes que se generaron como rutas PostScipt.
El enfoque que utilizamos fue:
Let curvas p, q, ser definido por los puntos de control de Bézier. ¿Se cruzan?
Calcule los cuadros delimitadores de los puntos de control. Si no se superponen, entonces las dos curvas no se cruzan. De lo contrario:
p.x (t), p.y (t), q.x (u), q.y (u) son polinomios cúbicos en 0 < = t, u < = 1.0. La distancia al cuadrado (p.x - q.x) ** 2 + (p.y - q.y) ** 2 es un polinomio en (t, u). Usa Newton-Raphson para tratar de resolver eso para cero. Deseche cualquier solución fuera de 0 < = t, u < = 1.0
N-R puede que converja o no. Las curvas pueden no cruzarse, o N-R puede explotar cuando las dos curvas son casi paralelas. Así que corte N-R si no está convergiendo después de un número arbitrario de iteraciones. Este puede ser un número bastante pequeño.
Si N-R no converge en una solución, divida una curva (por ejemplo, p) en dos curvas pa, pb en t = 0.5. Esto es fácil, solo está midiendo puntos medios, como muestra el artículo vinculado. Luego pruebe recursivamente (q, pa) y (q, pb) para las intersecciones. (Tenga en cuenta que en la siguiente capa de recursividad q se ha convertido en p, así que p y q se dividen alternativamente en cada capa de la recursión.)
La mayoría de las llamadas recursivas regresan rápidamente porque los cuadros delimitadores no se superponen .
Tendrá que cortar la recursividad a una profundidad arbitraria, para manejar casos extraños donde las dos curvas son paralelas y no tocan del todo, pero la distancia entre ellas es arbitrariamente pequeña, quizás solo 1 ULP de diferencia .
Cuando encuentra una intersección, no ha terminado, porque las curvas cúbicas pueden tener múltiples cruces.Por lo tanto, debe dividir cada curva en el punto de intersección y buscar recursivamente más interrecciones entre (pa, qa), (pa, qb), (pb, qa), (pb, qb).