网格有哪些数据结构
网格的数据结构其实就是一个图结构:点,边,面。可以是有向图,比如半边结构,也可以是无向图。在不同的软件或者开发包里,网格数据结构的实现都是有差异的。这种差异主要体现在网格连接关系的记录结构上,比如顶点是否记录邻域点,边,面信息,边是否记录邻域面信息等。记录的信息越多,查询的时候越方便,但是冗余的信息也越多,如果网格连接关系有变动,维护的信息也越多。另外,这些关系的建立也是需要开销的。所以,没有最好的数据结构,只有最适合当前算法的数据结构。
下面是一个例子:ITriMesh用于表达网格数据结构。网格算法都是基于ITriMesh接口来调用的,具体如下:
class ITriMesh
{ public: ITriMesh(){} virtual Int GetVertexCount(void) const = 0; virtual Int GetTriangleCount(void) const = 0; virtual Vector3 GetVertexCoord(Int vid) const = 0; virtual void SetVertexCoord(Int vid, const Vector3& coord) = 0; virtual Vector3 GetVertexNormal(Int vid) const = 0; virtual void SetVertexNormal(Int vid, const Vector3& normal) = 0; virtual void GetTriangleVertexIds(Int fid, Int vertexIds[3]) const = 0; virtual void SetTriangleVertexIds(Int fid, Int vertexId0, Int vertexId1, Int vertexId2) = 0; virtual Vector3 GetTriangleNormal(Int fid) const = 0; virtual void SetTriangleNormal(Int fid, const Vector3& normal) = 0; virtual Int InsertTriangle(Int vertexId0, Int vertexId1, Int vertexId2) = 0; virtual Int InsertVertex(const Vector3& coord)