Comprobar colisión de 2 cuadrados en SDL

Iniciado por Stereo, 22 Febrero 2013, 23:27 PM

0 Miembros y 1 Visitante están viendo este tema.

Stereo

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:

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


leosansan

Cita de: Stereo en 22 Febrero 2013, 23:27 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 (cpp) [Seleccionar]
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!.

anonimo12121

#2
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,
Página para ganar Bitcoins y Dinero: http://earnbit.hol.es/
Video de YouTube con Hack para el LoL: http://adf.ly/5033746/youtube-lolemuhack
Si quieres ganar dinero con adfly entra y registrate aquí -> http://adf.ly/?id=5033746

Stereo

Gracias por responder pero ya he encontrado otra forma:

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;
}


Cita de: Xafi 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,

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

leosansan

Cita de: Xafi en 23 Febrero 2013, 20:08 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!.

anonimo12121

puede ser xD no estoy con muchas ganas hoy.
Página para ganar Bitcoins y Dinero: http://earnbit.hol.es/
Video de YouTube con Hack para el LoL: http://adf.ly/5033746/youtube-lolemuhack
Si quieres ganar dinero con adfly entra y registrate aquí -> http://adf.ly/?id=5033746

leosansan

Cita de: Xafi en 23 Febrero 2013, 21:06 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!.

Anastacio

Hola
Tenemos dos cuadrados, eso indica 8 variables en SDL.
CitarIf(((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.
You, stop to close my post, you were novice too!!!!!!!!!!!!