簡體   English   中英

點是圖形內部還是外部(頂點和邊緣)?

[英]A point is inside or outside a graph (vertices and edges)?

我有一個由邊{E}和頂點{V}組成的圖G {V}中的頂點以2-D坐標表示。 圖形是平面的,這意味着沒有兩條邊相交。

G具有一定的循環,比方說,一個點是在圖表上,如果它落入的環路的一個G 循環示例可以是A---B---C---A ,其中ABC是頂點, ---是邊。

現在給出一個點(x, y) ,我如何確定它是在圖形內部還是外部 最簡單的方法或最簡單的方法是什么?

我正在使用Python,如果這有幫助的話。

更新:是的,所有邊都是直線。

@Peter de Rivaz提供了一個基本的見解,盡管沒有證據:如果它位於由圖的外頂點形成的船體內部,則該點位於環內。 我們可以通過證明:

  • 船體內的任何一點都在一個環路內
  • 船體外的任何點都不在任何環路內

第一個很容易證明:船體內的任何一點都在一個環路內,因為船體本身就是一個環路。

第二個可以通過reductio ad absurdum來證明。 非常非正式地,對於船體外部的一個點在一個環內,需要在船體外面至少有一個頂點,並且它要在環內形成一個至少有兩個其他頂點的環,這樣點就是在同一個循環里面。 但是,循環外不能有任何頂點,因為根據定義,所有頂點都在其中。 因此,通過減少荒謬 ,船體外部沒有任何環路內的點。

既然我們確信我們有正確的方法來測試我們想要的東西,我們仍然需要一種算法來判斷一個點是否在船體內部。 這可以通過光線投射算法的簡單擴展來實現

基本上,我們從所有頂點的列表開始,按垂直坐標排序。 然后,對於每對連續的頂點,我們“創建”它們之間的水平線,並檢查線相交的第一個和最后一個邊 這兩條邊是船體的一部分。 如果測試點位於這兩個邊緣中的任何一個之間,則它將位於船體內部。

這是前3次迭代的圖形表示:

迭代1迭代2迭代3

由於圖形是平面的,您可以通過跟蹤每個連接的頂點集的輪廓然后測試以查看您的點是否位於這些多邊形中的任何一個來完成此操作。

這張照片說明了這個想法:

在此輸入圖像描述

紅線是表示左手連接組件輪廓的多邊形,而綠線是表示右手組件輪廓的多邊形。

當且僅當它在一個輪廓內時,你的觀點將在一個循環中。

首先,我會在圖表中找到設置周期(循環)。 為此,請參閱此SO問題查找無向圖中的所有循環

然后計算一組最大循環,即那些未包含在另一個循環中的循環(也許你可以同時執行前兩個步驟)。

一旦有了最大周期,就可以檢測多邊形內的一個點。 存在各種方法,例如 - 繪制線和邊緣交叉的數量 - 從點(0° - >外部,360° - >內部)到多邊形頂點的角度之和。

請參閱如何確定2D點是否在多邊形內?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM