矩形和圓碰撞 方法

2021-08-25 16:28:33 字數 2249 閱讀 7991

/*

* arcx,arcy表示圓的繪製座標,就是左上角座標 ,arcr為圓半徑;rectx,recty,rectw,recth分別表示矩形的繪製座標與寬高

*/private static final boolean isarcrectcollides(int arcx,int arcy,int arcr,int rectx,int recty,int rectw,int recth)//判斷當圓心的y座標進入矩形內時x的位置,如果x在(rectx-arcr)到(rectx+rectw+arcr)這個範圍內,則碰撞成功

int mindisy = 0;

if(arcox >= rectx && arcox <= rectx + rectw)//判斷當圓心的x座標進入矩形內時y的位置,如果x在(recty-arcr)到(recty+recth+arcr)這個範圍內,則碰撞成功

return false;

}

/*判斷圓與長方形的關係,一共四種關係:圓與長方形不包含也不相交,返回1;相交返回2 ; 圓在長方形內部返回3;長方形在圓內部返回4*/

//假定矩形由d1,d2,d3,d4頂點按順時針方向組成,ywz為圓心位置,yzj為圓直徑。

int y_zfx_wz(d3dxvector2 &ywz,float &yzj,d3dxvector2 &d1,d3dxvector2 &d2,d3dxvector2 &d3,d3dxvector2 &d4)

k=4*pow((d3.x-d2.x)*(d3.x-ywz.x)+(d3.y-d2.y)*(d3.y-ywz.y),2)-4*(pow(d3.x-d2.x,2)+pow(d3.y-d2.y,2))*(pow(d2.x-ywz.x,2)+pow(d2.y-ywz.y,2)-pow(yzj,2));

//如果有在d3-d2確定的直線上有交點

if (k>=0)

k=4*pow((d4.x-d3.x)*(d4.x-ywz.x)+(d4.y-d3.y)*(d4.y-ywz.y),2)-4*(pow(d4.x-d3.x,2)+pow(d4.y-d3.y,2))*(pow(d3.x-ywz.x,2)+pow(d3.y-ywz.y,2)-pow(yzj,2));

//如果有在d4-d3確定的直線上有交點

if (k>=0)

k=4*pow((d1.x-d4.x)*(d1.x-ywz.x)+(d1.y-d4.y)*(d1.y-ywz.y),2)-4*(pow(d1.x-d4.x,2)+pow(d1.y-d4.y,2))*(pow(d4.x-ywz.x,2)+pow(d4.y-ywz.y,2)-pow(yzj,2));

//如果有在d1-d4確定的直線上有交點

if (k>=0)

/* 2、計算圓心點與四邊線段的距離,根據正負距離判斷*/

d3dxvector2 ls;

float z,l1,l2,l3,l4;//l1,l2,l3,l4為記錄圓心點與四邊的距離,在邊法向量正側為正,反之為負

ls=d2-d1;

z=ls.x;ls.x=ls.y;ls.y=-z;

d3dxvec2normalize(&ls,&ls);//第乙個邊的法向量

l1= ls.x*(ywz.x-d1.x)+ls.y*(ywz.y-d1.y); //圓心與d2-d1邊的距離

l2= ls.y*(ywz.x-d2.x)-ls.x*(ywz.y-d2.y); //圓心與d3-d2邊的距離

l3= -ls.x*(ywz.x-d3.x)-ls.y*(ywz.y-d3.y); // 圓心與d4-d3邊的距離

l4= -ls.y*(ywz.x-d4.x)+ls.x*(ywz.y-d4.y); //圓心與d1-d4邊的距離

if ((l1>=yzj)&&(l2>=yzj)&&(l3>=yzj)&&(l4>=yzj))

return 3; //圓在長方形內部,也就是長方形包含圓

//3、如果矩形四個頂點都在圓內,則返回4

if ((pow(d1.x-ywz.x,2)+pow(d1.y-ywz.y,2)<=yzj*yzj)&&(pow(d2.x-ywz.x,2)+pow(d2.y-ywz.y,2)<=yzj*yzj)&&(pow(d3.x-ywz.x,2)+pow(d3.y-ywz.y,2)<=yzj*yzj)&&(pow(d4.x-ywz.x,2)+pow(d4.y-ywz.y,2)<=yzj*yzj))

return 4;

//4、必定剩餘第一種情況,圓與正方形不相交,也不包含

return 1;

}

矩形與圓碰撞檢測

說下演算法思想。判斷三種情況。1.矩形四個頂點在圓內。2.判斷圓的內接正方形與矩形是否碰撞 3.判斷圓上的水平左右 豎直上下四個點是否在矩形內。其中1比較簡單,只需比較點到圓心距離與圓半徑即可。3也簡單,判斷點是否在矩形內的思想是,若點在矩形內,則任意選定矩形四個頂點中的乙個與該點連線,其他3點必不...

旋轉的矩形與圓的碰撞檢測

在2d平面中,圓與圓檢測是否發生碰撞很簡單,方法即為比較兩個圓心之間的距離與半徑之和。而矩形與圓則需要稍微複雜一點的計算。不旋轉,意思是矩形的邊分別與兩個座標軸平行,矩形長平行於x軸,矩形寬平行於y軸。下面是其碰撞檢測的具體邏輯 參考這篇文章 怎樣判斷平面上乙個矩形和乙個圓形是否有重疊?而對於旋轉的...

flex 矩形碰撞

先上圖 img 應用 判斷乙個canvas所覆蓋區域中所有控制項 相交包含 當然這個canvas漂浮在其他控制項之上的 案例分析 img 矩形 rectangle1 的 中心座標 x1,y1 矩形 rectangle2 的 中心座標 x2,y2 1.相交的情況也就是兩個 矩形的中心座標垂直間距 x2...