三角网格表示数据结构设计
问题:设计一个数据结构表示物体表面,要满足以下要求
- 导入obj数据结构可以描述出物体三维结构。
- 通过某一点可以找到与之相连的边和面。
- 通过某一边可以找到与之相连的点和面。
- 通过某一面可以找到它的边和点。
- 给定2点求出沿着边可到过的最短距离。
- 适用于非流行和流行面模型。
非流行:一条边被三个或以上面共享,比如服装的袖子。
流行:一条边被2个以下面共享。
代码库
数据结构设计
/*
* 存储点坐标
* 邻接表法存储邻接点
*
*/
class Point {
public:
double Data[3];
vector<int> links; // 相连的点
vector<int> edges; // 边索引
vector<int> faces; // 面索引
};
// 纹理信息
class TexCoord {
public:
double Data[2];
};
/* 边定义,通过点索引表示
* 加入连接面的索引,方面查询
*
*/
class Edge {
public:
int p[2]; // 端点
vector<int> faces; // 相连面的编号
Edge(){}
};
/*
* 一个面,由多多个顶点表示的凸多边形, 逆时针表示
* 如果想表示一个凹多边形,可以把凹多边形拆成多个凸多边形表示
* 加入点和边,可以快速找到相关的点和边,再通过边可以找到相连的面
* 后续可扩展纹理坐标等信息
*/
class Face {
public:
GLdouble points[3]; // 点编号
int texcoord[3]; // 纹理坐标
int edges[3]; // 相关的边
Face(){};
};
class ObjectModel {
public:
ObjectModel(const char * objFileName);
void setTextureFromBmp(const char *texFileName); //从obj文件创建纹理
void objDraw();
void addFace(Face face);
int addEdge(int p1,int p2);
double distance(int p1, int p2);
vector<Point> points; // 点集
vector<Edge> edges;
vector<Face> faces;
vector<TexCoord> texcoord; // 纹理信息
GLuint mTexture;
unordered_map<string, int> edgeMap;
int mapInd;
};
效果图
读入obj格式,输出图形
原图是个杰尼龟
输出结果
画出一个投影,对于渲染贴图部分不懂,搞不出来了。