2015-04-22 59 views
0

我們想從已經存在的STL模式的列表(它是一個三維幾何模型,由三角形組成)創建我們自己的三角形列表,幾個三角形可以有同樣的一點,我們想用最好的解決方案:什麼是最好的方法:實例化一個對象或使用指針

S1)通過列表,使用這個列表的每個三角形(元素)的座標來創建一個三角形對象,我們把它放在我們的列表中(勝利者)。但是這裏有多個點必須多次創建,因爲正如我所說的,許多三角形可以有相同的點。

S2)已經存在另一個包含所有點的列表,然後它通過已經存在的三角形列表,並且對於每個三角形點我們在點列表中搜索它(所以我們必須使用排序和搜索算法)使用指針(指向這些點)並創建包含3個指針(* p1,* p2,* p3)的對象並將它們放入我們的列表中。

+0

除非您內存不足(或使用太多),否則存儲簡單的結構並避免使用指針。另一方面,幾何算法可以利用瞭解屬於多個三角形的點。 –

+1

這個問題我不清楚。一個例子會有很大的幫助。 – Nawaz

+0

謝謝先生@DieterLücking – HamidMly

回答

1

將點存儲在std::unordered_set中,然後將三角形存儲爲包含3個std::unordered_set::const_iterator的結構列表。

將點插入到集合中將近似爲常量時間,並且插入返回一個包含可找到點的迭代器的對。

查看here瞭解插入方式的更多詳細信息。

下面的代碼的基本結構(未經測試)

struct Point 
{ 
    float x; 
    float y; 
    float z; 
}; 

typedef std::unordered_set<Point, int, hashFunc, equalsFunc> pset; 

// Note, see http://stackoverflow.com/questions/16792751/hashmap-for-2d3d-coordinates-i-e-vector-of-doubles for more details on how to store complex structures in unordered_sets 

struct RefTriangle 
{ 
    pset::const_iterator p[3]; 
}; 

pset allPoints; 
std::list<RefTriangle> refTriangles 

for (const Triangle& t : triangleList) 
{ 
    RefTriangle rt; 
    rt.p[0] = allPoints.insert(t.p1).first; 
    rt.p[1] = allPoints.insert(t.p2).first; 
    rt.p[2] = allPoints.insert(t.p3).first; 
    refTriangles.push_back(rt); 
} 

最後,你將有一組獨特的點和參考三角形對象的列表,有效地在「指針」,以這些點獨特的設置。

相關問題