Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Stereo en 22 Febrero 2013, 23:27 pm



Título: Comprobar colisión de 2 cuadrados en SDL
Publicado por: Stereo en 22 Febrero 2013, 23:27 pm
Hola buenas.
El caso es que estoy empezando con SDL, y me ha surgido esa duda, cómo comprobar que 2 cuadrados colisionan si solo tengo la posición y tamaño de cada uno(X, Y).

Se me ha ocurrido comprobar cada vértice:
(http://img26.imageshack.us/img26/1633/muestrawx.png)
Y funciona, pero me parece demasiado code, quería saber si se puede optimizar de alguna forma.



Título: Re: Comprobar colisión de 2 cuadrados en SDL
Publicado por: leosansan en 23 Febrero 2013, 16:47 pm

Y funciona, pero me parece demasiado code, quería saber si se puede optimizar de alguna forma.


Como no lo pones, no sé que tal estará de optimizado ese código, pero en sí la cosa es relativamente sencilla.

Los símbolos se corresponden con:

 
Citar

sd=superor derecha

si=superior izquierda

ii=inferior izquierda

id=inferior derecha


x e y para el cuadrado rojo

x_c e y_c para el cuadrado negro



Se producirá colisión si:

Código
  1. if ((xid>x_csi && yid<y_csi) || (xsd>x_cii && ysd>y_cii) || (xsi<x_cid && ysi>y_cid) || (xii<x_csd && yii<y_csd) )

Saluditos!.


Título: Re: Comprobar colisión de 2 cuadrados en SDL
Publicado por: anonimo12121 en 23 Febrero 2013, 20:08 pm
Esa forma esta mal echa porque cuando el cuadro es 10 de alto y el objeto que colision es 8 de alto  y esta justo en el centro los vertices del cuadro estan fuera.

Yo usaba unos cuantos bucles y condiciones para comprobar si algun punto del objeto A estaba dentro de B,


Título: Re: Comprobar colisión de 2 cuadrados en SDL
Publicado por: Stereo en 23 Febrero 2013, 20:41 pm
Gracias por responder pero ya he encontrado otra forma:
Código:
bool IsCollision(SDL_Rect &rect1, SDL_Rect &rect2)
{
    if(rect1.x <= rect2.x+rect2.w &&
       rect1.x+rect1.w >= rect2.x &&
       rect1.y <= rect2.y+rect2.h &&
       rect1.y+rect1.h >= rect2.y)
       return true;
    return false;
}

Esa forma esta mal echa porque cuando el cuadro es 10 de alto y el objeto que colision es 8 de alto  y esta justo en el centro los vertices del cuadro estan fuera.

Yo usaba unos cuantos bucles y condiciones para comprobar si algun punto del objeto A estaba dentro de B,

Funciona perfecto, siempre cuando el cuadrado que chequeas sea igual o más pequeño que el otro, aun así gracias.


Título: Re: Comprobar colisión de 2 cuadrados en SDL
Publicado por: leosansan en 23 Febrero 2013, 20:47 pm
Esa forma esta mal echa porque cuando el cuadro es 10 de alto y el objeto que colisión es 8 de alto  y esta justo en el centro los vértices del cuadro están fuera.


No,no está mal, siempre que trabajes con las coordenadas de los vértices de ambos cuadrados. El caso que planteas lo cubre los dos primeros casos del if, ya que antes de "entrar" colisiona. Y partimos que el cuadrado azul está inicialmente fuera.

Además en mí propuesta pueden moverse ambos cuadrados, todo se reduce a la comparación de las coordenadas.

Saluditos!.


Título: Re: Comprobar colisión de 2 cuadrados en SDL
Publicado por: anonimo12121 en 23 Febrero 2013, 21:06 pm
puede ser xD no estoy con muchas ganas hoy.


Título: Re: Comprobar colisión de 2 cuadrados en SDL
Publicado por: leosansan en 23 Febrero 2013, 22:24 pm
puede ser xD no estoy con muchas ganas hoy.

¡ ¡ ¡ Venga hombre ! ! ! , ;-) ;-) ;-)arriba esos ánimos ;-) ;-) ;-) que son dos días. El foro te necesita al cien por cien.

Saluditos!.


Título: Re: Comprobar colisión de 2 cuadrados en SDL
Publicado por: Anastacio en 24 Febrero 2013, 15:32 pm
Hola
Tenemos dos cuadrados, eso indica 8 variables en SDL.
Citar
If(((x1 > x2) and (x1 <( x2 +w2)) and (y1 > y2) and (( y1 < (y2 + h2)))
{
Collision = true;
}
En castellano:
Si x es mayor al punto x del otro cuadrado, pero menor al lado derecho del cuadrado, los cuadrados estan superpuestos. Se puede decir lo mismo de y.