4 votos

$t$ Del ascendente curva de Bézier de $x$

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$.

enter image description here

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.

Newton-Raphson curve

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;

2voto

sewo Puntos 58

Hay fórmulas cerradas para la solución general ecuaciones cúbicas, pero como Wolfram Alpha le mostraron, son tan horribles (con raíces cúbicas complejas incluso si sus coeficientes son reales) que así no podría molestar y en cambio encontrar su $t$ numéricamente, tales como bisección o de Newton-Raphson.

0voto

jmc Puntos 2291

Lazlo Bonin. Bueno, es una ecuación, resueltos sólo con el parámetro t. En esta ecuación P0, P1, P2, P3 son los puntos (X,Y) (2D) parámetros. Por lo que necesita las funciones que se multiplican Punto y haga doble (f.e. (t^3)*P3 ) También se necesita la función para sumar puntos. Así que, después de realizar todos los cálculos que usted consigue el punto. t es un parámetro, en el espacio [0,1]. Lo que usted necesita para hacer una precisión o el paso de la creciente parametr t. Por ejemplo, el paso de 0.01, se obtiene 100 puntos entre sus puntos. Aquí es cómo una función de calaculating cubo splain pueden ser hechas:

private List<Point> cube(Point p0, Point p1, Point p2, Point p3)
    {
        List<Point> result = new List<Point>(accuracy + 1);
        double t = 0;
        while (t <= 1)
        {
            Point p = p3.Multiply(t * t * t);
            p = p.Add(p2.Multiply((1 - t) * 3 * t * t));
            p = p.Add(p1.Multiply(3 * t * (1 - t) * (1 - t)));
            p = p.Add(p0.Multiply(Math.Pow(1 - t, 3)));
            result.Add(p);
            t += 1.0 / accuracy;
        }
        return result;
    }

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