三维CAD建模——基于半边数据结构的基本欧拉操作建模(elar, B_REP)
(欧拉操作 三维CAD建模课 三维CAD建模 高曙明老师 渲染框架 brep 带洞 带柄 B_REP brep elar 扫成 扫成操作)
今年选了高老师的三维CAD建模课,zju选了这课应该就知道最后要做一个程序作业——基于半边数据结构的基本欧拉操作实现建模。要求必须建带有洞的模型。
(欧拉操作 三维CAD建模课 三维CAD建模 高署明老师 渲染框架 brep 带洞 带柄 B_REP brep elar 扫成 扫成操作)
3.3 欧拉操作的选择(6维空间的5维超平面)
v e f h r s Operator
1 1 0 0 0 0 mev
0 1 1 0 0 0 mef
1 0 1 0 0 1 mvfs
0 -1 0 0 1 0 kemr
0 0 -1 1 1 0 kfmrh
mvsf:生成含有一个点的面,包括一个空环,并且构成一个新的体
mev:生成一个新的点e2,连接该点到已有点v1,构造一条新的边
mef:连接面f1上的两个点v1,v2,生成一条新边e,并产生一个新面
kemr:删除一条边e,生成该边某一邻面上的新的内环
kfmrh:删除与面f1相接触的一个面f2,生成面f1上的一个内环,并形成体上的一个通孔
主要就是实现这五个欧拉操作就可以了。
下面主要是记录下我在作业中半边数据结构以及基本欧拉操作的实现。
#ifndef __HALF_EDGE_STRUCTURE__
#define __HALF_EDGE_STRUCTURE__
#include <stdlib.h>
struct Solid;
struct Face;
struct Loop;
struct HalfEdge;
struct Vertex;
struct Edge;
struct Solid
{
int id;
Face *faces; // list of all faces to construct this solid
Edge *edges; // list of all edges to construct this solid->to build the frame
Solid *next;
Solid *pre;
int vnum;//the count of all vertexs
int fnum;//the count of all faces
int lnum;//the count of all loops
Solid() : id(0), faces(NULL), edges(NULL), next(NULL), pre(NULL), fnum(0), vnum(0), lnum(0){}
};
struct Face
{
int id;
Solid *solid; // the solid which the face belong to
Loop *out_lp; // out loop of the face--construct the face
Loop *inner_lp;//inner_lp of the face--inner loop
Face *next;
Face *pre;
int innum;//the count of inner loops
Face() : id(0), solid(NULL), out_lp(NULL), next(NULL), pre(NULL), inner_lp(NULL), innum(0){}
};
struct Loop
{
int id;
HalfEdge *halfedges; // list of all halfeges to construct this loop
Face *face; // the face that constructed by this loop
Loop *next;
Loop *pre;
Loop() : id(0), halfedges(NULL), face(NULL), next(NULL), pre(NULL){}
};
struct Edge
{
HalfEdge *half_l; //the edge's left halfedge
HalfEdge *half_r; //the edge's right halfedge
Edge *next;
Edge *pre;
Edge() : half_l(NULL), half_r(NULL), next(NULL), pre(NULL){}
};
struct HalfEdge
{
Edge *edge; //this halfedge belong to which edge
Vertex *sv; //the start vertex of this h