簡體   English   中英

構造具有已知三角形面的凸包 object

[英]Constructing convex hull object with known triangular faces

TLDR:我需要構建一個 python object 用於快速內點測試,類似於 SciPy ConvexHullDelaunayTriangulation 問題是我提前知道必須構造點的三角剖分的順序:(6 個點,8 個三角形面,每個面都有特定的順序)。 實際上,我已經知道凸包應該是什么,但我需要一種可以與現有(和優化)庫一起使用的形式(例如 Scipy 空間)? 我怎樣才能做到這一點?

背景:我需要構建一個三角棱鏡(想象一個 Toblerone 條 - 2 個端面,6 個側面,全部為三角形)以進行一些內點測試。 由於我將有許多這樣的棱鏡彼此相鄰放置(在它們的側面相鄰,想象許多 Toblerone 條豎立在它們的末端並彼此相鄰),我需要小心確保空間中的任何區域都不會被兩個相鄰的棱鏡。 棱鏡的橫截面通常不均勻,因此相鄰棱鏡之間可能重疊,如下圖所示兩個相鄰棱鏡之間的近似平面:

 ____
|\  /|
| \/ |
| /\ | 
|/__\|

注意沿着面部構造的兩條不同的對角線——這就是問題所在。 一個棱鏡可能會使用 \ 對角線將面分成兩個三角形,而相鄰的棱鏡可能會使用 /。 為了確保相鄰棱鏡之間沒有重疊,我需要明確控制三角形的形成順序,以便它們始終使用相同的對角線。 我可以做到這一點:對於我需要構建的每個棱鏡,我提前知道應該以什么順序構建三角形面。 這是兩個相鄰棱鏡的圖示,它們之間有正確的共享對角線:相鄰棱鏡,共享對角線

我的問題是使用這些棱鏡進行快速內點測試。 以前,我使用的是這個答案中鏈接的方法: Delaunay(prism_points).find_simplex(test_points) >= 0 它很快,因為它使用了高度優化的庫代碼,但我無法控制三角剖分的構造,所以可能會有重疊。

如果我將外殼構造為顯式np.array對象(頂點、面),那么我可以使用自己的代碼進行測試(有許多可能的方法,我正在投射光線並測試與每個三角形面的交點)。 問題是這比前面提到的find_simplex()方法慢了大約 100 倍。 雖然我確信我可以更快地獲得代碼,但值得指出的是,這段代碼已經從 Cython 的另一個用例中得到了相當優化 - 我不確定我是否能在這里找到我需要的所有額外速度。 至於不可避免的“你真的需要速度問題”,請相信我的話。 這將 5 分鍾的工作變成了數小時。

我需要的是構建一個 object 我可以與外部優化庫一起使用,同時保留對三角形面的控制。 在我的代碼中添加額外的 Cython 當然是一種選擇,但是已經存在這樣高度優化的代碼,使用它會非常可取。

感謝任何可以提供幫助的人。

一半的解決方案......不是原始問題的精確解決方案,而是實現相同結果的不同方式。 任何三棱柱都可以精確地分成三個四面體(參見http://www.alecjacobson.com/weblog/?p=1888 )。 這是一個特殊情況,即任何多面體都可以通過將所有面連接到一個頂點來拆分為四面體,如果這些面還沒有包含它的話。

確切地知道我希望棱鏡的面三角形如何排列,我可以計算出三個四面體將再現相同的三角形配置(當然在原始棱鏡本身內添加了額外的面)。 然后,我依次圍繞這三個四面體(即,4 個點的 collections)中的每一個形成 Delaunay 三角剖分,並執行原始內點測試:如果它與任何一個匹配,那么我對整個棱鏡的結果都是肯定的。 關鍵是,通過一次只給 Delaunay 構造函數四個點,我確切地知道它將返回什么三角剖分,因為只有一種方法可以形成這樣的四面體(假設沒有幾何退化)。

這有點冗長,涉及的測試數量是我想要的 3 倍,但這是一個開始。 如果將來有人知道我怎樣才能做得更好,請告訴我。

暫無
暫無

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

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