判斷點是否在任意多邊形內(理論)

2021-09-20 21:27:57 字數 1304 閱讀 5078

判斷點是否在任意多邊形內

判斷方法:

一.  射線判斷

過目標點做一條直線(兩條反方向的射線),每條射線與多邊形邊的交點數量都是奇數,則點在多邊形內,否則在多邊形外部;

二. 夾角判斷

以目標點為頂點,與多邊形一條邊的兩個端點(端點分先後順序)組成乙個夾角(計算出的夾角會有正負),所有夾角之和為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點作為起始點...