PDA

Ver la versión completa : Para los entendidos en matematicas (ayuda plz)



Locke
16/01/2006, 10:01
Llevo unas cuantas horas rompiendome la cabeza con un problemilla matematico al que no consigo encontrar la solucion. A ver si alguna de las mentes brillantes del foro me puede echar una manilla con la formula o alguna pista...

El tema es el siguiente: Si tengo un cuadrilatero con vertices conocidos en A1, B1, C1 y D1 y un punto cualquiera P1(x1, y1) perteneciente al area del cuadrilatero, cual seria el punto P2 equivalente a P1 en el cuadrilatero con vertices en A2, B2, C2, D2 (conocidos)?


Por si no me explico bien, en concreto quiero transformar un trapezoide en un rectangulo, como si estirasemos de los vertices hasta que quedasen los lados paralelos y a la medida... hay alguna formula para eso?

Thx

Wave
16/01/2006, 14:51
A lo mejor con una imagen nos enteramos mejor.

Malenko
16/01/2006, 15:06
El tema es el siguiente: Si tengo un cuadrilatero con vertices conocidos en A1, B1, C1 y D1 y un punto cualquiera P1(x1, y1) perteneciente al area del cuadrilatero, cual seria el punto P2 equivalente a P1 en el cuadrilatero con vertices en A2, B2, C2, D2 (conocidos)?


Creo que A1, B1, C1 y D1 corresponden a un trapezoide, no? Yo si que he entendido lo que quieres hacer pero no tengo ni idea de como hacerlo :S

Malenko
16/01/2006, 15:14
He hecho un dibujo cutre de lo que yo entiendo es el problema.

Inicialmente tienes un trapezoide con las coordenadas A1, B1, C1, D1, y un punto de su interior (de su área) designado p1. Entonces cojemos dos puntas y las estiramos hasta llegar a tener un cuadrado/rectangulo. El problema consiste en averiguar hasta donde se ha desplazado ahora el punto p1, llamado ahora p2.

Es eso,no?

mmoroca
16/01/2006, 15:41
mmm... no ser'a un reescalado lo que quiere? Si es asi es encontrar la razon y aplicarla al punto para hallar el P2 equivalente a P1... no es una regla de tres (ma o meno :-))?

cHukAs
16/01/2006, 15:46
mmmmmmm la gallina???

saucjedi
16/01/2006, 16:28
He hecho un dibujo cutre de lo que yo entiendo es el problema.

Inicialmente tienes un trapezoide con las coordenadas A1, B1, C1, D1, y un punto de su interior (de su área) designado p1. Entonces cojemos dos puntas y las estiramos hasta llegar a tener un cuadrado/rectangulo. El problema consiste en averiguar hasta donde se ha desplazado ahora el punto p1, llamado ahora p2.

Es eso,no?

La verdad es que la cosa tiene sus vueltas... Tal como lo veo yo, puede interpretarse que has aplicado una traslacion a cada uno de los cuatro vertices (a priori, son traslaciones distintas), de modo que el punto para mantener la posicion relativa, deberia sufrir las cuatro traslaciones simultanamente, pero dudo que de el efecto deseado (de hecho, dudo incluso estar en lo cierto [wei4] ). Mirate bien el problema y averigua si puedes definir el punto en relacion con solo uno de los vertices. Si no puedes, intenta aplicarle las cuatro traslaciones. Si aun asi no puedes, mira a ver si nos puedes comentar la naturaleza del problema (para que quieres hacer esto).

Y si no, pues no puedo ayudarte :(

anibarro
16/01/2006, 16:50
Yo creo que sabiendo que la "y" del punto no va a variar porque solo estiras las esquinas, solo tienes que saber el nuevo valor de "x" en el que empieza la linea del punto y sumarle el valor de "x" del punto.
Para saber el nuevo valor de "x" en el que empieza la linea horizontal en la que esta el punto, solo tienes q dividir la x de la eskina de arriba entre la de la esquina de abajo, y dividir por la altura del trapezoide. Ese valor lo multiplicas por la altura del punto en cuestion,se lo sumas y lo haces entero. Asi me parece q tiene q funcionar ;)

cdrman
16/01/2006, 17:03
Hola. Hice algo parecido para estirar imágenes, más o menos es lo mismo. Utilicé una función que me hice llamada transformación afín. En la cual defines un triangulo source y uno de destino y se hace la transformación (parecido al morphing). Lo que tú quieres son 4 puntos, por lo que la transformación que tu necesitas es la bilineal o la bicúbica. Yo probé la bilineal y va de **** madre. Le pones los puntos source y los de destino y te hace la transformación sin ningún problema.

No se si tehabrá servido de mucho, pero bueno, aquí lo dejo.

Un saludo.

saucjedi
16/01/2006, 17:04
Yo creo que sabiendo que la "y" del punto no va a variar porque solo estiras las esquinas, solo tienes que saber el nuevo valor de "x" en el que empieza la linea del punto y sumarle el valor de "x" del punto.
Para saber el nuevo valor de "x" en el que empieza la linea horizontal en la que esta el punto, solo tienes q dividir la x de la eskina de arriba entre la de la esquina de abajo, y dividir por la altura del trapezoide. Ese valor lo multiplicas por la altura del punto en cuestion,se lo sumas y lo haces entero. Asi me parece q tiene q funcionar ;)

Pero es que puedes estirarlas arriba y abajo tambien... entonces tienes que decidir si la posicion del punto es relativa a la parte superior o inferior... ¡Oh no! ¡Es cierto, la Y no varia! Habia leido mal

Entonces si que creo que la propuesta de anibarro es correcta. Seria un reescalado, ¿no?

anibarro
16/01/2006, 17:12
mm no sirve, he vuelto a leer lo q pide y yo habia entendido que queria coger un rectangulo y tirar de los vertices de arriba para torcerlo, pero quiere otra cosa :S
Si es lo del dibujo de más arriba, si has definido un punto en el trapezoide y luego lo estiras, no puedes hacer que corresponda a un punto en concreto porque ocuparía varios al escalarlo.

Yataran
16/01/2006, 17:38
El tema es el siguiente: Si tengo un cuadrilatero con vertices conocidos en A1, B1, C1 y D1 y un punto cualquiera P1(x1, y1) perteneciente al area del cuadrilatero, cual seria el punto P2 equivalente a P1 en el cuadrilatero con vertices en A2, B2, C2, D2 (conocidos)?
Hola, ¿ese es todo el enunciado del problema? ¿Podrías ponerlo completo, si es que falta algo?

saucjedi
16/01/2006, 17:39
mm no sirve, he vuelto a leer lo q pide y yo habia entendido que queria coger un rectangulo y tirar de los vertices de arriba para torcerlo, pero quiere otra cosa :S
Si es lo del dibujo de más arriba, si has definido un punto en el trapezoide y luego lo estiras, no puedes hacer que corresponda a un punto en concreto porque ocuparía varios al escalarlo.

Lo ideal seria que el punto tuviera uno de los vertices como referencia o algo asi... lo mejor es que Locke nos diga para que quiere usar eso, no vaya a ser que se pueda conseguir lo mismo sin tanto quebradero de cabeza

Locke
16/01/2006, 20:08
No es ningun enunciado, es un problema que me ha surgido en un programa.

La Y si que varia, a ver si os pongo unas imagenes para que lo entendais mejor.

Otro ejemplo. Imaginemos una red de pescar elastica con forma de trapezoide. SI estiramos de las esquinas para formar un rectangulo, lo que me interesaria es conocer la transformacion que ha sufrido cada nudo... complicado, no? :confused:

anibarro
16/01/2006, 21:55
Locke es que si quieres conseguir transformar la posicion de un solo punto en otro unico punto, tienes que ir de algo mas grande a algo mas pequeño o como mucho igual. Si tienes un trapezoide y estiras de una esquina, vas a tener algo mas grande y lo que antes era un punto ahora seran varios...podrias quedarte con el pixel central, pero seria muy chapucero porque te quedarian pixels en blanco

Wave
16/01/2006, 21:57
Y ha de ser rapido? porque a lo mejor una forma que he pensado funciona pero no creo que sea muy rapida.

Locke
17/01/2006, 01:02
No tiene por que ser rapido, el calculo solo se haria una vez por frame. Dime esa manera, a ver que tal :)

Wave
17/01/2006, 01:34
A ver si explico mi idea.
Desde Ahora:
Ymas alta de las 4 del cuadrilatero= Ymax
Xmas alta de las 4 del cuadrilatero= Xmax
Ymas baja de las 4 del cuadrilatero= Ymin
Xmas baja de las 4 del cuadrilatero= Xmin
1 para el cuadro 1, 2 para el cuadro 2.
Los puntos son (X1,Y1) y (X2,Y2)

X2= (X2min+ (X2max-X2min)*( (X1-X1min)/(X1max-X1min) )
Y2= (Y2min+ (Y2max-Y2min)*( (Y1-Y1min)/(Y1max-Y1min) )

Pruebalo a ver que tal, no lo he pensado mucho pero algo asi debe ser.

WinterN
17/01/2006, 01:34
A mi este tipo de problema geométricos siempre me han gustado. Me gustaría ayudarte, pero me pillas en el curro y no tengo tiempo para ponerme con esas cosas ahora.

Si te sirve de algo te digo por donde empezaría yo. Simplificando. Dividiría el trapezoide en 2 triángulos (por la diagonal) y hallaría en cual de los dos triángulos se encuentra el punto.

Una vez hecho eso el problema se te reduciría al mismo problema, pero con un triángulo, que es mucho más manejable.

kaskabel
17/01/2006, 01:55
Mira a ver si utilizando la trigonometría lo puedes resolver, en teoria los puntos b y d se quedan en el mismo sitio,no?

Wave
17/01/2006, 02:16
Kaskabel, creo que es para un problema generico.

Locke
17/01/2006, 03:17
A ver si explico mi idea.
Desde Ahora:
Ymas alta de las 4 del cuadrilatero= Ymax
Xmas alta de las 4 del cuadrilatero= Xmax
Ymas baja de las 4 del cuadrilatero= Ymin
Xmas baja de las 4 del cuadrilatero= Xmin
1 para el cuadro 1, 2 para el cuadro 2.
Los puntos son (X1,Y1) y (X2,Y2)

X2= (X2min+ (X2max-X2min)*( (X1-X1min)/(X1max-X1min) )
Y2= (Y2min+ (Y2max-Y2min)*( (Y1-Y1min)/(Y1max-Y1min) )

Pruebalo a ver que tal, no lo he pensado mucho pero algo asi debe ser.

No tengo ni la mas remota idea de como has podido sacar esta formula, me supera totalmente xD

Aun asi creo que no funciona.

Yo tengo:

Cuadrilatero 1: A1(28,-22), B1(217,-20), C1(230,-179) y D1(16,-177)
Cuadrilatero 2: A2(10,-10), B2(245,-10), C2(245,-181) y D2(10,-181)

Con lo cual:

Y1max = -20
X1max = 230
Y1min = -179
X1min = 16

Y2max = -10
X2max =245
Y2min = -181
X2min = 10

Supuestamente, al aplicar esa formula a cada uno de los vertices del Cuadrilatero 1 nos tendria que dar los correspondientes en el Cuadrilatero 2. Probando con el A1:

X2 = 10 + (245 - 10) * ((28 - 16)/(230-16)) = 23,17 (deberia dar 10)
Y2 = -181 + (-10 + 181) * ((-22 + 179)/(-20 + 179)) = -12,15 (deberia dar -10, este se aproxima)

Haciendo mas pruebas parece que los valores para la Y son muy aproximados a los resultantes, sin embargo los de la X quedan bastante lejos de lo que deberian ser. No se si se debe a alguna coincidencia del caso en concreto (que me da que si) pero no soy capaz de encontrar el fallo... y estoy a punto de desesperarme...

De todas maneras muchas gracias por los intentos.

otto_xd
17/01/2006, 03:30
se me ocurre algo con los vectores que hay desde cada vertice al punto, calculando el desplazamiento de cada vertice, y recalculando la posicion del punto con eso, pero es una idea que tengo que madurar.

Wave
17/01/2006, 05:03
No tengo ni la mas remota idea de como has podido sacar esta formula, me supera totalmente xD

Aun asi creo que no funciona.

Yo tengo:

Cuadrilatero 1: A1(28,-22), B1(217,-20), C1(230,-179) y D1(16,-177)
Cuadrilatero 2: A2(10,-10), B2(245,-10), C2(245,-181) y D2(10,-181)

Con lo cual:

Y1max = -20
X1max = 230
Y1min = -179
X1min = 16

Y2max = -10
X2max =245
Y2min = -181
X2min = 10

Supuestamente, al aplicar esa formula a cada uno de los vertices del Cuadrilatero 1 nos tendria que dar los correspondientes en el Cuadrilatero 2. Probando con el A1:

X2 = 10 + (245 - 10) * ((28 - 16)/(230-16)) = 23,17 (deberia dar 10)
Y2 = -181 + (-10 + 181) * ((-22 + 179)/(-20 + 179)) = -12,15 (deberia dar -10, este se aproxima)

Haciendo mas pruebas parece que los valores para la Y son muy aproximados a los resultantes, sin embargo los de la X quedan bastante lejos de lo que deberian ser. No se si se debe a alguna coincidencia del caso en concreto (que me da que si) pero no soy capaz de encontrar el fallo... y estoy a punto de desesperarme...

De todas maneras muchas gracias por los intentos.

Ya veo, mi metodo sirve para cuadrados/rectangulos.

Locke
17/01/2006, 05:13
se me ocurre algo con los vectores que hay desde cada vertice al punto, calculando el desplazamiento de cada vertice, y recalculando la posicion del punto con eso, pero es una idea que tengo que madurar.

Esto podria estar interesante, tratando los vectores que unen los vertices con el punto como fuerzas que tiran de el. A mayor distancia menor influencia tienen sobre el desplazamiento del punto...

wOw!
17/01/2006, 05:30
Locke tío, eso se hace de toda la vida a ojillo... Me has decepcionado xD

otto_xd
17/01/2006, 05:40
Esto podria estar interesante, tratando los vectores que unen los vertices con el punto como fuerzas que tiran de el. A mayor distancia menor influencia tienen sobre el desplazamiento del punto...
Sip, eso mismo, pero claro, hay que sacar de esa idea las ecuaciones...xDDDDDDD...Ale, que tengas suerte :P(estoy liado ahora con el examen de mates de los ***** de la upm de teleco tecnica, pero no veo nada de eso, sino lo usaba como ejercicio:P)
Saludos

criatura
17/01/2006, 06:49
Bueno chicos, afrontemos este tema como un problema de transformación de coordenadas.
Pasamos de un rectángulo a un trapecio donde no se conserva la ortogonalidad, es decir, los ángulos se deforman porque los puntos se desplazan cada uno de distinta forma. Y porqué? pues porque depende de la distancia relativa de cada punto a un origen, osea un observador.
Fijaros cómo el rectángulo es la imagen ideal del mismo rectángulo visto desde arriba, mientras que el trapecio sería el rectángulo visto con "perspectiva", es decir, el observador tiene más cerca los puntos C y D y más lejos los puntos A y B. Este es un problema de transformación de coordenades muy habitual en LA TERCERA DIMENSIÓN.
Osea, para el caso de tener una tercera dimensión, se explica de la siguiente forma: los puntos cuanto más se alejan (más valor de Z), más se aproximan a un punto infinito llamado "horizonte", cuyo valor sería x=0, y=0, que está en el centro de la imagen. Osea, la coordenada Z se emplea como divisor de las otras dos: cuanto mayor es Z, menores son las x e y resultantes.
Simplificando un poco la cuestión al trabajar con dos coordenadas para cada punto (dos dimensiones), podríamos emplear la coordenada (osea, distancia al origen Y) para modificar la coordenada X, siempre que centremos el origen de coordenadas entre los puntos C y D: de la forma x' = k * x / y, siendo k una constante para normalizar la nueva coordenada:
es decir, los puntos A y B reducen más su coordenada x (se acercan más al origen), que los puntos C y D, porque su Y es mayor. Por tanto el resultado será un trapecio más o menos "acusado" según sea el valor de k; de hecho k puede ser igual al mayor de los valores de Y, para que siempre sean mayores que uno.
Si en el trapecio resultante cada punto está en una posición distinta, es porque hemos aplicado una nueva transformación en este caso usando la coordenada X, y tomando como referencia un observador que no está en medio de A y B, sino probablemente a la derecha de D.
Vaya lío, no?

BuD
17/01/2006, 07:21
Ya he encontrado la solucion, es algo dificil de explicar, asi que intentare explicarlo de una forma suave e intentare añadir imagenes mas tarde.
Es un truco de dibujo tecnico, tienes q prolongar los dos lados (los q se miran cara a cara)hasta donde se encuentren en un punto(Llamaremos punto M). Trazas una recta desde punto M hasta tu punto. Si te fijas bien, si prolongas esta recta, esta se encontrara con los otros dos lados del poligono (Los que no has prolongado aun). Mide la distancia entre donde se cruzan la recta con los lados y el vertice que este a la izquierda que pertenezca a ese lado (tendras 2 distancias), en teoria, si divides la longitud del lado donde se ha hecho el corte con la distancia del lado correspondiente que acabas de medir deberian dar lo mismo, pero un ordenador no trabaja con todos los valores asi que haz la media de estos dos valores. ahora tenemos la proporcionalidad. Repite esto pero con los otros dos lados del poligono. Ahora tenemos 2 valores de proporcionalidad, los dividimos por el lado del rectangulo y tendremos la cordenada "x", y la coordenada "y" respecto el rectangulo.
No se si me he explicado bien. En esencia, es el teorema de Tales puro y duro.
EDIT: Ea aqui una imagen, a ver si se entiende mejor lo que quiero decir.

BuD
17/01/2006, 07:49
Buah, me he puesto a pensar en la solucion matematica para este problema, y aunque no iva en mal camino, me he cansao.
Tengo mucho sueño y tal, asi que si eso cuando haya dormido te comento como lo hago para resolverlo matematicamente (Aplicando Tales). ;)

Wave
17/01/2006, 15:30
Bueno chicos, afrontemos este tema como un problema de transformación de coordenadas.
Pasamos de un rectángulo a un trapecio donde no se conserva la ortogonalidad, es decir, los ángulos se deforman porque los puntos se desplazan cada uno de distinta forma. Y porqué? pues porque depende de la distancia relativa de cada punto a un origen, osea un observador.
Fijaros cómo el rectángulo es la imagen ideal del mismo rectángulo visto desde arriba, mientras que el trapecio sería el rectángulo visto con "perspectiva", es decir, el observador tiene más cerca los puntos C y D y más lejos los puntos A y B. Este es un problema de transformación de coordenades muy habitual en LA TERCERA DIMENSIÓN.
Osea, para el caso de tener una tercera dimensión, se explica de la siguiente forma: los puntos cuanto más se alejan (más valor de Z), más se aproximan a un punto infinito llamado "horizonte", cuyo valor sería x=0, y=0, que está en el centro de la imagen. Osea, la coordenada Z se emplea como divisor de las otras dos: cuanto mayor es Z, menores son las x e y resultantes.
Simplificando un poco la cuestión al trabajar con dos coordenadas para cada punto (dos dimensiones), podríamos emplear la coordenada (osea, distancia al origen Y) para modificar la coordenada X, siempre que centremos el origen de coordenadas entre los puntos C y D: de la forma x' = k * x / y, siendo k una constante para normalizar la nueva coordenada:
es decir, los puntos A y B reducen más su coordenada x (se acercan más al origen), que los puntos C y D, porque su Y es mayor. Por tanto el resultado será un trapecio más o menos "acusado" según sea el valor de k; de hecho k puede ser igual al mayor de los valores de Y, para que siempre sean mayores que uno.
Si en el trapecio resultante cada punto está en una posición distinta, es porque hemos aplicado una nueva transformación en este caso usando la coordenada X, y tomando como referencia un observador que no está en medio de A y B, sino probablemente a la derecha de D.
Vaya lío, no?
Estoy seguro de que se puede hacer una matriz para transformar los puntos a un espacio donde formen un cuadrado, calcular el desvio relativo del punto dentro del cuadrado, usar ese desvio en el segundo cuadrado pasado por la matrix y luego multiplicar el punto resultante por la matriz inversa, pero *****... encuentra la matriz XD

Locke
17/01/2006, 18:31
A ver, creo que el maestro unai me ha dado la solucion mas sencilla.

Consiste en dividir el trapezoide en dos triangulos usando una de las diagonales. Despues se averigua en cual de los dos triangulos esta el punto y se calculan las coordenadas baricentricas respecto de sus 3 vertices. Luego hay que hacer la operacion inversa con el triangulo correspondiente del otro poligono, es decir, usar los vertices y las coordenadas baricentricas para hallar las cartesianas.

No parece muy complicado, ahora solo me queda aplicar las formulas correctamente :)

otto_xd
17/01/2006, 18:47
Que visto asi, siempre se me dio mal la geometria :P
Saludos y suerte