更快速的點(滑鼠)與多邊形位置檢測方法

 Thu, 27 Jul 2006 18:18:21 +0800

我之前用的方法需要計算出多邊形的邊的點集合,速度比較慢,不適合用來快速偵測滑鼠位置。

現在改用點與多邊形頂點夾角總和的方法,只要用多邊形的頂點就可以快速判斷一個點是否在多邊形內。因為javascript的Math.atan2函數可以處理點與角的關係,所以用javascript的內建函數就可以快速做出計算。(當然,這個方法還是只適用於凸多邊形)

我用下面這個函數來處理多邊形頂點與點的關係:

function inPolygon2 (_points, _point) {
try {
if (_points.length < 3) throw "_points must contain at least 3 Point!";
var sum = new Array();
for (var i=0; i<_points.length; i++) {
sum.push(Math.atan2(_points[i].x-_point.x,_points[i].y-_point.y)/Math.PI*180);
}
var sum1 = new Array();
for (var i=0; i 359 && summary < 361) {
return true;
} else {
return false;
}
} catch(e) {alert(e);return false;}
}

傳進去的第一個參數是多邊形頂點集合,依照順時鐘或逆時鐘順序排列。第二個參數是要檢測位置的點。

我用另外一個函數來計算夾角:

function countAngle (a1,a2) {
try {
if (a1*a2 < 0) {
var tmp = Math.abs(a1)+Math.abs(a2);
if (tmp>180) {tmp = 360-tmp;}
return tmp;
} else if (a1*a2 >0) {
return Math.abs(a1-a2);
} else {
return Math.abs(a1+a2);
}
} catch (e) {alert(e);}
}

比起舊的方法,因為需要判斷的點少很多,速度會非常快。

完成的效果可以參考這個網頁:http://www.fillano.idv.tw/game.htm

點選「網頁遊戲測試 V0.10」的連結就可以看到目前做出來的效果。