更快速的點(滑鼠)與多邊形位置檢測方法
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; i359 && 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」的連結就可以看到目前做出來的效果。