Android: Cómo detectar la colisión entre dos círculos
Frecuentes
Visto 1,818 veces
1
He dibujado varios círculos de diferentes tamaños y posiciones en un lienzo, pero necesito detectar colisiones entre ellos.
public void run() {
while(Run){
if(!sHold.getSurface().isValid())
continue;
c[0][cnum].r++;
canvas = sHold.lockCanvas();
canvas.drawRGB(02, 02, 150);
Paint white = new Paint();
white.setColor(Color.WHITE);
if(c[0][cnum].x != 0 && c[0][cnum].y != 0)
canvas.drawCircle(c[0][cnum].x, c[0][cnum].y, c[0][cnum].r, white);
if(cnum!=0)
for(int i=0; i<cnum; i++)
canvas.drawCircle(c[1][i].x, c[1][i].y, c[1][i].r, white);
sHold.unlockCanvasAndPost(canvas);
if(((c[0][cnum].x - c[0][cnum].r)<0)||((c[0][cnum].y-c[0][cnum].r)<0)||((c[0][cnum].y+c[0][cnum].r)>height)||((c[0][cnum].x+c[0][cnum].r>width))){
c[1][cnum].x = c[0][cnum].x;
c[1][cnum].y = c[0][cnum].y;
c[1][cnum].r = c[0][cnum].r;
broken = true;
break;
}
}
}
2 Respuestas
6
No deberías hacer eso en las fases de renderizado.
Al procesar las lógicas, debe verificar si los círculos se cruzan como se describe:
v1 = centro del círculo1 v2 = centro del círculo2
interseca = v1 - v2 < círculo1radio + círculo2radio
Respondido el 12 de junio de 12 a las 22:06
1
¡Este enlace es bastante útil!
Es muy detallado y didáctico.
En la parte inferior de esa página hay otros enlaces, ¡a cosas aún más detalladas!
Usé el método de Distancia entre centros --- Círculos
Al medir la distancia entre cada centro, puede decir si están colisionando. La distancia nunca debe ser mayor que la suma de los 2 radios.
Esto es lo que hice:
private boolean checkDrawContains(ShapeDrawable newHole)
{
long newCenterX = newHole.getBounds().left + (newHole.getBounds().width()/2); //Get the center of my shapes
long newCenterY = newHole.getBounds().top + (newHole.getBounds().height()/2);
for(ShapeDrawable hole: mHoles) // I was storing the circles in an ArrayList
{
long centerX = hole.getBounds().left + (hole.getBounds().width()/2); //Get the center of my shapes
long centerY = hole.getBounds().top + (hole.getBounds().height()/2);
long x = centerX - newCenterX;
long y = centerY - newCenterY;
long aux = (long) ((Math.pow(Math.abs(x),2)) + (Math.pow(Math.abs(y),2))); //Pythagoras the hard way :P
long distance = (long) Math.sqrt(aux);
long sRads = (newHole.getBounds().width()/2) + (hole.getBounds().width()/2);
if(distance <= sRads ) {
return true; //Is Colliding!
}
}
return false; // Is not Colliding!
}
contestado el 31 de mayo de 15 a las 07:05
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas android collision-detection geometry or haz tu propia pregunta.
¿Puedes explicar mejor cuál fue la respuesta que encontraste al leer ese enlace? Queremos intentar tener toda la información disponible en la publicación para responder a la pregunta, para que sea más útil para los futuros lectores de la publicación. - McWayWeb
¡Simplemente lo hizo! Gracias por el consejo - justo