Search code examples
libgdxcollision-detectioncollision

Collision detection for an arc of a circle


So how do i implement the collision detection for an arc of a circle? Will i have to use the Box 2d collision or can i do it some other way using Rectangle or stuff like that?

BTW I hate box2d because i dont understand most of the things in it, so if there is a solution that excludes the box2d, it will be very much appreciated.

yellow arc circle

The yellow arc keeps on rotating over the black circle. How do i implement collision detection in here?

Please help ! Thanks!


Solution

  • To avoid using Box2D you could define the shape as a polygon and use the polygon.contains(x,y) method or use the Intersector

    Below is an example using both:

    import com.badlogic.gdx.ApplicationAdapter;
    import com.badlogic.gdx.Gdx;
    import com.badlogic.gdx.InputProcessor;
    import com.badlogic.gdx.graphics.Color;
    import com.badlogic.gdx.graphics.GL20;
    import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
    import com.badlogic.gdx.math.Circle;
    import com.badlogic.gdx.math.Intersector;
    import com.badlogic.gdx.math.Polygon;
    
    public class Test extends ApplicationAdapter implements InputProcessor{
        private ShapeRenderer sr;
        private Polygon polya;
    
        private boolean isColliding = false;
        private Circle mp;
    
        @Override
        public void create () {
    
            //define arc as polygon 
            // the more points used to define the shape will 
            // increase both required computation and collision precision
            polya = new Polygon();
    
        // create vertices
        float section = 15f;
        float[] newVerts = new float[200];
        for(int i = 0; i < 50; i++){
            newVerts[i*2] = (float)Math.sin(i/section); //x 0 to 98 even
            newVerts[i*2+1] = (float)Math.cos(i/section); //y 1 to 99  odd
    
            newVerts[199-i*2] = (float)Math.cos(i/section); //x 100 to 108
            newVerts[198-i*2] = (float)Math.sin(i/section) + 0.2f; //y 101 to 199
    
        }
    
        polya.setVertices(newVerts);
        polya.scale(50);
        polya.setOrigin(1, 1);
        polya.rotate(60);
    
            //define circle to act as point for checking intersections
            mp = new Circle(Gdx.graphics.getWidth()/2,Gdx.graphics.getHeight()/2,4);
            // setup batchers
            sr = new ShapeRenderer();
            sr.setAutoShapeType(true);
    
            Gdx.input.setInputProcessor(this);
    
        }
    
        @Override
        public void render () {
            Gdx.gl.glClearColor(0f, 0f, 0f, 0f);
            Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    
            // check collision with polygon
            isColliding = polya.contains(mp.x,mp.y);
    
            //check collision using Intersector
            isColliding = Intersector.isPointInPolygon(polya.getTransformedVertices(),0,polya.getVertices().length,mp.x,mp.y);
    
    
            sr.begin();
            sr.setColor(Color.WHITE);
            if(isColliding){
                sr.setColor(Color.RED);
            }
            sr.polygon(polya.getTransformedVertices());
            sr.circle(mp.x,mp.y,mp.radius);
            sr.end();
    
        }
    
        @Override
        public void dispose () {
        }
    
        @Override
        public boolean mouseMoved(int screenX, int screenY) {
            int newy = Gdx.graphics.getHeight() - screenY;
            polya.setPosition(screenX, newy);
            return false;
        }
    
    
        (... removed unused input processor methods for clarity ...)
    }