实体表示数据结构设计

我的公众号

三角网格表示数据结构设计
问题:设计一个数据结构表示物体表面,要满足以下要求

  1. 导入obj数据结构可以描述出物体三维结构。
  2. 通过某一点可以找到与之相连的边和面。
  3. 通过某一边可以找到与之相连的点和面。
  4. 通过某一面可以找到它的边和点。
  5. 给定2点求出沿着边可到过的最短距离。
  6. 适用于非流行和流行面模型。

非流行:一条边被三个或以上面共享,比如服装的袖子。
流行:一条边被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格式,输出图形
原图是个杰尼龟

输出结果

画出一个投影,对于渲染贴图部分不懂,搞不出来了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值