生活随笔
收集整理的這篇文章主要介紹了
多边形碰撞检测(判断点在多边形内)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
點(diǎn)與規(guī)則的矩形或者等邊、等腰三角形等的碰撞檢測很簡單,本文主要是介紹“點(diǎn)與多邊不規(guī)則圖形的碰撞檢測”。
如圖,這個(gè)多邊形已經(jīng)相當(dāng)復(fù)雜,包含凸和凹,該如何解決呢?
結(jié)論:使用交點(diǎn)數(shù)判斷。即從碰撞點(diǎn)發(fā)射出一條水平射線,計(jì)算這條射線和多邊形的交點(diǎn)數(shù),如果是奇數(shù)說明點(diǎn)在多邊形內(nèi)部,反之則在外部。
代碼如下:
/*** JS 代碼* 判斷點(diǎn)是否在多邊形內(nèi)* 求解通過該點(diǎn)的水平線與多邊形各邊的交點(diǎn)* 單邊交點(diǎn)為奇數(shù),成立* IVector2:封裝數(shù)學(xué)庫,包含x,y兩個(gè)變量* Array:數(shù)組* @param pos 傳入點(diǎn)的坐標(biāo)pos.x, pos.y* @param posPolygon 多邊形的各個(gè)頂點(diǎn)坐標(biāo)* @param count 多邊形頂點(diǎn)的個(gè)數(shù)
*/
public static PointInPolygon( pos:IVector2, posPolygon:Array<IVector2>, count:int ):boolean
{let cross: int = 0; //交點(diǎn)個(gè)數(shù)for( let i = 0; i < count; i++ ){let p1: IVector2 = posPolygon[i];let p2: IVector2 = posPolygon[(i + 1) % count]; //下一個(gè)節(jié)點(diǎn)// p1p2這條邊與水平線平行if( p1.y == p2.y )continue;// 交點(diǎn)在p1p2的延長線上if( pos.y < Math.min( p1.y, p2.y ) )continue;// 交點(diǎn)在p1p2的延長線上if( pos.y > Math.max( p1.y, p2.y ) )continue;// 計(jì)算交點(diǎn) X 左邊 : (p2.y - p1.y)/(p2.x - p1.x) = (y - p1.y)/(x - p1.x)// 直線 K 值相等, 交點(diǎn)y = pos.ylet x = (pos.y - p1.y) * (p2.x - p1.x) / (p2.y - p1.y) + p1.x// 只統(tǒng)計(jì)單邊交點(diǎn),即點(diǎn)的正向方向if(x > pos.x)cross ++;}return cross % 2 == 1;
}
?
總結(jié)
以上是生活随笔為你收集整理的多边形碰撞检测(判断点在多边形内)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。