Algoritmos Basicos de Colisiones para Videojuegos

Rectangulo: Este es un caso trivial si el rectángulo esta alineado con los ejes, de lo contrario, se puede aplicar el algoritmo de polígono convexo.

Punto dentro de rectangulo

Al igual que en el caso del circulo basta con hacer unos cálculos sencillos, es decir determinar la distancia horizontal y vertical que separa el punto en cuestion del centro del rectángulo (En la figura se notan como |cax| y |cay| en valor absoluto porque corresponden a una distancia lineal). Los casos esta vez son:

  • |cax| <= Lx y |cay| <= Ly : El punto esta adentro.
  • Cualquier otra combinacion (|cax| > Lx, |cay| > Ly o ambas simultáneamente) : El punto esta afuera.

Al igual que en el caso del circulo este algoritmo es extensible con facilidad al 3d. Solamente hay que tener en cuenta la distancia |caz| y la mitad del lado z Lz, el punto estará adentro si se cumple que |cax| <= Lx y |cay| <= Ly y |caz| <= Lz.

struct Punto2d
{
    float x;
    float y;
};

struct Rectangulo
{
    Punto2d centro;
    float ladoX;
    float ladoY;
};

float distanciaX(Punto2d *puntoA,Punto2d *puntoB)
{
    float distancia_x = puntoB-&gt;x - puntoA-&gt;x;
    if(distancia_x &lt; 0)
    {
        return -distancia_x;
    }
    return distancia_x;
}

float distanciaY(Punto2d *puntoA,Punto2d *puntoB)
{
    float distancia_y = puntoB-&gt;y - puntoA-&gt;y;
    if(distancia_y &lt; 0)
    {
        return -distancia_y;
    }
    return distancia_y;
}

bool esPuntoAdentro(Rectangulo *rectan, Punto2d *punto)
{
    float distX =  distanciaX(&amp;(rectan-&gt;centro) , punto);
    float distY =  distanciaY(&amp;(rectan-&gt;centro), punto);
    if (distX &lt;= rectan-&gt;ladoX &amp;&amp; distY &lt;= rectan-&gt;ladoY )
    {
        return true;
    }
    return false;
}

download


Descargar:	rectangulo.zip
Version:	0.1
Actualizado:	December 22, 2009
Tamaño:		156.65 KB

1 2 3

Compartir esta entrada

DiggReddit
  • xuturk

    Muchas gracias por este tutorial, la verdad es que me a ayudado mucho a comprender las colisiones, aun me cuesta pero mañana lo mirare mas detenidamente, pero la del circulo y rectangulo me han quedado bastante claras, si que es cierto que son basicas, pero creo que gracias a esto las podre sacar partido.
    Una anotacion, pregunta:
    en la imagen de la colision del circulo, ¿la segunda operacion de raiz no seria sustituir la a por la letra c?, ya que estamos calculando desde el centro y no desde el otro punto exterior. Aun asi esta bastante claro explicado.
    Muchas gracias una vez mas.
    Saludos!

  • http://soygeek.com.mx Isaac

    Gracias! ha sido de gran ayuda

  • Dark-boy152

    ola  megusto tu projecto  muy bn echo mm puuedes de hjame tu correo para k me explikes algunas cosas k no en tiendo :D… muy buena pgina por sierto