NURBS曲线曲面数据结构定义说明

NURBS曲线实体定义(用于构造裁剪曲面的裁剪线)

  1. typedef struct RsNurbCurve
  2. {
  3. int degree; //曲线次数
  4. int n; //曲线控制点数目
  5. double* knot; //节点向量
  6. double* xcpt; //控制顶点的x坐标
  7. double* ycpt; //控制顶点的y坐标
  8. double* zcpt; //控制顶点的z坐标
  9. double* weight; //控制顶点的权值
  10. /* 曲线维度 */
  11. int dim;
  12. /** 1= 有理B样条. 0= 多项式B样条. */
  13. int isrational;
  14. double start; //定义域起点
  15. double end; //定义域终点
  16. } RsNurbCurve;

裁剪与非裁剪NURBS曲面实体定义:

  1. typedef struct RsNurbSurface
  2. {
  3. int u_num; /* U方向的控制顶点数目 */
  4. int v_num; /* V方向的控制顶点数目 */
  5. int u_degree; /* U方向的曲面次数 */
  6. int v_degree; /* V方向的曲面次数 */
  7. double* u_knot; /*U方向的节点向量, 从 0 到 u_num + u_degree +1. */
  8. double* v_knot; /* V方向的节点向量. 从 0 到 v_num + v_degree +1 */
  9. double u_start; /* U方向定义域起始点 */
  10. double u_end; /* U方向定义域终点 */
  11. double v_start; /* V方向定义域起始点 */
  12. double v_end; /* V方向定义域终点 */
  13. /** 控制顶点的(x,y,z)坐标. 按照V方向从(0,0) 到 (u_num-1, v_num-1)*/
  14. double* xCpoint ;
  15. double* yCpoint ;
  16. double* zCpoint ;
  17. /** 控制顶点的权重值. 按照V方向从(0,0) 到 (u_num-1, v_num-1). */
  18. double* weight;
  19. int isrational; /* 0= 多项式B-样条. 1= 有理B样条. */
  20. int istrim; /* 0 == 非裁剪曲面; 1== 裁剪曲面 */
  21. RsNurbCurve *loopcurves; /* 裁剪曲面上的2d裁剪曲线, 该数组长度等于 curvenum*/
  22. RsNurbCurve *loop3dcurves; /* 裁剪曲面上的3d裁剪曲线, 该数组长度等于curvenum*/
  23. int curvenum; //曲线总数目
  24. int *loopindex; // 环上曲线id;如果该裁剪环在最外面,曲线顺序按照逆时针方向;如果在里面,曲线按照顺时针方向
  25. int *loopcurvenum; // 环上曲线数目
  26. int loopnum; // 裁剪环的数目
  27. int *isotags ; /* 判断裁剪曲线是否为等参数线. 数组长度 = curvenum; 3 : 该线为西边等参数线; 4: 该线为南面等参数线 ; 5: 该线为东面等参数线; 6: 该线为北面等参数线; 0: 该线不是等参数线. 7: 等参数线不在edge上; 此为可选项 */
  28. }RsNurbSurface;

如下图所示为非裁剪曲面

在ResurfLib中,所有NURB曲面的控制顶点数据存储是按照v方向的顺序存储的。如下图所示,沿着v方向存储了下标为0到48的控制顶点。

nurbs

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

回顶部