Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Seguir un path [Processing]

Iniciado por alberizo, 30 de Diciembre de 2010, 01:47:20 AM

« anterior - próximo »

alberizo

Hola a todos, felices fiestas !!

A ver si me podéis guiar. Estoy haciendo cosas con el canvas de html, y estoy usando processing js como "libreria".
El caso es que tengo un objeto que se mueve con un vector dado en línea recta, pero puedes seleccionarlo y marcarle una ruta con el ratón, el objeto debería seguir esa ruta con la misma velocidad que traía. La pregunta es ¿Cómo hago esa ruta?

Por si no conocéis processing, para hacer curvas, puedo hacer una bezier o una catmull spline y con 2 funciones me puede devolver la tangente en un punto dado y las coordenadas de un punto de la curva en función de un valor de 0 a 1 que representa la longitud total, con esto podría posicionar el punto y la orientación, pero necesitaría la longitud para darle la velocidad constante. ¿Algún método para calcular la longitud de una spline?

La otra opción que se me ocurre es usar un grid isométrico, pero los movimientos no quedarían nada suaves.

¿Sugerencias? ¿Algún documento interesante que leer?

Gracias!!

alberizo

Finalmente me las estoy apañando con matemáticas básicas y practicamente ya lo tengo. Si a alguien tiene interés le cuento como lo he hecho.

Un saludo.

Hechelion

Sería interesante ver la solución.

blau

¿Descomponiendo la spline en unsa sucesion de segmentos de rectas?

alberizo

Lo voy a explicar de manera básica porque aún lo estoy perfeccionado y le estoy dando vueltas para que vaya mejor.

En un principio estaba obsesionado con encontrar el modo posicionar el vehículo con la x,y y el ángulo. Hasta que me di cuenta que había una forma mejor de hacerlo. Muevo el vehículo solamente con 2 parámetros, velocidad y ángulo (2D).

Como la velocidad -en principio- siempre la quiero constante, solo tengo que cambiar el ángulo y dejar que se vaya moviendo sólo con ese ángulo. Este ángulo lo voy calculando en cada pasada de una manera muy sencilla, voy "moviendo un elemento" que la recorre la spline entera por delante del vehículo y oriento constantemente el vehículo para que apunte a ese elemento.

Ahora lo que estoy perfeccionando es la manera como se mueve ese elemento a través de la spline. En un principio lo iba poniendo siempre en la mitad (0.5) de la curva que uniría el vehículo con el primer punto de control de la spline, como el vehículo se iba moviendo, la curva cada vez era más corta y calculaba su mitad, pero por alguna razón el elemento siempre se movía en línea recta y el vehículo jamás giraba.
Ahora lo que estoy haciendo es cambiar el paso de la totalidad de la curva, empiezo en (0.0 inicio de la curva), hasta llegar a (1.0 final de la curva) y me va dando puntos de la curva, para saber cuanto debe haber entre cada paso, obtengo la distancia entre los 2 puntos de control de la curva en línea recta y la distancia que hay entre el vehículo en ese momento y el segundo punto de la curva, así obtengo que porcentaje ha recorrido y mapeo esa distancia sobre un número entre 0 y 1 que es el paso.

Mis limitaciones matemáticas son infinitas, así que intento hacerlo de una manera sencilla y que funcione, seguro que hay mejores métodos, pero esta funciona, cualquier sugerencia es bienvenida. Si no ha quedado muy claro hago unas capturas.

@blau, intenté en un principio ir por ese camino pero estaba llegando a un callejón sin salida y el coste de calcular la longitud en cada pasada sería alto.

Un saludo.








blau

Lo de proyectar la curva sobre la recta puede valer. :)

Pero en lo que te expuse, sigo sin entender porque tienes que calcular todo en cada pasada. Si la spline no cambia, solo tienes que calcularlo una vez. Lo único que tienes que guardar asociado a cada recta es la distancia acumulada recorrida hasta el comienzo de la misma.

Un saludo






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.