Android: Cómo detectar la colisión entre dos círculos

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;
                }
            }
        }

preguntado el 12 de junio de 12 a las 22:06

2 Respuestas

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

¡Este enlace es bastante útil!

Colisiones círculo-círculo

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

¿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

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.