Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Interpolación

Iniciado por Haddd, 02 de Abril de 2003, 09:18:38 AM

« anterior - próximo »

Haddd

                                Tengo un problema de interpolación entre 4 puntos:

B   C

A   D

Cada pto representa la y, así por ejemplo:

20   30

10   40

Entre todos los puntos hay una distancia de 1. Entonces si me piden el punto (0,0.5) el valor debería ser 15. Si me piden el (1,1) el valor debería ser 30.

Lo que yo hago es trazar un vector del punto que me piden a cada uno de los 4 ptos y así obtengo el "peso" de cada punto sobre el que me piden. Esto es correcto, pero los que están en el centro se resolverían mas o menos así:

y=20*0.5+30*0.5+10*0.5+40*0.5=50

Pero yo no puedo tener ningún valor que supere el mayor de los puntos, es decir 40, por tanto algo hago mal.

¿Me ayudais?                                

MA]Mestre

                                Siempre que hago interpolación entre dos puntos lo hago con interpolación lineal, interpolación por coseno o interpolación cúbica dependiendo del caso. Creo que la que buscas es la lineal.

Interpolación lineal

return a*(1-x) + b*x

siendo 'a' y 'b' los dos puntos a interpolar, y 'x' un valor entre 0 y 1. Cuando x es igual a 0 retorna a, cuando x es igual a 1 retorna el valor de b.

No se si es exactamente lo que buscas, pero espero que te sirva de ayuda.
a10.                                

Haddd

                                Gracias pero no es así. Esta interpolación es entre 4 puntos y es un poco diferente. Compruébalo con el ejemplo que pongo                                

Mars Attacks

                                Si es interpolación entre 4 puntos, ¿por qué en el primer ejemplo que has puesto sólo tomas en cuenta (en el caso del 0,0.5) el de arriba y el de abajo? Para calcular el valor en el centro podrías hacer la interpolación entre los dos de la izquierda (15, como ya has dicho), los dos de la derecha (35 si no recuerdo mal) y después la interpolación entre esos dos valores 15*0.5+35*0.5=25                                

fiero

                                Pero, no se puede interpolar linealmente entre esos 4 puntos ¿no?. No puedes porque según las alturas que has puesto no se trata del mismo plano, sino de 2 triangulos cuyas normales no son iguales, así que no exixten las mismas pendientes en las dos mitades.

Yo dividiria el plano en 2 triangulos BCA y CDA  e interpolaria así:

u= entre 0.0 (izquierda) y 1.0 (derecha)
v= entre 0.0 (arriba) y 1.0 (abajo)

si el punto está en BCA:

y= B.y + u * (C.y - B.y) + v * (A.y - B.y);

si el punto está en CDA:

y= A.y + u * (D.y - A.y) + v * (C.y - A.y);


Si la distancia entre todos los vertices es 1 es facil saber que triangulo utilizar. Si x>z se utiliza CDA, y si no el otro, o algo así....
Esto está basado en el ejemplo pick de DX.

un saludo                                
www.videopanoramas.com Videopanoramas 3D player

Haddd

                                Solo tomo en cuenta los dos de arriba porque en el cálculo omito aquellos que están a una distancia>1, porque asumo que no afectan para nada.                                

jpastor

                                No se muy bien de que estais hablando, pero en el ejemplo que has puesto al principio, en el centro equivaldria a la media de los cuatro puntos, osea que es la formula que tu has puesto pero con 0.25

y=20*0.25+30*0.25+10*0.25+40*0.25=25

¿no se te habrá colado en 0.5 por error?                                

jpastor

                                Ok, creo que he pillado quee asignas un peso a cada vertice que (1-distancia). Entonces el peso de cada vertice para un punto en el centro me sale (1-0.7071) = 0.2929 y el resultado en y = (20+30+10+40)*0.2929 = 29.2893 que está en el rango q esperas.

La duda, ¿haciendolo asi la interpolacion es lineal?                                

Ithaqua

                                Haddd, la fórmula que has puesto no es correcta.
Si quieres hallar el centro geométrico el factor por el que tienes que multiplicar cada uno de los 'vértices' es 0.25. Ten en cuenta que sumando tus factores el resultado es 2 :)
Para hallar cualquier punto, suponiendo que quieras interpolación lineal, haz como cuando uno interpola valores gouraud.
Si tienes que calcular un (x, y) primero interpola verticalmente en las aristas izquierda y derecha para obtener los valores extremos del 'rasterline' donde se encuentra tu punto:
-------
|      |
x     x
|      |
-------
Luego vuelve a usar interpolación lineal para hallar el valor final dentro del rasterline horizontal:
-------
|      |
--x---
|      |
-------


Tu ejemplo para el (0.5, 0.5) sería:
-Extremo del rasterline izquierdo=10+(20-10)*y = 15
-Extremo del rasterline derecho =30+(40-30)*y = 35
Interpolamos entre 15 y 35: 15+(35-15)*x = 25                                
thaqua^Stravaganza
http://ithaqua.stravaganza.org

Ithaqua

                                Ahora imagina por un momento que esos asciis están bien X-)                                
thaqua^Stravaganza
http://ithaqua.stravaganza.org

Haddd

                                Es complejo, ¿eh?

Bueno, lo del triángulo me parece una buena idea, pero pienso que debe haber una solución más sencilla al problema. Se me ha ocurrido que tengo que normalizar al final el modulo de los 4 vectores que apuntan al pto que estoy buscando. Lo probaré y ya os diré cosas. Sin embargo, la cuestión sigue abierta                                

ethernet

ithaqua, usa el bbcode list o code para q deje bien los asciis.

Por otra parte, como has implementado tu perlin noise haddd? En el codigo fuente del propio autor muestra como hace una interpolacion entre varios puntos (ademas lo hace hasta con 3 compoenentes) y usa la tecnica q ha descrito ithaqua, me parece la mas correcta y mas logica.

Ademas puedes implementarlo para un espacio con n componentes partiendo de como implementarlo en 1d(templates rocks). Precisamente en eso estaba yo trabajando ahora :))


saludos

Ithaqua

                                Jarl, normalizar 4 vectores? :-?
No te compliques tantísimo la vida, prueba con lo que te he dicho, que son 3 sumas, restas y multiplicaciones :)
No se para que lo quieres exactamente, pero piensa que el problema es idéntico a cuando tienes un polígono con valores de color en sus vértices y tienes que rellenarlo interpolando. Primero se interpolan las aristas y luego se interpolan los rasterlines horizontales.                                
thaqua^Stravaganza
http://ithaqua.stravaganza.org

ethernet

umh, algunos nacimos con opengl debajo del brazo y eso nos lo hace glcolor xDD

Ithaqua

                                Voy a experimentar con el list, a ver...

Interpolar verticalmente las aristas laterales para obtener los valores extremos del 'rasterline' donde se encuentra el punto que buscamos:


-------

|     |

x     x

|     |

-------


Luego interpolar horizontalmente entre los extremos del 'rasterline' resultado para obtener el valor final:


--------

|      |

---x----

|      |

--------

                               
thaqua^Stravaganza
http://ithaqua.stravaganza.org






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.