Algoritmia - Intersección de Rectangulos

 
Vista:

Intersección de Rectangulos

Publicado por MARTA (1 intervención) el 11/12/2003 12:55:02
Hola:
Alguien sabe como hacer un algoritmo de intersección de n rectangulos?.

Saludos y gracias,
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Algoritmo (parte 1)

Publicado por cemendil (6 intervenciones) el 11/12/2003 21:32:24
No conozco ninguno, pero el problema no parece dificil. Ante todo, ¿qué quieres saber de la intersección? Supongamos que te interesa calcular el rectangulo interseccion. Vamos por pasos:

1) La interseccion de dos rectangulos es o bien vacia o bien un rectangulo (considerando segmentos y puntos como rectangulos). Por tanto, la interseccion de N rectangulos es o bien vacia o bien un rectangulo.

2) Para determinar un rectangulo basta dar dos puntos en el plano. Uno de ellos sera su vertice inferior izquierdo y el otro su vertice superior derecho. Denotemos un rectangulo como un par de puntos { X , Y }, donde el primer punto es el vertice inferior izquierdo y el segundo es el superior derecho. Si X = (x1,x2) e Y = (y1, y2), necesariamente tenemos las relaciones: x1 <= y1 y x2 <= y2, en otro caso el rectangulo se considerara vacio, por convenio.

3) Demos una relacion de orden total entre los puntos del plano: este orden se conoce como lexicografico. Un punto X = (x1,x2) se dice menor que otro punto Y = (y1,y2) si y solo si:

a) O bien x1 < y1
b) O bien x1 = y1 , x2 < y2.

Por ejemplo, un rectangulo esta definido por dos puntos, uno lexicograficamente menor o igual que el otro.

4) Si consideramos dos rectangulos, {X1, Y1} , {X2, Y2}, entonces su interseccion es: { max{X1,X2} , min{Y1,Y2} } , considerando los maximos y minimos tomados respecto al orden lexicografico. Bien, esto es una pequeña proposicion geometrica sencilla de probar. Observa que si max{X1,X2} es mayor que min{Y1,Y2}, entonces la interseccion sera vacia, por el convenio de 2)

Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Algoritmo (parte 2)

Publicado por cemendil (6 intervenciones) el 11/12/2003 21:34:18
El servidor no me deja escribir todo el algoritmo en un solo post, asi que lo continuo aqui:

5) Ahora que sabemos intersecar dos rectangulos, basta con recordar que la interseccion de conjuntos es asociativa, por lo que basta ir intersecandolos sucesivamente. Si en algun momento obtienes el vacio, el algoritmo termina inmediatamente, dado que la interseccion sera necesariamente vacia.

6) Este algoritmo tiene una complejidad lineal en el numero de triangulos. Tengo la impresion de que se podria lograr una eficiencia superior empleando un algoritmo de ordenacion potente sobre los conjuntos de vertices, pero me disculparas si no estoy de humor para ocuparme de ello.

Todo esto lo he escrito sobre la marcha. Si realmente te interesa el algoritmo, y quieres desarrollarlo con un proposito serio (no tengo intencion de hacerte los deberes, si se trata de eso), puedo pensarlo mas a fondo y echarte una mano.

Un saludo,
C.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Codigo

Publicado por cemendil (6 intervenciones) el 12/12/2003 15:20:45
La implementacion del algoritmo es muy sencilla. Como dijimos, para determinar un rectangulo hacen falta 2 puntos, es decir, 4 coordenadas. Para declarar N rectangulos podemos hacer en C:

#define N 100 /* Por ejemplo */
double x1[N], y1[N], x2[N], y2[N];

Aqui, x1 e y1 son las coords. del vertice inferior izdo., y x2, y2 son las del superior derecho. Ahora imagina que tienes una funcion en C que calcula el maximo en una lista de N elementos (Tienes un ejemplo en mi siguiente post). Bueno, pues el algoritmo es sencillamente el siguiente:

main()
{
double ix1,iy1,ix2,iy2; /* Las 4 coords. de la interseccion. */

ix1 = maximo(x1);
iy1 = maximo(y1);
ix2 = maximo(x2);
iy2 = maximo(y2);

if ( (ix1 > ix2) || (iy1 > iy2) )
{ printf("Interseccion vacia\n"); return; }

printf("Interseccion: (%f , %f , %f, %f)\n",ix1,iy1,ix2,iy2);
return;
}

Como puedes ver el algoritmo es absolutamente sencillo. Consiste unicamente en calcular el maximo elemento en cuatro listas. Cada uno de esos maximos es una coordenada de un vertice de la interseccion. La eficiencia del algoritmo es de 4*N comparaciones para intersecar N rectangulos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Codigo (2)

Publicado por C. (6 intervenciones) el 12/12/2003 15:22:03
Para calcular el maximo de una lista, esto es una implementacion valida.

double maximo(double *lista)
{
double temp;
int i;

temp = lista[0];
for ( i = 0 ; i < N ; i++)
if (lista[i] > temp) temp = lista[i];
return(temp);
}

Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Codigo

Publicado por anna (1 intervención) el 27/07/2006 01:30:03
Permitanme una correccion:

La explicacion del algoritmo es correcta, pero la implementacion del codigo no
main()
{
double ix1,iy1,ix2,iy2; /* Las 4 coords. de la interseccion. */

ix1 = maximo(x1);
iy1 = maximo(y1);
ix2 = minimo(x2); //ATENCION, en este caso hay que buscar el minimo!
iy2 = minimo(y2);

if ( (ix1 > ix2) || (iy1 > iy2) )
{ printf("Interseccion vacia\n"); return; }

printf("Interseccion: (%f , %f , %f, %f)\n",ix1,iy1,ix2,iy2);
return;
}

Ahora si :P Muchas gracias de todas maneras me ha sido muy util!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar