Programación Específica > Programación de Videojuegos

 Colision Circulo - Cuadrado

<< < (2/2)

Ruben3d:

--- Citar ---calcular la distancia entre los centros de ambas figuras y que esa distancia también sea mayor al radio del círculo.

--- Fin de la cita ---

Esta solución para el caso particular falla si el círculo es considerablemente más pequeño que el cuadrilátero. Para ilustrarlo, pongo un ejemplo simple con un rectángulo de lados paralelos a los ejes:

--- Código: Text ---  +---------------------------------+|                                 ||                                 ||                          _      ||                         / &#092;     ||                        |   |    ||                         &#092;_/     |+---------------------------------+   
Como se puede observar (a pesar de mi habilidad haciendo dibujos en ASCII) el centro del círculo cumple la condición de estar más alejado del centro del rectángulo que el tamaño del radio, por lo que no habría colisión, cuando en verdad sí la hay.

Creo que la solución pasaría por determinar si el centro del círculo está en el interior del cuadrado. Esto es bastante fácil si el rectángulo está alineado con los ejes, pero si no lo está el proceso es bastante más costoso computacionalmente hablando.

Un saludo.

Ruben3d

Ruben3d:
Se me acaba de ocurrir cómo computar eficientemente si el centro del círculo está en el interior del cuadrilátero aprovechando que se trata de un juego en vista isométrica.

En un juego de este tipo, el cuadrilátero será un rombo, con este aspecto:


--- Código: Text ---           B         /&#092;      /      &#092;A /      .O    &#092;   &#092;            / C      &#092;      /         &#092;/         D  
donde A, B, C, D y O son puntos.

Viendo el dibujo podemos observar que A y C están a la misma altura, alineados con O. También están alineados B, O y D. Aprovechando esta característica se puede saber con pocos cálculos si el punto está en el interior del rombo realizando subdivisiones del espacio:
* Se calcula si el punto está a la izq. o a la dcha. de la recta BD (eficiente, pues está alineada con el eje Y). Esto nos divide el espacio en dos subespacios.</li>
* Calcular si el punto está encima o debajo de la recta AC (también eficiente). Esto nos divide el subespacio en el que estemos en otros dos.</li>
* Llegados a este punto, en el subespacio que estemos sólo habrá una recta: AB, BC, CD ó DA. Dependiendo de en el subespacio que estemos, habrá que saber si estamos encima o debajo de la recta.</li>
* Construimos la ecuación punto-pendiente de la recta correspondiente y sustituimos el valor de la componente X del punto.</li>
* Ya solo resta comparar el resultado con el valor de la componente Y del punto para saber si está encima o debajo de la recta.</li>De esta manera, sólo hay que realizar un cálculo complejo para uno de los segmentos, en vez de los cuatro.

Espero no haber metido la pata en ningún lado.

Un saludo.

Ruben3d

Navegación

[0] Índice de Mensajes

[*] Página Anterior

Ir a la versión completa