當前位置:首頁 » 操作系統 » 點在多邊形演算法

點在多邊形演算法

發布時間: 2022-02-26 21:28:52

1. java中怎麼設計一個演算法實現一個點是否在一個多邊形內

射線法判斷一個點是否在一個多邊形內

http://hi..com/xiaoheng199110/item/a63ae6fbfab88e1efe358237

2. 求隨意輸入N個點圍成一個邊不相交的多邊形的演算法。用TC實現。幫幫忙。。。

你試試看,沒有經過驗證

1 生成Delaunay三角網
2 對每一個頂點進行處理,去掉該點相連的邊
去除規則
a 每個頂點有且只要兩條邊
b 除最後一個頂點,在去除過程中不可出現一個三角形
有兩個頂點已經符合條件a

3. 如何判定一個點在多邊形的內部還是外部,用delphi怎麼編程

這個問題需要分情況考慮:
1.如果給定的多邊形是凸多邊形,則可以按照我之前回答另外一個相似問題的答案來進行判斷。這是傳送門:【網路軟體研發工程師面試題】給定一個凸四邊形,如何判斷一個點在這個凸四邊形內還是外?
2.如果給定的多邊形是凹多邊形,那麼就麻煩一點了。需要這樣:先在凹多邊形上添加一些邊,使得凹多邊形變成凸多邊形,然後再按照第一步的方法去判斷。示例圖如下:

對於凹多邊形ABCDEFGH,補邊BE和FH(圖中虛線所示),則可以構成三個凸多邊形:凸多邊形ABEFH,凸多邊形BCDE和凸多邊形FGH,然後判斷給定點與這三個凸多邊形的關系。
如果給定點在凸多邊形ABEFH內部,而在凸多邊形BCDE和凸多邊形FGH的外部,那麼就可以說明給定點在多邊形ABCDEFGH的內部了。
下面就分別說明如何判斷一個三角形是逆時針還是順時針,如何判斷一個多邊形的凹凸性,如何補邊,以及如何通過補邊構造凸多邊形。只要構造出所有的凸多邊形,就可以按照上述第二種情況判斷了。
判斷一個三角形的順時針還是逆時針
(學過3D渲染的同學應該知道,這個判斷很重要,涉及到3D空間中哪些三角形需要渲染,而哪些三角形不需要渲染)
可以利用矢量叉積來判斷一個給定的三角形是逆時針還是順時針。
假設給定三角形的三個頂點A(x1,y1),B(x2,y2),C(x3,y3),構造三角形兩邊的矢量分別是:
AB=(x2-x1,y2-y1), AC=(x3-x1,y3-y1)
則AB和AC的叉積為:
|x2-x1, y2-y1|
|x3-x1, y3-y1|
值為:r = (x2-x1)(y3-y1) - (y2-y1)(x3-x1)
然後利用右手法則進行判斷:
如果r>0,則三角形ABC是逆時針的
如果r<0,則三角形ABC是順時針的
這樣就可以判斷一個給定三角形是順時針還是逆時針了。
(如果這里你發現計算出r=0,那麼說明ABC三點共線,即給定點在多邊形的邊上,可以直接返回)
判斷一個多邊形的凹凸性。
利用上述判斷三角形是順時針還是逆時針的方法來輔助判斷一個多邊形的凹凸性。
對於一個給定的多邊形,按照逆時針方向遍歷該多邊形的所有頂點,並放入一個首尾相連的循環鏈表中。然後從這個循環鏈表中每次取出相鄰三個頂點,判斷這個三個頂點構成的三角形是順時針三角形還是逆時針三角形,如果是逆時針,則說明該三角形三個頂點中位於中間的頂點是凸點;如果是順時針,則說明位於中間的頂點是凹點。
例如:假設取出的三個頂點是A、B、C,如果三角形ABC是逆時針三角形,則說明頂點B(即位於中間的頂點)是凸點,否則是凹點。然後可以取出D點,通過三角形BCD判斷C點的凹凸性,同理D點,E點...最後也可以判斷出A點的凹凸性。(通過由最後一個頂點,A點,B點按順序構成的三角形來判斷A點的凹凸性)。如果該多邊形所有的頂點經過判斷都是凸點,則說明該多邊形是凸多邊形,否則就是凹多邊形。
對於上述示例用圖,多邊形ABCDEFGH中,點A,B,E,F,H是凸點,點C,D,G是凹點。由於並不是所有的頂點都是凸點,所以多邊形ABCDEFGH是凹多邊形。
補邊
利用上述對給定多邊形的每一個頂點的凹凸性的判斷來進行補邊操作。
補邊演算法:
1.從存儲多邊形頂點的循環鏈表中,找到一個凸點(一定存在這個凸點,即不可能所有頂點都是凹點)
2.從這個頂點開始往後遍歷頂點,當遇到的第一個凹點時標記緊鄰這個凹點的前一個凸點,因為這個凸點就是所需要補的邊的一個頂點,然後繼續往後遍歷,如果還是凹點,跳過繼續遍歷,直至找到第一個凸點,那麼這個凸點就是所需要補的邊的另一個頂點。這樣就找出了所需要補的邊的兩個頂點,就可以確定需要補的一條邊了。
3.從找到的凸點開始,重復上述第2步操作。直至回到最開始找到的凸點,則演算法結束。這樣就可以找到所有需要補的邊了。
可以發現,每一條補邊,起點和終點都是凸點,中間經過的頂點都是凹點。
上述示例用圖中,對於補邊BE,頂點B和E都是凸點,而它們中間的頂點C和D則都是凹點。對於補邊FH,頂點F和H都是凸點,而它們中間的頂點G則是凹點。
構造凸多邊形
利用上述補邊來構造凸多邊形。
演算法如下:
1.對於找到每一條補邊,起點和終點都知道,就可以從多邊形頂點的循環鏈表中取出這兩個頂點中間的所有的頂點,而這些頂點加上起點和終點就構成了一個外在凸多邊形(即不屬於原始多邊形的多邊形)。
示例中,外在凸多邊形有凸多邊形BCDE和凸多邊形FGH。
2.在原始多邊形頂點的循環鏈表中把所有的凹點都去除,只留下凸點。那麼這些凸點即構成了原始多邊形經補邊之後構造的大凸多邊形了。
示例中,去除所有凹點C,D,G,則剩下的頂點A,B,E,F,G構成了補邊之後的大凸多邊形ABEFH
經過上面的所有分析,就可以輕松判斷任意一個點是否在一個給定多邊形的內部了。

4. 判斷點與多邊形位置關系vc++/c

不知道你指的關系是什麼,下面就提供一個判斷點是否在多邊形內的演算法:

// 功能:判斷點是否在多邊形內
// 方法:求解通過該點的水平線與多邊形各邊的交點
// 結論:單邊交點為奇數,成立!

//參數:
// POINT p 指定的某個點
// LPPOINT ptPolygon 多邊形的各個頂點坐標(首末點可以不一致)
// int nCount 多邊形定點的個數
BOOL PtInPolygon (POINT p, LPPOINT ptPolygon, int nCount)
{
int nCross = 0;

for (int i = 0; i < nCount; i++)
{
POINT p1 = ptPolygon[i];
POINT p2 = ptPolygon[(i + 1) % nCount];

// 求解 y=p.y 與 p1p2 的交點

if ( p1.y == p2.y ) // p1p2 與 y=p0.y平行
continue;

if ( p.y < min(p1.y, p2.y) ) // 交點在p1p2延長線上
continue;
if ( p.y >= max(p1.y, p2.y) ) // 交點在p1p2延長線上
continue;

// 求交點的 X 坐標 --------------------------------------------------------------
double x = (double)(p.y - p1.y) * (double)(p2.x - p1.x) / (double)(p2.y - p1.y) + p1.x;

if ( x > p.x )
nCross++; // 只統計單邊交點
}

// 單邊交點為偶數,點在多邊形之外 ---
return (nCross % 2 == 1);
}

以上代碼放心用吧,本人已經用它十多年了。

另:=======================================
LPPONT 就是POINT*,即POINT數組,裡面存放多邊形的頂點坐標。
函數原型也可以寫做:
BOOL PtInPolygon (POINT p, POINT* ptPolygon, int nCount);

例如:
//十個頂點的多邊形
POINT* points = new POINT[10];
points[0].x = ...;
points[0].y = ...;
points[1].x = ...;
points[1].y = ...;
//...

//測試用點
POINT ptTest;
ptTest.x = ...;
ptTest.y = ...;

//判斷ptTest是否在多邊形points內
if(PtInPolygon(ptTest, points, 10))
{
//...
}
else
{
//...
}

delete points;//釋放內存

以上演算法已經是最經典、最簡單的了,完全可靠的,我都用了十多年了,很多系統軟體中都用的是它。

5. 如何判斷一個點是否在一個多邊形中

就如同走路一般地劃線,從數組的第一個點連到第五個點,多邊行就構造出來了.
在圖形編程中,坐標的利用是不可忽視的.在這里判斷一個點是否在多邊行內部(可以包括線上)就要利用到各個點的坐標關系.下面開始討論具體的方法.
對任何事物的分析,我們應該遵守由簡入繁的原則,這樣才能提高條理性,少犯錯誤.我們先判斷一個點是否在一個三角形內部.一個三角形在一個坐標系(譬如由A、B、C三點組成)中,我們可以通過計算它的有向面積來判斷A、B、C三點在坐標系中的順逆.當然,在此之前我們必須先訂立一套計算面積的規則.比如,在笛卡爾坐標系中,我們利用:
S=((A.x-B.x)*(A.y+B.y)+(B.x-C.x)*(B.y+C.y)+(C.x-A.x)*(C.y+B.y))/2
----------------------------------
對於凸多邊形而言(以三角形ABC為例),假設存在一個點D,若這個點在三角形的內部,則以該點為起點,和原多邊形的任意兩個連續的且尊照多邊形組成方向
的點(如DAB、DBC、DCA)組成的三角形講都是一個方向,如DAB和DBC都是順時針方向.若這個點在三角形的外部,則會出現DAB、DBC、DCA三個三角形方向不一致的情形,即其中有一個不同於另外兩個(如一個順,兩個逆).到這里我們就知道了如何判斷一個點在一個三角形內部的演算法,總結一下就是通過判斷該點同三角形連續兩點組成三角形的順逆性(歸於面積的正負)來得到結果的.
實際上,對於其他的凸多邊性也可以用一樣的方法,只是這個時候判斷的三角形的數目增加了,不管怎麼樣,只要點在多邊形內部他們的順逆都是一樣的.對於凹多邊形而言,情況就要相對復雜一些了.此時,判斷一個點是否在其內部的計算量會增加比較多.具體演算法如下:此時三角形一個個的判斷可能會失效,我們應當兩個同時判斷.即判斷該點是否同時在多邊形的連續兩個三角形之中,相當於是求兩個三角形的交集,直到完成多邊形封閉.例如,判斷P點是否在多邊形ABCD之中,依次判斷P是否在ABC-BCD、BCD-CDA、CDA-DAB、DAB-ABC各個成對三角形中,P在ABC-BCD中表示P在ABC-BCD的交集之中.這樣就可以判斷一個點是否在一個凹多邊形內部了.
以上說的僅僅是簡單多邊形而已,在復雜多變形之中(如內洞、飛地等),還要通過多邊形的拓撲運算來得到結果.另外,在凸邊形中,還可以進行優化:可以以一個點為中心,分裂多邊形為最少個數的三角形,從而得到改進.

6. 求多邊形內一點的演算法

隨便一點么?
這還不簡單...
你隨便找兩個不相鄰的頂點,比如a1和a3
然後a1a3上面的任意一點都在多邊形內啊
為了方便你可意取中點。
比如((x3-x1)/2,(y3-y1)/2)這一點不是一定在多邊形內么
______________________________________________________
是凸多邊形的話可以寫凸包.
如果你懶得寫凸包
可以直接連接a1a2的中點m1和a1a3的中點m2,然後m1m2的中點是一定在多邊形內的。

7. C++ 中檢測某點是否在某個多邊形內的演算法

用圖形學方法 奇偶規則
從任意位置P到對象坐標范圍以外的遠點畫一條概念上的射線,並統計沿該射線與各邊交點的個數。根據奇偶性判斷P在內還是外

8. 急求大神詳細解釋一下代碼!!!——vb判斷點在多邊形內

別等解釋了,先去惡補一下判斷點在多邊形內的演算法吧。如轉角法、射線法、改進的弧長法等。看這個語句屬於什麼演算法,或者你結合這個程序的其他語句來解釋下就很容易明了,無非就是幾個循環與判斷。

9. 如何判定一個點是否在多邊形的內部及演算法

假設多邊形的坐標存放在一個數組里,首先我們需要取得該數組在橫坐標和縱坐標的最大值和最小值,根據這四個點算出一個四邊型,首先判斷目標坐標點是否在這個四邊型之內,如果在這個四邊型之外,那可以跳過後面較為復雜的計算,直接返回false。

if (p.x < minX || p.x > maxX || p.y < minY || p.y > maxY) {
// 這個測試都過不了。。。直接返回false;

接下來是核心演算法部分:

int pnpoly (int nvert, float *vertx, float *verty, float testx, float testy) {int i, j, c = 0;for (i = 0, j = nvert-1; i < nvert; j = i++) {if ( ( (verty[i]>testy) != (verty[j]>testy) ) &&
(testx < (vertx[j]-vertx[i]) * (testy-verty[i]) / (verty[j]-verty[i]) + vertx[i]) )c = !c; }return c;}

首先,參數nvert 代表多邊形有幾個點。浮點數testx, testy代表待測試點的橫坐標和縱坐標,*vertx,*verty分別指向儲存多邊形橫縱坐標數組的首地址。

我們注意到,每次計算都涉及到相鄰的兩個點和待測試點,然後考慮兩個問題:

  1. 被測試點的縱坐標testy是否在本次循環所測試的兩個相鄰點縱坐標范圍之內?即verty[i]<testy < verty[j]
    或者verty[j] <testy < verty[i]

2. 待測點test是否在i,j兩點之間的連線之下?看不懂後半短if statement的朋友請自行在紙上寫下i,j兩點間的斜率公式,要用到一點初中解析幾何和不等式的知識范疇,對廣大碼農來說小菜一碟。

10. 幾何題,多邊形演算法

左邊的圖形,條件不足 ,無法確定紅線上方直角三角形內銳角的度數,因而無法計算紅色線處的長度,若銳角為45º,則非常簡單,如圖,點擊放大:

熱點內容
如何在釘釘上換密碼 發布:2024-09-22 08:32:51 瀏覽:541
網路ip配置失敗怎麼辦小米手機 發布:2024-09-22 08:24:23 瀏覽:552
qq郵箱上傳不了 發布:2024-09-22 07:54:56 瀏覽:864
python字元轉ascii 發布:2024-09-22 07:54:51 瀏覽:643
idanmu解壓碼 發布:2024-09-22 07:48:26 瀏覽:986
四節課編程 發布:2024-09-22 07:19:11 瀏覽:298
安卓java模擬器apk 發布:2024-09-22 07:02:04 瀏覽:422
奈曼的扶貧密碼是多少 發布:2024-09-22 07:01:13 瀏覽:823
編程工資高 發布:2024-09-22 06:39:56 瀏覽:491
小票商品編程 發布:2024-09-22 06:39:12 瀏覽:373