2015-04-22 58 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); 
} 

最后,你将有一组独特的点和参考三角形对象的列表,有效地在“指针”,以这些点独特的设置。

相关问题