Sospecho que la respuesta que busca difiere de la pregunta que ha formulado. Permítame considerar algunos escenarios en 3-D (0un puesto cada uno).
ESCENARIO #1: Cargas un programa 3D como Blender, y añades una curva Bezier a la escena. Hay tiradores de control, y la curva se aproxima por segmentos. Aumenta la resolución de la curva, y la aproximación es cada vez mejor. Aleja el zoom de la curva, y en algún momento la resolución de tu curva excederá la resolución mostrada. Estaría bien eliminar los puntos innecesarios.
Si te refieres a esto, estás de suerte:
La curva dibujada es ya una aproximación lineal. Aumentar y disminuir la resolución no tiene ningún efecto sobre el orden de la curva. Construyamos una curva de este tipo.
Sea el orden 3, y los puntos dados sean A,B,C,D. y sea la curva 3D dada por
$(1a)\;\;\;\;\; {\bf x}(t) = A + 3 P t + 3Q t^2 + R t^3, \;\;\;\;\; 0\le t \le 1$
${\small \hspace{60pt} P = (B\!-\!A),\;\; Q = (C\!-\!2B\!+\!A),\;\; R= (D\!-\!3C\!+\!3B\!-\!A)}$
o, inmediatamente en los puntos dados
$(1b)\;\;\;\;\; {\bf x}(t) = A(1\!-\!t)^3 + 3 Bt (1\!-\!t)^2 + 3C t^2 (1\!-\!t) + D t^3 \;\;\;\;\; 0\le t \le 1$
Los puntos A y D son los extremos de la curva, y si unimos los segmentos AB, CD, encontraremos que son los conocidos asideros. Consideremos ahora dos tareas
1. Cambia la resolución. ¿Cómo se dibuja esa curva? Digamos que queremos n segmentos. Entonces necesitaremos n+1 valores t:
$\;\;\;\;\;\{t_k\} = 0, \tfrac{1}{n}, \tfrac{2}{n}, ..., \tfrac{n}{n} = 1,\;\;$ o
$\;\;\;\;\;\{t_k\} = {k/n}, \;\;\;k = 0, \ldots, n $
A continuación, evalúe (1a) o (1b) en los n valores t. Únelos con líneas rectas. Esta curva es tu aproximación. La distancia entre puntos es la distancia en línea recta.
Ahora vamos a pensar en esto. Aunque no sea esto lo que quieres decir, ¿estás seguro de que quieres la longitud del arco? Tengo dos puntos en el espacio, A y B. Sabré si dos puntos se superponen en mi pantalla comprobando su distancia euclidiana ordinaria. La distancia entre ellos a lo largo de la curva no sólo es mucho más difícil de calcular, sino que no responde a la pregunta.
2. Aumentar el número de puntos de control/manillas. Los polinomios de alto orden son monstruos rebeldes. En lugar de aumentar el orden de la curva, voy a concatenar Curvas de tercer orden (que compartan puntos finales comunes, y tal vez tangentes). Esto tiene el aspecto familiar: un punto de la curva tiene un asa que se extiende a ambos lados. Como regla general, utilizaremos curvas de 3er orden en todas partes, de modo que entre dos puntos de control cualquiera de la spline, hay una única curva de 3er orden, y los tiradores dan la dirección, y la fuerza, de la tangente en ese punto,
así .
En ambos casos, evito elevar el orden, todas las curvas son de orden 3.
Permítanme que me tome en serio esta aplicación. No estoy convencido de que tenga que cambiar la resolución, excepto por algunas reglas muy generales (digamos, basadas en la distancia de la cámara y el cuadro delimitador). He aquí por qué.
Consideremos la representación (1b). Has posteado en un foro de Juegos, así que asumiré que estás dispuesto a usar una tarjeta gráfica o SSE2 para hacer algunas matemáticas vectoriales. Elijo una resolución arbitraria: digamos, 32 puntos (31 segmentos). Acepto no cambiar este número, sino utilizarlo en todas partes, para todas las splines que se muestran en la pantalla.
Considera el punto k de mi spline. Lo escribiré como un producto vectorial:
$\left[\begin{array}{} A & B & C&D \end{array}\right] \left[\begin{array}{} (1\!-\!t_k)^3 \\(1\!-\!t_k)^2 t_k \\ (1\!-\!t_k){t_k}^2\\{t_k}^3 \end{array}\right]\;\;\;$ o, $\left[\begin{array}{} A & B & C&D \end{array}\right] \cdot T_k$ ,
donde Tk es un vector de columnas. Entonces los 32 puntos de mi spline son $\left[\begin{array}{} A & B & C&D \end{array}\right] \left[ \left[\begin{array}{} \;\\ \!T_0 \!\\\; \end{array}\right] \left[\begin{array}{} \;\\ \!T_1\! \\\; \end{array}\right] \left[\begin{array}{} \;\\ \!\ldots \! \\\; \end{array}\right] \left[\begin{array}{} \;\\ \!T_{31}\! \\\; \end{array}\right] \right] $
La matriz 4x32 de la derecha, que contiene todas las potencias de tk, es constante, y se utilizará para todas las splines de mi pantalla. Todo el problema se puede pasar a la tarjeta gráfica (o SSE) como la multiplicación matricial (particionada) de [Pts] $\cdot$ [Constantes], y luego dibujar las líneas rectas que unen los puntos de la misma curva.
Siendo lo que hay que hacer
Adelante. (POR HACER: EDITAR.)
0 votos
¿Qué quiere decir con "distancia recorrida"? ¿Se refiere a la distancia recorrida a lo largo de la curva en una determinada parametrización?
0 votos
@Alex Sí. es.wikipedia.org/wiki/B%C3%A9zier_curve#Generalization
7 votos
La arclitud de una curva de Bézier puede ser muy complicada; para una Bézier cuadrática se tiene una expresión complicada que implica logaritmos/funciones hiperbólicas inversas, y para una Bézier cúbica se requieren ahora integrales elípticas.
0 votos
@J.M. Vaya... o_o Creo que usaré una aproximación por interpolación lineal.
2 votos
Si tiene Mathematica :
Integrate[(Sqrt[#1 . #1] & )[D[Sum[{Subscript[x, i + 1], Subscript[y, i + 1]}*Binomial[2, i]*(1 - u)^(2 - i)*u^i, {i, 0, 2}], u]], u]
0 votos
(¡La versión cúbica parece más de pesadilla!)
1 votos
@muntoo: Probablemente sería mejor que usaras una rutina de cuadratura numérica en lugar de intentar sacar una expresión explícita de forma cerrada, FWIW. Ten en cuenta que la respuesta dada por Williham en el sitio Game Dev utiliza cuadratura numérica (gaussiana para uno, y una subdivisión inteligente en segmentos de línea o esencialmente una regla trapezoidal para el otro) en la página para el caso cúbico que enlazó.
4 votos
Por lo que escribes sobre la "resolución", me pregunto si estás resolviendo el problema correcto. Que yo recuerde, la mejor manera de dibujar curvas de Bézier no es sustituir los valores sucesivos de $t$ ¿pero dividirlos recursivamente en dos hasta que las partes puedan dibujarse satisfactoriamente como líneas?
0 votos
La longitud del arco viene dada por $$s=\int_a^b\sqrt{1+\left(\frac{dy}{dx}\right)^2}dx.$$ Tal vez puedas utilizar una parametrización de Bézier y la integral.