一 前言
維基百科上面是英文撞蜂,所有找了一段百度百科的定義
地理圍欄(Geo-fencing)是LBS的一種應(yīng)用, 就是用一個(gè)虛擬的柵欄圍出一個(gè)虛擬地理邊界. 當(dāng)手機(jī)進(jìn)入, 離開(kāi)某個(gè)特定地理區(qū)域, 或在該區(qū)域內(nèi)活動(dòng)時(shí), 手機(jī)可以接收自動(dòng)通知和警告.
很明顯核心問(wèn)題就是判斷點(diǎn)是否在多邊形內(nèi)。
二 判斷點(diǎn)在多邊形內(nèi)部
-
射線法(對(duì)凹凸多邊形都適用)激蹲。實(shí)現(xiàn)原理:如下圖(懶得畫(huà)了让簿,截取了文章1的圖)從判斷點(diǎn)開(kāi)始沿著X軸畫(huà)一條射線谒臼,依次判斷該射線與邊的交點(diǎn)价匠。
如果交點(diǎn)個(gè)數(shù)是奇數(shù)墨微,則點(diǎn)在多邊形內(nèi),如果個(gè)數(shù)是偶數(shù)陪捷,則點(diǎn)在多邊形外碾盐。
射線法判斷點(diǎn)在多邊形內(nèi)外.png
交點(diǎn)的x坐標(biāo)求解用的是相似多邊形性質(zhì),計(jì)算公式如下圖(這個(gè)是自己畫(huà)的)
求解交點(diǎn)坐標(biāo).png
算法實(shí)現(xiàn)
/**
*
* @param point 判斷點(diǎn)
* @param points 多邊形的頂點(diǎn)集合
* @return
*/
public boolean pointInPoly(Point point ,Point[] points){
boolean isContains=false;
int end=points.length-1;
for (int i=0;i<points.length;i++){
//通過(guò)判斷點(diǎn)的y坐標(biāo)和每條邊的兩個(gè)端點(diǎn)的y坐標(biāo)比較揩局,判斷點(diǎn)是否在這條邊的中間
if (point.getY()>points[i].getY()&&point.getY()<=points[end].getY()||point.getY()<=points[i].getY()&&point.getY()>=points[end].getY()){
//計(jì)算交點(diǎn)的x坐標(biāo)值,如果小于x則記為一次(只需要判斷射線一側(cè)的點(diǎn)個(gè)數(shù)即可)
if((point.getY()-points[i].getY())/(points[end].getY()-points[i].getY())*(points[end].getX()-points[i].getX())+points[i].getX()<point.getX()){
isContains=!isContains;
}
}
//移動(dòng)頂點(diǎn)位置
end=i;
}
return isContains;
}