Android碰撞检测——圆形检查

来源:互联网 发布:工程优化方法及其应用 编辑:程序博客网 时间:2024/05/05 06:10

圆形检查的思路:两个圆的圆心距小于两个圆的半径之和则相碰撞了,反之,没有发生碰撞

    /**     * 两个圆的碰撞检测     * @param x1     * @param y1     * @param r1     * @param x2     * @param y2     * @param r2     * @return     */    public static boolean CheckCollideCircle(int x1, int y1, int r1, int x2,            int y2, int r2) {        boolean iscollide=false;        //两点之间的距离 小于两半径之和就发生了碰撞        if(Math.sqrt(Math.pow(x1-x2,2)+Math.pow(y1-y2, 2))<=r1+r2){            iscollide=true;        }        return iscollide;    }

下面用一个完整列子说明

public class CircleSurfaceView extends SurfaceView implements Callback,Runnable {    int x1=70,y1=110,r1=40;    int x2=220,y2=110,r2=40;    boolean isCollide=false;//是否发生碰撞    SurfaceHolder surfaceHolder;    Paint paint;    boolean flag=false;    int sleeptime=100;    Thread thread;    public CircleSurfaceView(Context context) {        super(context);        surfaceHolder=getHolder();        surfaceHolder.addCallback(this);        paint=new Paint();        paint.setTextSize(12);        thread=new Thread(this);        flag=true;    }        public void draw(Canvas canvas) {        canvas.drawColor(Color.BLACK);        if(isCollide){            paint.setColor(Color.RED);            canvas.drawText("Collide", 0, 30, paint);        }        else {            paint.setColor(Color.WHITE);            canvas.drawText("Not Collide", 0, 30, paint);        }        canvas.drawCircle(x1, y1, r1, paint);        canvas.drawCircle(x2, y2, r2,paint);    }    /**     * 触屏点击事件     */    @Override    public boolean onTouchEvent(MotionEvent event){        x1=(int)event.getX()-r1/2; //圆心坐标        if(CheckCollide.CheckCollideCircle(x1, y1, r1, x2, y2, r2)){//检查碰撞的方法            isCollide=true;        }        else {            isCollide=false;        }        return true;    }        @Override    public void surfaceCreated(SurfaceHolder holder) {        // TODO Auto-generated method stub        if(!thread.isAlive()){            thread.start();        }    }    @Override    public void surfaceDestroyed(SurfaceHolder holder) {        // TODO Auto-generated method stub        flag=false;        thread=null;    }    @SuppressLint("WrongCall")    @Override    public void run() {        // TODO Auto-generated method stub        Canvas canvas=null;        while (flag) {            try {                canvas=surfaceHolder.lockCanvas();                synchronized (canvas) {                    draw(canvas);                    }            } catch (Exception e) {                Log.e("Collide", e.getMessage());            }finally{                if(canvas!=null){                    surfaceHolder.unlockCanvasAndPost(canvas);                }            }            try {                Thread.sleep(sleeptime);            } catch (Exception e) {                Log.e("Collide", e.getMessage());            }        }    }    @Override    public void surfaceChanged(SurfaceHolder holder, int format, int width,            int height) {        // TODO Auto-generated method stub            }}

 

 


<script type="text/javascript"><!--google_ad_client = "ca-pub-1944176156128447";/* cnblogs 首页横幅 */google_ad_slot = "5419468456";google_ad_width = 728;google_ad_height = 90;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>