碰撞檢測 判斷點是否在多邊形內部

2021-09-11 15:59:41 字數 1209 閱讀 4602

本文demo演示:

基本判斷原理:

判斷乙個點是否在乙個多邊形中,有乙個簡單的做法:

從這個點發射一條射線,統計射線與多邊形

有多少條邊相交,

奇數表示點在多邊形內,偶數表示點不在多邊形內。

為了簡化計算,射線是水平的。

如下圖所示:

點 a 水平向右的射線有 5 個交點,奇數,a在多邊形內。

點 b 水平向右的射線有 2 個交點,偶數,b 在多邊形外部。

如果乙個點在多邊形內,穿過這個點的水平直線,點左邊的相交點個數是奇數,點右邊的相交點是奇數。

演算法只要統計點的一側(左邊或者右邊)的相交點個數即可。

如圖:

點 a 的射線穿過多邊形的乙個頂點,這應該視為穿過了多邊形的一條邊,只有乙個交點。

為了防止被判斷為穿過了多邊形的2條邊,有如下做法:

可以規定與測試點y重疊的頂點要麼在y上面空間,要麼在y下面空間。

具體做法之一:如果測試點的y軸小於線段最小y值的頂點,就認為不相交。

也就是說,讓2個相鄰的線段的交點不重疊,乙個線段占用頂點的位置,乙個線段讓出頂點的位置。

如圖:

點 a 和多邊形一條邊相交,然後和2個頂點相交。

這種情況,要判斷交點的2條線段,是否是都同時在點a的一側,上面或者下面,如果都在一側,可以認為沒相交。

如圖:

如圖:

射線交點法的問題是,有很多特殊情況,要做特殊處理。

本文暫且不介紹所有特殊情況的處理。^_^

簡單起見,可以再投一條射線檢測另乙個方向的情況。增大正確判斷的概率。

判斷多邊形重疊 多邊形碰撞檢測

在討論多邊形碰撞檢測之前,我們可以先思考一下遊戲物件怎麼判斷2d圖形有碰撞,靠的是判斷2d圖形在遊戲世界中有接觸,或者有重疊區域,大到包含,小到重疊接觸乙個點。那麼我們就需要精確計算2d圖形在某一幀有重疊部分,或者預判到下一幀有重疊部分,那麼就是碰撞到了。先從簡單的模型來討論碰撞。判斷乙個點是否在多...

pnpoly 判斷點是否在多邊形內部 c

遇到了乙個問題,如何判斷乙個點是否在乙個多邊形內部。主要有以下幾種方法 1 面積和判別法 判斷目標點與多邊形的每條邊組成的三角形面積和是否等於該多邊形,相等則在多邊形內部。2 夾角和判別法 判斷目標點與所有邊的夾角和是否為360度,為360度則在多邊形內部。3 引射線法 從目標點出發引一條射線,看這...

pnpoly 判斷點是否在多邊形內部 c

遇到了乙個問題,如何判斷乙個點是否在乙個多邊形內部。主要有以下幾種方法 1 面積和判別法 判斷目標點與多邊形的每條邊組成的三角形面積和是否等於該多邊形,相等則在多邊形內部。2 夾角和判別法 判斷目標點與所有邊的夾角和是否為360度,為360度則在多邊形內部。3 引射線法 從目標點出發引一條射線,看這...