Agustin Val
Agustin Val

Reputation: 187

How to determine the point in a circle collision?

I have 2 circles, one that i move and the other in the center of the screen. What I want to do is that the circles do not overlap when I move one over another. I managed to do something similar but it's horrible, I wanted to know if there is a more efficient way to do it.

public class Juego extends SurfaceView implements View.OnTouchListener{

private Paint paint;
int x = 100, y = 100, radio = 100, otroX, otroY;

public Juego(Context context, AttributeSet attrs) {
    super(context, attrs);
    this.setOnTouchListener(this);
    setFocusable(true);
    paint = new Paint();
}

public void onDraw(Canvas canvas) {

    paint.setColor(Color.WHITE);
    canvas.drawRect(0, 0, getWidth(), getHeight(), paint);

    paint.setColor(Color.BLACK);
    canvas.drawCircle(x, y, radio, paint);

    otroX = canvas.getWidth() / 2;
    otroY = canvas.getHeight() / 2;

    canvas.drawCircle(otroX, otroY, radio, paint);

    invalidate();
}

@Override
public boolean onTouch(View view,MotionEvent motionEvent){

    x = (int)motionEvent.getX();
    y = (int)motionEvent.getY();

    double dist = Math.sqrt(Math.pow((x - otroX), 2) + Math.pow((y - otroY), 2));

    if (dist <= radio + radio) {

        if (x < otroX) {
            x = otroX - radio - (radio / 2);
        }
        if (x > otroX) {
            x = otroX + radio + (radio / 2);
        }
        if (y < otroY) {
            y = otroY - radio - (radio / 2);
        }
        if (y > otroY) {
            y = otroY + radio + (radio / 2);
        }
    }

    invalidate();
    return true;
}

}

This is what i have: https://mega.nz/#!HZsVhR4L!v6AhTWgJ27U8vV1rYJ_BuO8O2TxgKJV113m58P6ANek

and this is what i want: https://mega.nz/#!PJFHmDYR!auzX-L-TBTNCZuD8vX8ugUeZmi-HhtWLqs6mUilfW_M

Upvotes: 3

Views: 81

Answers (1)

Eselfar
Eselfar

Reputation: 3869

To solve the issue, when the moving circle is too close, we need to move it at the expected minimum distance, on the line defined by the two circles centres:

@Override
public boolean onTouch(View view, MotionEvent motionEvent) {

    x = (int) motionEvent.getX();
    y = (int) motionEvent.getY();

    double dist = Math.sqrt(Math.pow((x - otroX), 2) + Math.pow((y - otroY), 2));

    if (dist <= radius * 2) {
        // This calculate the displacement of a the distance 'radius*2' on the line between the two circles centers.
        double angle = Math.atan2(y - otroY, x - otroX);           
        int moveX = (int) ((radius * 2) * Math.cos(angle));
        int moveY = (int) ((radius * 2) * Math.sin(angle));
        // Then we need to add the displacement to the coordinates of the origin to have the new position.
        x = otroX + moveX;
        y = otroY + moveY;
    }

    invalidate();
    return true;
}

This code is based on KazenoZ answer.

Upvotes: 1

Related Questions