Tengo una ascendente cúbica de Bézier. ($x_0 \leq x_1 \leq x_2 \leq x_3$) Teniendo en cuenta esta propiedad, siempre hay una y sólo una $y$ valor por $x$ del valor.
El punto de ($x, y$) a lo largo de la curva está determinada por la siguiente ecuación, de la Wikipedia:
$B(t) = (1-t)^3 P_0 + 3t (1-t)^2 P_1 + 3t^2 (1-t) P_2 + t^3 P_3$
Sin embargo, esta ecuación toma $t$ como un parámetro, que es la progresión a lo largo de la curva, o bien, como la Wikipedia explica,
El $t$ " en la función lineal de una curva de Bézier puede ser pensado como describir la forma en la medida de $B(t)$ es de$P_0$$P_n$. Por ejemplo, cuando $t=0.25$, $B(t)$ es un cuarto del camino, desde el punto de $P_0$$P_n$.
Me gustaría usar el $B(t)$ función con un $x$ parámetro en su lugar. Algo como $B(x)$, o cualquier cosa que se pueda convertir en un determinado$x$$t$.
Edit: me di cuenta de que yo podría resolver $B(t)$$t$:
$B(t) = (1-t)^3 P_0 + 3t (1-t)^2 P_1 + 3t^2 (1-t) P_2 + t^3 P_3$
$x(t) = (1-t)^3 x_0 + 3t (1-t)^2 x_1 + 3t^2 (1-t) x_2 + t^3 x_3$
$x(t) = (-x_0+3x_1-3x_2+x_3)t^3 + (3x_0-6x_1+3x_2)t^2 + (-3x_0+3x_1)t + x_0$
$t(x) = ...?$
Edit 2: Con el método de Newton-Raphson método, me las arreglé para llegar a mi meta. Estoy adjuntando una captura de pantalla.
Los puntos rojos representan mi interpolación (y sorprendentemente, la extrapolación así. Este fue un inesperado pero gran sorpresa!).
Los puntos grises representan una pequeña optimización que he realizado para el método: el número de iteraciones que se basa en la dificultad de aproximarse. Aumento de la precisión en un invertly relación proporcional al valor absoluto de la derivada: $$p\ \alpha\ \frac{1}{|B'(t_n)|}$$
I have to tweak the parameters, but so far, this method is efficient and pretty safe, even at a nearly straight slope. Thanks for the help!
P.S.: The more explicit solution, without the precision adjustment (which is unfortunately only well represented in procedural code):
$$t\approx x-\sum_{n=0}^p (\frac{B(t)_x-x}{B'(t)_x})$$
(This takes advantage of the fact that $-x$ is nullified in the derivative Also note that $t$ es reasignado en cada paso de la suma).
P. P. S.: El código de acompañamiento:
p = 5;
p_max = 100;
t = x;
for (n = 0; n < min(p, p_max); n++)
{
d = dB(t).x;
if (p < p_max) p += min(0.02 / d^2), 1);
t -= (B(t).x - x) / d;
}
return t;