NURBS曲面填充孔洞功能模块简介及库函数API说明
NURBS曲面填充孔洞功能模块简介
该功能封装在库函数名为ResurfNurbs的包中。针对某些几何存在孔洞或残缺的现象,ResurfNurbs库函数提供了用NURBS曲面补充孔洞残缺的功能。NURBS曲面填充孔洞之后,在孔洞边界线处达到G1连续。ResurfNurbs库函数提供了G0/G1连续的数值报告。
如下图1是一个存在孔洞的几何模型:
(图1)
图2拾取蓝色的孔洞边界线作为生成NURBS曲面的输入参数 :
(图2)
图3生成了一张 裁剪NRUBS曲面填充孔洞:
(图3)
图4是孔洞NURBS与相邻的NURBS曲面在公共边界线上的G1连续性偏差报告
(图4)
ResurfNurbs库函数既可以生成裁剪曲面填充孔洞,又可以生成非裁剪的四边曲面填充孔洞。具体用那种类型的曲面填充孔洞,用户可以根据孔洞边界的形态做出选择。
API 调用的过程
调用 API 必须按照以下形式严格执行:
Step 1: 初始化 。调用 RsFillHoleByNurbs_Start() 初始化;
Step 2: 输入边界线 。调用 RsFillHoleByNurbs_AppendBoundaryCurve() 增加一条 3D 曲线或者调用 RsFillHoleByNurbs_AppendSurfaceEdge() 增加一条曲面边界线。 这些边界线必须围成一个闭环,它们的端点与端点之间的首尾相接距离不要太大。
Step 3: 参数设置 。调用 RsFillHoleByNurbs_SetSmoothFactor() 设置曲面光滑度。
Step 4: 参数设置 。调用 RsFillHoleByNurbs_SetDrapSurfaceType() 设置曲面的形态类型 ;
Step 5: 生成曲面 。调用 RsFillHoleByNurbs_DoFill() 执行曲面生成;
Step 6: 获取生成的曲面数据 。调用 RsFillHoleByNurbs_GetNurbs() 获取生成的一张 NURBS 曲面;
Step 7: 如果生成的是裁剪曲面,获取裁剪边界曲线的数据 。调用 RsFillHoleByNurbs_Get2DTrimmingCurveCount() 获取裁剪环上边界曲线的数目;调用 RsFillHoleByNurbs_Get2DTrimmingCurve() 获取第 i 条 2D 裁剪边界线的数据;调用 RsFillHoleByNurbs_Get3DTrimmingCurve() 获取第 i 条 3D 裁剪边界线的数据;
Step 8: 获取新曲面边界线上的连续性报告。调用 RsFillHoleByNurbs_GetMaxG1ReportData(double** point_x, double** point_y, double** point_z, double** angles, int* point_num); RsFillHoleByNurbs_GetG1ReportData(double** point_x, double** point_y, double** point_z, double** angles, int* point_num); RsFillHoleByNurbs_GetMaxG0ReportData(double** point_x, double** point_y, double** point_z, double** deviation, int* point_num);RsFillHoleByNurbs_GetG0ReportData(double** point_x, double** point_y, double** point_z, double** deviation, int* point_num); 等函数查看边界线上的G0/G1连续性;
Step9 : 结束调用 。 RsFillHoleByNurbs_End() 。
API 参数说明
extern "C" __declspec(dllimport) void RsFillHoleByNurbs_Start();
功能:初始化功能。该接口为必须最先调用的函数。
参数:该接口没有参数。
extern "C" __declspec(dllimport) void RsFillHoleByNurbs_AppendBoundaryCurve(double* cpx, double* cpy, double* cpz, double* weight, int ctrlp_num, int is_rational, int degree, double* knot);
功能:增加一条 3D NURBS 曲线作为边界线。 3D NURBS 曲线是指不在曲面上的空间曲线。
输入参数说明:
- int ctrlp_num : 曲线的控制点数目;
- int is_rational: 该曲线是否为有理 NURBS 曲线。 0 代表非有理 B 样条曲线 ; 1 代表有理 NURBS 曲线;
- int degree :曲线的次数 ; 必须满足不等式 ctrlp_num>=(degree+1); 当 ctrlp_num==(degree+1) 时,该曲线为 Bezier 曲线;
- double* knot :曲线的节点向量。长度为 ctrlp_num+degree+1;
- double* cpx : 存储曲线控制顶点的 x 坐标 , 长度为 ctrlp_num;
- double* cpy: 存储曲线控制顶点的 y 坐标 , 长度为 ctrlp_num;
- double* cpz: 存储曲线控制顶点的 z 坐标 , 长度为 ctrlp_num;
- double* weight: 存储曲线控制顶点的权值 , 长度为 ctrlp_num; 如果该曲线为非有理 B 样条曲线,则 weight 可以为空;
(图5. 绿色为3D 曲线)
extern "C" __declspec(dllimport) void RsFillHoleByNurbs_AppendSurfaceEdge(double* cpu, double* cpv, double* curve_weight, int ctrlp_num, int is_curve_rational, int degree, double* knot,int iso_type, int continuity, int hasface, double* surf_cpx, double* surf_cpy, double* surf_cpz, double* surf_weight, int u_num, int v_num, int is_surf_rational, int u_degree, int v_degree, double* u_knot, double* v_knot);
功能:增加一条曲面边界曲线 (surface edge) 作为边界线。曲面边界曲线 (surface edge) 是指落在曲面上的曲线,这条曲线由一条曲面的 2D 参数空间上的二维曲线定义。
输入参数说明:
参数包含两个部分内容: NURBS 曲面数据和曲面边界曲线的数据。
NURBS 曲面数据:
- int u_num : 曲面在 U 方向的控制点数目;
- int v_num: 曲面在 V 方向的控制点数目;
- int u_degree: 曲面在 U 方向的次数;
- int v_degree: 曲面在 V 方向的次数;
- int is_surf_rational: 曲面是否为有理 NURBS 曲面。 0 代表非有理 B 样条曲面 ; 1 代表有理 NURBS 曲面;
- double* u_knot: 曲面在 U 方向的节点向量,长度为 u_num+u_degree+1
- double* v_knot: 曲面在 V 方向的节点向量,长度为 v_num+v_degree+1
- double* surf_cpx: 曲面控制点的 x 分量坐标,长度为 u_num*v_num ,沿 v 方向排列;
- double* surf_cpy: 曲面控制点的 y 分量坐标,长度为 u_num*v_num ,沿 v 方向排列;
- double* surf_cpz: 曲面控制点的 z 分量坐标,长度为 u_num*v_num ,沿 v 方向排列;
- double* surf_weight: 曲面控制点上的权值,长度为 u_num*v_num ,沿 v 方向排列;如果该曲面是非有理 B 样条曲面 , 该值可以为空 ;
曲面边界曲线的数据 :
- int ctrlp_num : 曲线的控制点数目;
- int is_curve_rational: 该曲线是否为有理 NURBS 曲线。 0 代表非有理 B 样条曲线 ; 1 代表有理 NURBS 曲线;
- int degree :曲线的次数 ; 必须满足不等式 ctrlp_num>=(degree+1); 当 ctrlp_num==(degree+1) 时,该曲线为 Bezier 曲线;
- double* knot :曲线的节点向量。长度为 ctrlp_num+degree+1;
- double* cpu : 存储曲线控制顶点的 u 向坐标 , 长度为 ctrlp_num;
- double* cpv: 存储曲线控制顶点的 v 向坐标 , 长度为 ctrlp_num;
- double* curve_weight: 存储曲线控制顶点的权值 , 长度为 ctrlp_num; 如果该曲线为非有理 B 样条曲线,则 curve_weight 可以为空;
- int iso_type: 该曲线是否为等参数线:
- -1 : 曲线是 3d 没有曲面信息;
- 0 :非等参线;.
- 1: x_iso;
- 2: y_iso;
- 3: west_iso; u=u向起始点
- 4: south_iso; v=v向起始点
- 5: east_iso; u=u向终止点
- 6: north_iso; v=v向终止点
- int continuity: 新曲面在该曲线上的连续性 , 0: G0; 1: G1
- int hasface: 该值总是为 1
(图6. 蓝色为曲面曲线(surface edge))
extern "C" __declspec(dllimport) void RsFillHoleByNurbs_SetSmoothFactor(double factor);
功能:控制新曲面的光滑性。
输入参数说明:
double factor : [0.0001,1.0] 之间取值,越大曲面越光滑;
extern "C" __declspec(dllimport) void void RsFillHoleByNurbs_SetDrapSurfaceType(int type);
功能:设置曲面的拉伸形态,根据拉伸形态值,设置曲面是否为裁剪曲面
输入参数说明:
int type:
- 0 --- 自动计算拉伸, 生成裁剪曲面
- 1 ---- 沿 x 轴方向拉伸,生成裁剪曲面
- 2 ---- 沿 y 轴方向拉伸,生成裁剪曲面
- 3 ---- 沿 z 轴方向拉伸,生成裁剪曲面
(图7. 蓝色曲线内为用裁剪曲面填充孔洞)
- 4 ---- 固定四条边界线拉伸,生成非裁剪曲面 . 程序自动计算 4 个角点。
(图8. 蓝色曲线内为用非裁剪曲面填充孔洞)
- 5 ---- 固定四条边界线拉伸,生成第一类孔斯 (coons) 非裁剪曲面 . 程序自动计算 4 个角点。
extern "C" __declspec(dllimport) void RsFillHoleByNurbs_DoFill();
功能:执行曲面生成。
extern "C" __declspec(dllimport) bool RsFillHoleByNurbs_GetNurbs(int* u_num, int* v_num, int* u_degree, int* v_degree, double** u_knot, double** v_knot, double** cpx, double** cpy, double** cpz);
功能:获取新 NURBS 曲面的数据。
输出参数说明:
- int *u_num : 曲面在 U 方向的控制点数目;
- int *v_num: 曲面在 V 方向的控制点数目;
- int *u_degree: 曲面在 U 方向的次数;
- int *v_degree: 曲面在 V 方向的次数;
- double** u_knot: 曲面在 U 方向的节点向量,长度为 u_num+u_degree+1 ;
- double** v_knot: 曲面在 V 方向的节点向量,长度为 v_num+v_degree+1 ;
- double** cpx: 曲面控制点的 x 分量坐标,长度为 u_num*v_num ,沿 v 方向排列;
- double** cpy: 曲面控制点的 y 分量坐标,长度为 u_num*v_num ,沿 v 方向排列;
- double** cpz: 曲面控制点的 z 分量坐标,长度为 u_num*v_num ,沿 v 方向排列;
extern "C" __declspec(dllimport) int RsFillHoleByNurbs_Get2DTrimmingCurveCount();
功能:返回新裁剪曲面由多少条边界线。如果新曲面是非裁剪曲面,这个数目就是 0. 如果是裁剪曲面,则这些边界曲线组成一个边界环。每根边界曲线可以取到参数域上 2D 曲线和物理曲面位置上的 3D 曲线 .
extern "C" __declspec(dllimport) void RsFillHoleByNurbs_Get2DTrimmingCurve(int index, int* ctrlp_num, int* degree, double** knot, double** cpu, double** cpv);
功能:给定 index ,取出边界环上的第 index 条 2D 曲线数据。
输出参数:
曲面边界曲线的数据 :
- int index: 曲线在边界环上的 id 号 ;
- int *ctrlp_num : 曲线的控制点数目 ;
- int *degree :曲线的次数 ;
- double** knot :曲线的节点向量。长度为 ctrlp_num+degree+1;
- double** cpu : 存储曲线控制顶点的 u 向坐标 , 长度为 ctrlp_num;
- double** cpv: 存储曲线控制顶点的 v 向坐标 , 长度为 ctrlp_num;
extern "C" __declspec(dllimport) void RsFillHoleByNurbs_Get3DTrimmingCurve(int index, int* ctrlp_num, int* degree, double** knot, double** cpx, double** cpy, double** cpz);
功能:给定 index ,取出边界环上的第 index 条 3D 曲线数据。
输出参数:
曲面边界曲线的数据 :
- int index: 曲线在边界环上的 id 号 ;
- int *ctrlp_num : 曲线的控制点数目 ;
- int *ctrlp_num : 曲线的控制点数目 ;
- int *degree :曲线的次数 ;
- double** knot :曲线的节点向量。长度为 ctrlp_num+degree+1;
- double** cpx : 存储曲线控制顶点的 x 分量坐标 , 长度为 ctrlp_num;
- double** cpy: 存储曲线控制顶点的 y 分量坐标 , 长度为 ctrlp_num;
- double** cpz: 存储曲线控制顶点的 z 分量坐标 , 长度为 ctrlp_num;
extern "C" __declspec(dllimport) void RsFillHoleByNurbs_End();
功能:结束曲面生成。
extern "C" __declspec(dllimport) void RsFillHoleByNurbs_Clear();
功能:清除所有数据,重置。
extern "C" __declspec(dllimport) bool RsFillHoleByNurbs_GetStatus();
功能:查看是否成功生成曲面。
返回值:
- true :成功生成了NURBS曲面;
- false :没有生成曲面;
extern "C" __declspec(dllimport) void RsFillHoleByNurbs_GetMaxG1ReportData(double** point_x, double** point_y, double** point_z, double** angles, int* point_num);
功能:在成功生成曲面的状态下报告每段边界线上的最大G1连续偏差角度。如果边界线是曲面曲线,则存在G1连续的角度偏差值;如果边界线是3D曲线,则不存在G1连续角度偏差值。
输出参数:
- double** point_x : 边界线上最大G1连续角度偏差值所在点的x坐标分量,该数组大小为 *point_num;
- double** point_y: 边界线上最大G1连续角度偏差值所在点的y坐标分量,该数组大小为 *point_num;
- double** point_z: 边界线上最大G1连续角度偏差值所在点的z坐标分量,该数组大小为 *point_num;
- double** deviation:边界线上最大G1连续角度偏差值所在点的G0连续偏差距离大小值.该数组大小为 *point_num;
- int* point_num:能度量G1连续的边界线的数目;
(图9)
extern "C" __declspec(dllimport) void RsFillHoleByNurbs_GetG1ReportData(double** point_x, double** point_y, double** point_z, double** angles, int* point_num);
功能:在成功生成曲面的状态下报告出曲面边界线上一批离散点的最大G1连续偏差角度。如果输入边界线是曲面曲线,则存在G1连续的角度偏差值;如果输入边界线是3D曲线,则不存在G1连续角度偏差值。
输出参数:
- double** point_x : 边界线上G1连续角度偏差值所在点的x坐标分量,该数组大小为 *point_num;
- double** point_y: 边界线上G1连续角度偏差值所在点的y坐标分量,该数组大小为 *point_num;
- double** point_z: 边界线上G1连续角度偏差值所在点的z坐标分量,该数组大小为 *point_num;
- double** deviation:边界线上G1连续角度偏差值所在点的G0连续偏差距离大小值.该数组大小为 *point_num;
- int* point_num: 边界线上离散点的个数;
extern "C" __declspec(dllimport) void RsFillHoleByNurbs_GetMaxG0ReportData(double** point_x, double** point_y, double** point_z, double** deviation, int* point_num);
功能:在成功生成曲面的状态下报告每段边界线上的最大G0连续距离偏差. 曲面的每条边界线,不管是曲面曲线,还是3D曲线,存在G0连续距离偏差值。
输出参数:
- double** point_x : 边界线上最大G0连续距离偏差值所在点的x坐标分量,该数组大小为 *point_num;
- double** point_y: 边界线上最大G0连续距离偏差值所在点的y坐标分量,该数组大小为 *point_num;
- double** point_z: 边界线上最大G0连续距离偏差值所在点的z坐标分量,该数组大小为 *point_num;
- double** deviation:边界线上最大G0连续距离偏差值所在点的G0连续偏差距离大小值.该数组大小为 *point_num;
- int* point_num: 能度量G0连续的边界线的数目;

(图10)
extern "C" __declspec(dllimport) void RsFillHoleByNurbs_GetG0ReportData(double** point_x, double** point_y, double** point_z, double** deviation, int* point_num);
功能:在成功生成曲面的状态下报告边界线上一批离散点的G0连续距离偏差. 曲面的每条边界线,不管是曲面曲线,还是3D曲线,存在G0连续距离偏差值。
输出参数:
- double** point_x : 边界线上G0连续距离偏差值所在点的x坐标分量,该数组大小为 *point_num;
- double** point_y: 边界线上G0连续距离偏差值所在点的y坐标分量,该数组大小为 *point_num;
- double** point_z: 边界线上G0连续距离偏差值所在点的z坐标分量,该数组大小为 *point_num;
- double** deviation: 边界线上G0连续距离偏差值所在点的G0连续偏差距离大小值.该数组大小为 *point_num;
- int* point_num: 该批离散点的个数;