He mirado alrededor por un tiempo y no puedo encontrar una solución a este problema. Digamos que tengo una curva bezier cúbica (definida por 4 puntos) y quiero obtener un conjunto de puntos espaciados uniformemente a lo largo de la curva. Piense en colocar un texto a lo largo de una curva como ejemplo.
Ahora el problema es que si ingreso t
(valor de interpolación de 0-1) con un incremento constante, los puntos no están espaciados uniformemente. La distancia a lo largo de la curva es menor cuando la curva gira y más larga cuando la curva es recta.
Entonces, ¿cómo coloco puntos uniformemente a lo largo de una curva bezier?
interpolation
curves
beziers
Potrillo
fuente
fuente
t
en, digamos, 100 pasos, y mida las distancias entre los puntos resultantes. Luego, interpola a lo largo de esta polilínea como desees.Respuestas:
Es más una pregunta matemática. Así que una curva de Bezier tiene la siguiente fórmula , tanto en el
x
yy
componente.La longitud recorrida por
t
una curvagamma
viene dada por:No hay una solución de escritura humana para la integral, por lo que debe aproximarse.
Reemplace el
gamma(t)
por la expresiónB(t)
para obtener la longitudlength_B
recorrida a lot
largo del segmento bezier. Digamos que viaja de0
aL
.Ahora elija
n
valores entre0
yL
que correspondan a los puntos espaciados uniformemente. Por ejemplo, longitudes del formulariok*L/n
parak
de0
an
.Ahora necesita invertir la función
length_B
, para poder calcular elt
reverso a partir de la longitudl
. Son muchas matemáticas y soy flojo como el infierno, intenta hacerlo tú mismo. Si no puede, puede ir al intercambio de pila matemática . Para una respuesta más completa, puedes ir allí de todos modos.Una vez que tenga esa
length_B
función inversa (o una aproximación razonable), el proceso es bastante simple.l[k]
de distancia de ruta dada lejos del origen(P0_x,P1_x)
.t[k]
uso correspondientelength_B_inverse
.(B_x(t[k]),B_y(t[k]))
.fuente
Bueno, ha pasado algún tiempo ...
¡Pero finalmente pude resolver este problema!
Todo lo que necesitas está en esta publicación: mover naves entre dos planetas a lo largo de un bezier, faltan algunas ecuaciones para la aceleración
fuente
Solo para ampliar lo que dijo Marco, una técnica común para hacer esto es caminar por la curva en incrementos mucho más pequeños que los pasos de longitud fija que desea tomar y almacenar el punto de salida resultante (¿y quizás la distancia?) En una tabla.
Luego, revisa la tabla y descarta todas las entradas, excepto los puntos más cercanos a los múltiplos enteros de las distancias que desea caminar.
Luego, queda una tabla que puede indexar directamente en tiempo de ejecución muy rápidamente. Si desea ir al lugar que es 5 veces el tamaño de su distancia, mire en su tabla el índice [5].
Tenga en cuenta que, para empezar, puede realizar los dos pasos en uno y no almacenar los elementos adicionales en la tabla, pero es más fácil de visualizar y comprender en dos pasos.
Una vez vi una técnica para calcular esto sobre la marcha sin calcular previamente una tabla (¡tampoco usaba iteración / búsqueda de raíz!), Pero desafortunadamente no puedo recordar los detalles en absoluto:
Si lo recuerdo o lo encuentro, ¡publicaré la información!
fuente
Paso 1 - Genera N + 1 puntos interpolando la curva en incrementos de 1 / N. N debe ser lo suficientemente grande como para obtener buenos resultados visuales, pero lo suficientemente pequeño como para ser fácilmente calculado. Un valor de 50 debería estar bien para la mayoría de las situaciones, pero debería ajustarse para su caso específico. Llamaré a esto los "puntos interpolados".
Alternativamente, puede generar una lista corta de segmentos y dividir recursivamente cada segmento que sea más largo que la longitud máxima deseada del segmento (inicialmente debe generar al menos cuatro segmentos para tener en cuenta las curvas S donde el inicio está muy cerca del final).
Paso 2 - "Camina la línea" usando los puntos interpolados y el espacio que deseas entre cada punto.
Lo dejaré aquí mi código de Unidad:
fuente
Aquí hay un algoritmo que da resultados bastante buenos:
fuente