Algoritmos para colisiones de boundings

Colisión Rectángulo-Circulo

De nuevo para el caso en que están alineados con los ejes es trivial. Basta con comprobar si la distancia horizontal y vertical entre el centro del rectángulo y el centro del círculo es menor a la suma del lado medio y el radio del círculo.

El algoritmo se resumen en:

Si (distancia (CircX – RectanX) <= CircRadio + RectanXLado/2)
Si (distancia (CircY – RectanY) <= CircRadio + RectanYLado/2)

Si ambas condiciones se cumplen: colisión.

El código es:

struct Punto2d
{
	float x;
	float y;
};

struct Rectangulo2d
{
	Punto2d p1;
	Punto2d p2;
	Punto2d p3;
	Punto2d p4;
	Punto2d mov;
	Punto2d centro;
	float rot;
};

struct Circulo2d
{
	Punto2d centro;
	float radio;
};

Rectangulo2d rectangulo;
Circulo2d circulo;

…

	ladoX = abs(rectangulo.p2.x - rectangulo.centro.x) + circulo.radio;
	ladoY = abs(rectangulo.p3.y - rectangulo.centro.y) + circulo.radio;

…

//Evalua el contacto entre dos circulos usando la distancia regular
bool evaluarContacto(Rectangulo2d *rectan, Circulo2d *circ)
{
	Punto2d centroRect;
	centroRect.x =  (*rectan).centro.x + (*rectan).mov.x;
	centroRect.y =  (*rectan).centro.y + (*rectan).mov.y;

	Punto2d centroCirc;
	centroCirc.x = (*circ).centro.x;
	centroCirc.y = (*circ).centro.y;

	float dX = 0;
	dX = distanciaX(&centroRect,&centroCirc);
	float dY = 0;
	dY = distanciaY(&centroRect,&centroCirc);

	if(dX <= ladoX && dY <= ladoY)
		return true;

	return false;
}

Utilizando las mismas funciones de distanciaX y distanciaY del ejemplo circulo, circulo. El código está de nuevo en vs 2010 para c++, facilmente portable a vs 2008, funciona hasta ahora para Windows 7 y Xp.

download


Descargar:	RectanCirc.rar
Version:	0.1
Actualizado:	December 6, 2010
Tamaño:		57.08 KB

Como se puede observar de los ejemplos, las colisiones de rectángulos y círculos alineados con los ejes son bastante intuitivas. Debido a la extensión de este tutorial dejo para más adelante el tema de colisiones de rectángulos con rotación arbitraria, algoritmos que en sí son similares a los alineados con ejes, pero requerirán de proyecciones. De igual manera quedan por explorar algoritmos de distancias, por ejemplo distancia punto-recta y distancia punto-plano, que son útiles también a la hora de realizar detección de colisiones.

1 2 3 4

Compartir esta entrada

DiggReddit
  • Homerocracia

    Hola, interesante mu00e9todo, lo voy a probar. En la primer figura me parece que hay un error en la expresiu00f3n de d(c1-c2), ya que aparecen dos tu00e9rminos que corresponden a variables de X , pero no de Y [ d(c1-c2)=( (c1x-c2x)’1/2 + (c1x-c2x)’1/2) ‘ 1/2]. Saludos

  • http://black-byte.com Jotatsu

    Efectivamente se me habu00eda pasado el error, corregido.nnGracias.

  • Leo

    Hola los links no me funcionan

  • http://black-byte.com Jotatsu

    Click derecho y guardar como, ya los probe.

  • Caris

    es dificil entender esto pero quien me puede explicar ke es esto solo keria buscar diferentes formas de multiplicar

  • http://black-byte.com Jotatsu

    No entendu00ed -.-

  • Locopon

    u00bfcomo descargo los archivos?