6 votos

¿Cuál es la distancia más corta entre dos curvas cúbicas de Bézier?

Esta pregunta viene de TeX.SX http://tex.stackexchange.com/questions/183123/whats-the-minimum-distance-between-two-bezier-curves

(De la tipografía; TeX) Se trata de encontrar la distancia mínima entre dos glifos. Los glifos suelen consistir en una o más curvas cúbicas de Bézier, los puntos de control se almacenan en el archivo de la fuente (OTF, TTF, PFB, DFONT, ...).

Estamos resolviendo http://tex.stackexchange.com/questions/180510/how-to-get-intersection-points-of-two-glyphs y si pudiéramos encontrar la distancia mínima entre dos curvas de Bézier analíticamente, sería computacionalmente efectivo. Sería un método mucho mejor que método de bisección que utilizamos a menudo en la tipografía. La mayoría de las veces utilizamos la iteración sobre una variable/dimensión.

Un matemático me dijo que este enfoque podría conducir a un horrible sistema de ecuaciones. Esa es probablemente la razón por la que utilizamos métodos numéricos en su lugar.

Una de mis (pobres) ideas es convertir las curvas de Bézier en curvas en espiral (ver aplicación en FontForge ), pero podría llevarnos a una situación aún peor (desde el punto de vista matemático).

Mi siguiente idea es dividir las curvas de Bézier en partes más pequeñas, pero probablemente no mejore nada.

Mi pregunta es probablemente duplicada a ¿Cómo puedo saber cuándo se cruzan dos curvas cúbicas de Bézier? y está relacionado con La distancia más corta entre dos formas . En informática, este problema está relacionado con la detección de colisiones.

3voto

bubba Puntos 16773

La gente en el negocio de CAD ha estado intersectando curvas Bezier, encontrando distancias, etc. durante décadas. Véase estas notas o la sección 5.6.2 de este libro para empezar. También, esta pregunta . Siempre me sorprende que la gente en el mundo de las fuentes tienda a inventar sus propios enfoques, en lugar de utilizar lo que la gente de CAD desarrolló.

Hay que resolver ecuaciones polinómicas de grado moderado (4, 5, 6 o así). Yo no las calificaría de "horribles", al menos son polinomios. Para resolverlas se utilizan métodos numéricos. Los enfoques comunes son:

(1) Discretizar (sustituir las curvas por secuencias de líneas rectas cortas), o

(2) Métodos estándar de búsqueda de raíces, como el de Newton-Raphson. Funcionan muy bien si se pueden encontrar buenos puntos de partida, lo que suele ser posible. Si las dos curvas son $F(u)$ y $G(v)$ entonces, para encontrar los valores de $u$ y $v$ en sus puntos más cercanos, hay que encontrar las raíces de $(F(u)-G(v))\cdot F'(u)=0$ y $(F(u)-G(v))\cdot G'(v)=0$ .

(3) Técnicas de subdivisión. Se pueden considerar como discretización adaptativa inteligente o como búsqueda de raíces por el método de la secante.

2voto

vadim123 Puntos 54128

Este es un problema difícil. Aquí hay dos posibles soluciones:

  1. Elija $n$ puntos igualmente espaciados en cada curva. Estos definen $n^2$ distancias; elija la más pequeña de ellas. Para los grandes $n$ es probable que esto se acerque a la respuesta correcta.

  2. Elige un punto $a_1$ en la curva de Bézier A. A continuación, elija el punto más cercano $b_1$ en la curva de Bézier B. Se trata de encontrar la raíz a una polinomio de quinto grado que sólo puede hacerse de forma aproximada en general. A continuación, encontrar el punto más cercano $a_2$ (a $b_1$ ) en la curva de Bézier A utilizando el mismo método. A continuación, encuentra el punto más cercano $b_2$ (a $a_2$ ) en la curva de Bézier B utilizando el mismo método. Es de esperar que este proceso converja y dé lugar a los dos puntos deseados.

1voto

Tatarize Puntos 111

Hay que tener en cuenta algunas cosas. El método de Newton también se equivocará a veces. Tendrás puntos en el tiempo en los que la distancia más cercana no está en ninguna raíz. Que al calcular las raíces y comprobarlas te dará una respuesta errónea. Y no hay nada que puedas hacer al respecto.

El método de discretización ingenuo va a ser $n^2$ tiempo con lo cerca que quieres los valores, y se va a empantanar o estar más equivocado. Pero se puede mejorar mucho esto. Yo sugeriría fuertemente la resolución variable para ese método, donde usted encuentra el punto más cercano en los dos gráficos sobre los valores k-discretos. Entonces, si encuentras que, por ejemplo, los valores en 43 y 22 son los más cercanos, haces lo mismo que acabas de hacer pero dentro del rango de 42-44 y 21-23 dentro de los dos gráficos en lugar de para todo el gráfico. Así que si quieres precisión en la 10.000ª parte del gráfico, no realizas 100.000.000 de comprobaciones de distancia, sino 50.000 comprobaciones de distancia, subdividiendo el gráfico en 100 partes, encontrando los rangos alrededor de esos puntos más cercanos en 200 puntos de distancias diferentes. Obviamente, también puedes acelerar esto conociendo el orden de los gráficos y sabiendo que no puede acercarse espontáneamente más veces de las que tiene las raíces a través del teorema de Bezout. O cualquiera de las otras formas de encontrar el punto más cercano a una curva de Bézier (que es un problema mucho más fácil).

En cuanto a la informática, creo que claramente el mejor método es hacer una subdivisión en forma de bézier de ambas curvas, encontrando los recuadros delimitadores más cercanos entre sí, mientras se deja de comprobar inteligentemente aquellos recuadros delimitadores que se pueden descartar abiertamente. Es decir, si la parte más cercana del cuadro delimitador está más lejos que los elementos más lejanos del par de cuadros delimitadores conocidos más cercanos, entonces no es posible que toda esa parte del gráfico contenga la distancia más corta, si alegamos ignorancia total entonces el gráfico podría estar en cualquier parte de un cuadro delimitador. Una vez que dividimos el gráfico unas cuantas veces, habría una amplia resolución que nos permitiría mostrar fácilmente ejemplos en los que incluso el mejor escenario entre un emparejamiento es peor que el peor escenario de otro emparejamiento. Así, sabemos que ese emparejamiento no puede tener el punto más cercano. Además, si podemos demostrar que esto es cierto entre algún cuadro delimitador de un gráfico y todos los cuadros delimitadores del otro gráfico, se demuestra que toda la sección del gráfico es inválida.

Este método convergería realmente con bastante rapidez, ya que podríamos deshacernos rápidamente de secciones enteras del gráfico o, en el caso de muchos gráficos, de gráficos enteros, incluso sin necesidad de comprobarlos más allá de una comprobación de cajas delimitadoras. En el caso de que los dos gráficos tengan una intersección, las cajas delimitadoras superpuestas se someterían rápidamente a divisiones repetidas y a encontrar en el peor de los casos una distancia de cero o épsilon. Y, por lo tanto, desestimar todo el resto del gráfico a menos que exista otra intersección.

Esto también se combinaría fácilmente con un montón de trucos muy agradables y, en última instancia, inteligentes que se pueden hacer para determinar las distancias y el solapamiento dentro de las cajas delimitadoras alineadas con el eje (AABB) de la geometría computacional. Si bien es cierto que el gráfico de una curva de Bézier se encuentra categóricamente dentro del polígono del casco convexo definido por los puntos, y la caja delimitadora contiene más área, es más fácil y probablemente mejor computacionalmente obtener sólo la caja delimitadora de la curva. Sobre todo si tenemos en cuenta una serie de grandes trucos que nos permiten localizar el rectángulo más cercano en menos de $n$ tiempo. Si este tipo de cosas son de misión crítica, sin duda se podrían realizar suficientes trucos para encontrar todas las respuestas correctas más cerca de algún nivel arbitrario de error en periodos de tiempo imperceptiblemente cortos.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X