NURBS曲线曲面数据结构定义
NURBS曲线曲面数据结构定义说明
NURBS曲线实体定义(用于构造裁剪曲面的裁剪线)
typedef struct RsNurbCurve{int degree; //曲线次数int n; //曲线控制点数目double* knot; //节点向量double* xcpt; //控制顶点的x坐标double* ycpt; //控制顶点的y坐标double* zcpt; //控制顶点的z坐标double* weight; //控制顶点的权值/* 曲线维度 */int dim;/** 1= 有理B样条. 0= 多项式B样条. */int isrational;double start; //定义域起点double end; //定义域终点} RsNurbCurve;
裁剪与非裁剪NURBS曲面实体定义:
typedef struct RsNurbSurface{int u_num; /* U方向的控制顶点数目 */int v_num; /* V方向的控制顶点数目 */int u_degree; /* U方向的曲面次数 */int v_degree; /* V方向的曲面次数 */double* u_knot; /*U方向的节点向量, 从 0 到 u_num + u_degree +1. */double* v_knot; /* V方向的节点向量. 从 0 到 v_num + v_degree +1 */double u_start; /* U方向定义域起始点 */double u_end; /* U方向定义域终点 */double v_start; /* V方向定义域起始点 */double v_end; /* V方向定义域终点 *//** 控制顶点的(x,y,z)坐标. 按照V方向从(0,0) 到 (u_num-1, v_num-1)*/double* xCpoint ;double* yCpoint ;double* zCpoint ;/** 控制顶点的权重值. 按照V方向从(0,0) 到 (u_num-1, v_num-1). */double* weight;int isrational; /* 0= 多项式B-样条. 1= 有理B样条. */int istrim; /* 0 == 非裁剪曲面; 1== 裁剪曲面 */RsNurbCurve *loopcurves; /* 裁剪曲面上的2d裁剪曲线, 该数组长度等于 curvenum*/RsNurbCurve *loop3dcurves; /* 裁剪曲面上的3d裁剪曲线, 该数组长度等于curvenum*/int curvenum; //曲线总数目int *loopindex; // 环上曲线id;如果该裁剪环在最外面,曲线顺序按照逆时针方向;如果在里面,曲线按照顺时针方向int *loopcurvenum; // 环上曲线数目int loopnum; // 裁剪环的数目int *isotags ; /* 判断裁剪曲线是否为等参数线. 数组长度 = curvenum; 3 : 该线为西边等参数线; 4: 该线为南面等参数线 ; 5: 该线为东面等参数线; 6: 该线为北面等参数线; 0: 该线不是等参数线. 7: 等参数线不在edge上; 此为可选项 */}RsNurbSurface;
如下图所示为非裁剪曲面
在ResurfLib中,所有NURB曲面的控制顶点数据存储是按照v方向的顺序存储的。如下图所示,沿着v方向存储了下标为0到48的控制顶点。

如下图所示为裁剪曲面,图中黑色部分是裁剪曲面,曲面上的裁剪曲线带有编号,对应的绿色部分为二维参数域上的裁剪曲线,它们的编号与三维裁剪曲线编号一致。二维矩形为曲面的参数域。