2012-07-03 11 views
10

Así que he estado buscando algún tipo de método que me permita encontrar la coordenada Y en una curva de Curva cúbica, dada una coordenada x en ella.¿Has encontrado Y dado X en una Curva Bezier cúbica?

Me he encontrado con un montón de lugares que me dicen de tratarla una función cúbica a continuación, tratar de encontrar las raíces, que entiendo Sin embargo, la ecuación de una curva de Bezier cúbico es (para X-coords): X (t) = (1-t)^3 * X0 + 3 * (1-t)^2 * t * X1 + 3 * (1-t) * t^2 * X2 + t^3 * X3

What me confunde es la adición de los valores (1-t). Por ejemplo, si completé los valores X con algunos números aleatorios ...

400 = (1-t)^3 * 100 + 3 * (1-t)^2 * t * 600 + 3 * (1-t) * t^2 * 800 + t^3 * 800

entonces reorganizar al estilo ecuación cúbica:

800t^3 + 3 * (1-t) 800t^2 + 3 (1-t)^2 * 600t + (1-t)^3 * 100 -400 = 0

Todavía tengo problemas con los bloques (1-t). No puedo entender cómo se supone que debo resolver t cuando el (1-t) es desconocido en primer lugar.

¿Alguna idea?

+1

Más una pregunta matemática ... –

+1

Muy bien, voy a preguntarle a la gente de matemáticas en su lugar. Supuse que su uso en informática significaría que la gente de aquí podría saber. Gracias. –

Respuesta

2

Creo que esta es una pregunta CS justa, así que voy a intentar mostrar cómo he resuelto esto. Tenga en cuenta que una x dada puede tener más de un valor de 1 asociado con ella. En el caso en que necesité esto, estaba garantizado que ese no sería el caso, por lo que tendrá que averiguar cómo determinar cuál quiere.

He iterado sobre t para generar una matriz de valores xey. Lo hice a una resolución bastante alta para mis propósitos. (Buscaba generar una tabla de búsqueda de 8 bits, así que usé ~ 1000 puntos). Simplemente conecté t en la ecuación de bezier para la siguiente x y la próxima y para almacenar en la matriz. Una vez que tuve todo lo generado, escaneé a través de la matriz para encontrar los 2 valores x más cercanos. (O si había una coincidencia exacta, lo usé). Luego hice una interpolación lineal en ese segmento de línea muy pequeña para obtener el valor y que necesitaba.

5

Hay tres formas comunes de expresar una curva de bezier cúbica.

Primeros x como una función de t

x(t) = sum(f_i(t) a_i) 
    = (1-t)^3 * x0 + 3*(1-t)^2 * t * x1 + 3*(1-t) * t^2 * x2 + t^3 * x3 

En segundo lugar y como una función de x

y(x) = sum(f_i(x) a_i) 
    = (1-x)^3 * y0 + 3*(1-x)^2 * x * y1 + 3*(1-x) * x^2 * y2 + x^3 * y3 

estos dos primeros son matemáticamente el mismo, sólo el uso de diferentes nombres para las variables.

A juzgar por su descripción "busque la coordenada Y en una Curva Bezier cúbica, dada una coordenada x". Supongo que tienes una pregunta usando la segunda ecuación: estamos tratando de reorganizar la primera ecuación para ayudarte a resolverla, donde deberías estar usando la segunda ecuación. Si ese es el caso, entonces no se requiere ninguna reorganización o solución: simplemente conecte su valor de x y usted tiene la solución.

Es posible que tenga una ecuación del tercer tipo de caso, que es el caso feo y difícil. Estos son los parámetros xey que son biseles cúbicos de una tercera variable t.

x(t) = sum(f_i(t) x_i) 
y(t) = sum(f_i(t) y_i) 

Si este es tu caso.Déjame saber y puedo detallar lo que tienes que hacer para resolverlo.

+0

¿Me puede ayudar a resolver la versión parametrizada? Tengo el parametrizado 'x' y' y'. Necesito 'y' dado' x'. Así que no sé 't', pero sé' x'. – activatedgeek

+1

@activatedGeek: no puede necesariamente resolver su caso. Puede que no haya una solución, una solución, muchas soluciones o incluso infinitas soluciones (triste). Su mejor apuesta es observar que la curva bezier está garantizada para caer dentro del casco convexo de sus puntos de control. Luego, considere si cada CVH de los segmentos puede cruzar su valor de x, si lo mantiene en una lista, si no lo hace, olvídelo. Ahora, en cada segmento, aplique una división de punto medio bezier para obtener una nueva lista de segmentos de bezier. Repita el descarte y la división hasta que todos los segmentos sean lo suficientemente pequeños. Ellos son tus soluciones. –

+0

Ok, iría directamente a la fuente. ¿Podría decirme cómo funciona [esto] (http://cubic-bezier.com/#.17,.67,.83,.67)? Entiendo cómo se dibuja la curva a la izquierda. Lo que no entiendo es que cómo se convertiría el tiempo de animación para mapear el parámetro 't' de una' curva de Bezier' para cubrir una animación en algunos 'T segundos'. – activatedgeek

1

El desarrollo de la expresión más debe conseguir que deshacerse de los (1 - t) factores

Si ejecuta:

expand(800*t^3 + 3*(1-t)*800*t^2 + 3*(1-t)^2*600*t + (1-t)^3*100 -400 = 0); 

En cualquier wxMaxima o Maple (hay que agregar el parámetro t en éste sin embargo), que se obtiene:

100*t^3 - 900*t^2 + 1500*t - 300 = 0 

resolver el nuevo ecuación cúbica para t (se puede utilizar the cubic equation formula para eso), después de que tienes t, se pueden encontrar haciendo x:

x = (x4 - x0) * t  (asuming x4 > x0) 
0

Así que he estado buscando algún tipo de método para permitir que encuentre el Y- coordine en una curva de Bezier cúbica, con una coordenada x en ella.

Considere una curva de bezier cúbica entre los puntos (0, 0) y (0, 100), con los puntos de control en (0, 33) y (0, 66). Hay un número infinito de Y para una X determinada. Por lo tanto, no hay una ecuación que resuelva Y dado X para un bezier cúbico arbitrario.

Para una solución robusta, es probable que desee comenzar con De Casteljau's algorithm

Dividir la curva de forma recursiva hasta que los segmentos individuales se aproximan a una línea recta. A continuación, puede detectar si estos segmentos de línea interceptan su x o dónde y dónde, y si son segmentos de línea verticales cuya x corresponde a la x que está buscando (mi ejemplo anterior).

Cuestiones relacionadas