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.

C++:
  1. struct Punto2d
  2. {
  3.     float x;
  4.     float y;
  5. };
  6.  
  7. struct Rectangulo
  8. {
  9.     Punto2d centro;
  10.     float ladoX;
  11.     float ladoY;
  12. };
  13.  
  14.  
  15.  
  16. float distanciaX(Punto2d *puntoA,Punto2d *puntoB)
  17. {
  18.     float distancia_x = puntoB->x - puntoA->x;
  19.     if(distancia_x <0)
  20.     {
  21.         return -distancia_x;
  22.     }
  23.     return distancia_x;
  24. }
  25.  
  26. float distanciaY(Punto2d *puntoA,Punto2d *puntoB)
  27. {
  28.     float distancia_y = puntoB->y - puntoA->y;
  29.     if(distancia_y <0)
  30.     {
  31.         return -distancia_y;
  32.     }
  33.     return distancia_y;
  34. }
  35.  
  36.  
  37. bool esPuntoAdentro(Rectangulo *rectan, Punto2d *punto)
  38. {
  39.     float distX =  distanciaX(&(rectan->centro) , punto);
  40.     float distY =  distanciaY(&(rectan->centro), punto);
  41.     if (distX <= rectan->ladoX && distY <= rectan->ladoY )
  42.     {
  43.         return true;
  44.     }
  45.     return false;
  46. }

ColisionRectangulo.zip( 504 descargas)

COMENTARIOS

Dejar un comentario

:mrgreen: :| :twisted: :arrow: 8O :) :? 8) :evil: :D :idea: :oops: :P :roll: ;) :cry: :o :lol: :x :( :!: :?: