判斷點是否在任意多邊形內
判斷方法:
一. 射線判斷
過目標點做一條直線(兩條反方向的射線),每條射線與多邊形邊的交點數量都是奇數,則點在多邊形內,否則在多邊形外部;
二. 夾角判斷
以目標點為頂點,與多邊形一條邊的兩個端點(端點分先後順序)組成乙個夾角(計算出的夾角會有正負),所有夾角之和為360度;
三. 面積判斷
目標點與多邊形每條邊組成的三角形,面積之和等於多邊形面積則在內部,否則在外部(原理與判斷夾角類似,面積計算量更大)。
詳細說明一下射線判斷:
// 射線判斷
// 過目標點做一條直線(兩條反方向的射線),每條射線與多邊形邊的交點(射線穿過多邊形的邊)數量都是奇數,則點在多邊形內,否則在多邊形外部;
//1. 射線方向可以是任意,為了方便計算取水平或豎直方向;
//2. 可以通過不斷縮小判斷範圍,省略每次判斷不必要的計算量:
根據多邊形頂點資訊,找到座標x的最大、最小值,y的最大、最小值,如果目標點不在該範圍內,則在多邊形外,不需要進行後續計算,返回結果;
如果目標點與多邊形端點重合(點重合),則在多邊形上,返回結果;
判斷目標點在多邊形內部或外部。
//3. 判斷目標點在多邊形內部或外部:
目標點左右兩個方向的兩條射線,任意一條與多邊形邊的交點數量為0,則在外部,返回結果;
兩條射線與多邊形邊的交點數量均為奇數,則在內部,返回結果;
其餘結果均為點在多邊形外部。
特殊情況處理:
.1 經過頂點如何計算?算乙個交點or兩個交點?
// 乙個頂點連線兩條邊,經過頂點時,如果兩條邊都在該射線的同一方向,則視為射線沒有穿過多邊形,交點數為0,如果兩條邊分別在射線的不同方向,視為射線穿過了多邊形,交點數為1;
.2 射線與多邊形邊重疊,交點個數?
// 射線經過多邊形的一條邊,與經過頂點同理,重疊邊的兩條相鄰邊,如果兩條邊都在該射線的同一方向,則視為射線沒有穿過多邊形,交點數為0,如果兩條邊分別在射線的不同方向,視為射線穿過了多邊形,交點數為1;
判斷點是否在多邊形內
1.叉乘判別法 只適用於凸多邊形 想象乙個凸多邊形,其每乙個邊都將整個2d螢幕劃分成為左右兩邊,連線每一邊的第乙個端點和要測試的點得到乙個向量v,將兩個2維向量擴充套件成3維的,然後將該邊與v叉乘,判斷結果3維向量中z分量的符號是否發生變化,進而推導出點是否處於凸多邊形內外。這裡要注意的是,多邊形頂...
判斷點是否在多邊形內
判斷點是否在多邊形內有三個步驟 自csdn 第一步 判斷這個點是不是就是多邊形的端點 第二步 判斷這個點是不是落在多邊形的邊界上 第三步 通過這個點橫向作一平行射線,判斷與多邊形的交點數,如果交點是頂點,則交點數加一,結果如果是奇數,則該點落在多邊形之內,如果是偶數,則反之。具體演算法涉及向量叉積,...
任意多邊形面積
給定多邊形的頂點座標 有序 讓你來求這個多邊形的面積,你會怎麼做?我們知道,任意多邊形都可以分割為n個三角形,所以,如果以這為突破點,那麼我們第一步就是把給定的多邊形,分割為數個三角形,分別求面積,最後累加就可以了,把多邊形分割為三角形的方式多種多樣,在這裡,我們按照如下圖的方法分割 s點作為起始點...