[英]A point is inside or outside a graph (vertices and edges)?
我有一個由邊{E}
和頂點{V}
組成的圖G
{V}
中的頂點以2-D坐標表示。 圖形是平面的,這意味着沒有兩條邊相交。
圖G
具有一定的循環,比方說,一個點是在圖表上,如果它落入的環路的一個G
。 循環示例可以是A---B---C---A
,其中A
, B
和C
是頂點, ---
是邊。
現在給出一個點(x, y)
,我如何確定它是在圖形內部還是外部 ? 最簡單的方法或最簡單的方法是什么?
我正在使用Python,如果這有幫助的話。
更新:是的,所有邊都是直線。
@Peter de Rivaz提供了一個基本的見解,盡管沒有證據:如果它位於由圖的外頂點形成的船體內部,則該點位於環內。 我們可以通過證明:
第一個很容易證明:船體內的任何一點都在一個環路內,因為船體本身就是一個環路。
第二個可以通過reductio ad absurdum來證明。 非常非正式地,對於船體外部的一個點在一個環內,需要在船體外面至少有一個頂點,並且它要在環內形成一個至少有兩個其他頂點的環,這樣點就是在同一個循環里面。 但是,循環外不能有任何頂點,因為根據定義,所有頂點都在其中。 因此,通過減少荒謬 ,船體外部沒有任何環路內的點。
既然我們確信我們有正確的方法來測試我們想要的東西,我們仍然需要一種算法來判斷一個點是否在船體內部。 這可以通過光線投射算法的簡單擴展來實現 。
基本上,我們從所有頂點的列表開始,按垂直坐標排序。 然后,對於每對連續的頂點,我們“創建”它們之間的水平線,並檢查線相交的第一個和最后一個邊 。 這兩條邊是船體的一部分。 如果測試點位於這兩個邊緣中的任何一個之間,則它將位於船體內部。
這是前3次迭代的圖形表示:
由於圖形是平面的,您可以通過跟蹤每個連接的頂點集的輪廓然后測試以查看您的點是否位於這些多邊形中的任何一個來完成此操作。
這張照片說明了這個想法:
紅線是表示左手連接組件輪廓的多邊形,而綠線是表示右手組件輪廓的多邊形。
當且僅當它在一個輪廓內時,你的觀點將在一個循環中。
首先,我會在圖表中找到設置周期(循環)。 為此,請參閱此SO問題查找無向圖中的所有循環
然后計算一組最大循環,即那些未包含在另一個循環中的循環(也許你可以同時執行前兩個步驟)。
一旦有了最大周期,就可以檢測多邊形內的一個點。 存在各種方法,例如 - 繪制線和邊緣交叉的數量 - 從點(0° - >外部,360° - >內部)到多邊形頂點的角度之和。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.