Programación Específica > Programación de Videojuegos
Colision Circulo - Cuadrado
prueba2306:
Últimamente he estado buscando en la red cómo puedo llevar a cabo una colisión circulo - cuadrado, pero los ejemplos que muestran son un poco confusos (sumándole a que casi no se inglés) :huh: .
Además de buscar también ejemplos de cuadrados que no están alineados con los ejes cardinales (x,y).
El tipo de juego que estoy haciendo es en 2d y garadecería mucho que alguién me enviara información al respecto o un link donde pueda informarme de forma clara (de preferencia en español... o talvez en inglés :P).
Gracias de antemano.
Amilius:
Prueba con el DelphiX, es Open Source para Delphi 3 adelante.
Tiene un algoritmo de colisión inicialmente por rectángulos y una opción para activar colisión por pixeles.
Como el algoritmo que buscas es demasiado específico y poco aplicable en la generalidad de casos dudo que lo encuentres.
El algoritmo de colisión de pixeles sirve para cualquier tipo de formas geométricas, no importa lo retorcidas que sean:
- 1. Calcula el rectángulo de intersección de los dos rectángulos que enmarcan los "sprites" que se desea verificar si colisionaron o no. Es decir que previamente ejecuta un algoritmo de colisión por rectángulos que por fines de optimización es muchísimo más rápido.
- 2. Si el área del rectángulo de intersección es mayor o igual a cierto porcentaje "umbral" de una de las áreas rectángulo de los sprites, por ejemplo 50%, es aconsejable indicar que existió una colisión. (<100% Sólo con fines de optimización. Si se quiere ser estrictamente precisos este umbral debe ser del 100%)
- 3. En el rectángulo intersección calculado hace un barrido hasta terminar con dicha área o encontrar dos pixeles con valor disntinto de "transparente" en ambos sprites y que vayan a "dibujarse" en el mismo sector, en ese caso existió una colisión.
Como ves el algoritmo es bastante sencillo, lo complicado son los detalles de implementación.
prueba2306:
:hola: Gracias por tu respuesta.
El problema es que estoy haciendo un juego de vista isométrica con java (usando applets) y existen los dos tipos de colisiones que antes mencioné, por lo que no creo que pueda usar ese tipo de colisión :unsure: .
Gracias de todas maneras por tu ayuda. La tendré en cuenta cuando use delphi :D .
Ruben3d:
Hola.
Para poder saber si un círculo ha colisionado con un cuadrado (o rectángulo o cualquier cuadrilátero en general) se me ocurre que podrías hacer lo siguiente:
* Tener representado el cuadrado por sus 4 vértices y sus 4 aristas.</li>
* Calcular la distancia desde cada arista al centro del círculo.</li>
* Si la distancia es menor que el radio del círculo, entonces hay colisión.</li>Espero que te sirva, un saludo.
Ruben3d
Amilius:
--- Cita de: "Ruben3d" --- Hola.
Para poder saber si un círculo ha colisionado con un cuadrado (o rectángulo o cualquier cuadrilátero en general) se me ocurre que podrías hacer lo siguiente:
* Tener representado el cuadrado por sus 4 vértices y sus 4 aristas.</li>
* Calcular la distancia desde cada arista al centro del círculo.</li>
* Si la distancia es menor que el radio del círculo, entonces hay colisión.</li>Espero que te sirva, un saludo.
Ruben3d
--- Fin de la cita ---
Buena idea, pero existe un caso no cubierto:
- Si el círculo está contenido por completo por el cuadrilátero.
En ese caso la distancia desde cualquier punto del borde del cuadrilátero al centro del círculo será siempre mayor al radio del círculo.
Y la solución también es simple: calcular la distancia entre los centros de ambas figuras y que esa distancia también sea mayor al radio del círculo.
Navegación
[#] Página Siguiente
Ir a la versión completa