NURBS曲面填充孔洞功能模块简介

该功能封装在库函数名为ResurfNurbs的包中。针对某些几何存在孔洞或残缺的现象,ResurfNurbs库函数提供了用NURBS曲面补充孔洞残缺的功能。NURBS曲面填充孔洞之后,在孔洞边界线处达到G1连续。ResurfNurbs库函数提供了G0/G1连续的数值报告。

如下图1是一个存在孔洞的几何模型:

图1

(图1)

图2拾取蓝色的孔洞边界线作为生成NURBS曲面的输入参数 :

图2

(图2)

图3生成了一张 裁剪NRUBS曲面填充孔洞:

图3

(图3)

图4是孔洞NURBS与相邻的NURBS曲面在公共边界线上的G1连续性偏差报告

图4

(图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 曲线是指不在曲面上的空间曲线。

输入参数说明

图5. 绿色为3D 曲线

(图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 曲面数据

曲面边界曲线的数据 :

图6. 蓝色为曲面曲线(surface edge)

(图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:

图7. 蓝色曲线内为用裁剪曲面填充孔洞

(图7. 蓝色曲线内为用裁剪曲面填充孔洞)

 

图8. 蓝色曲线内为用非裁剪曲面填充孔洞

(图8. 蓝色曲线内为用非裁剪曲面填充孔洞)

 

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 曲面的数据。

输出参数说明

 

 

 

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 曲线数据。

输出参数

曲面边界曲线的数据 :

 

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 曲线数据。

输出参数

曲面边界曲线的数据 :

 

extern "C" __declspec(dllimport) void RsFillHoleByNurbs_End();

功能:结束曲面生成。

 

extern "C" __declspec(dllimport) void RsFillHoleByNurbs_Clear();

功能:清除所有数据,重置。

 

extern "C" __declspec(dllimport) bool RsFillHoleByNurbs_GetStatus();

功能:查看是否成功生成曲面。

返回值:

 

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连续角度偏差值。

输出参数:

图9

(图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连续角度偏差值。

输出参数:

 

 

extern "C" __declspec(dllimport) void RsFillHoleByNurbs_GetMaxG0ReportData(double** point_x, double** point_y, double** point_z, double** deviation, int* point_num);

功能:在成功生成曲面的状态下报告每段边界线上的最大G0连续距离偏差. 曲面的每条边界线,不管是曲面曲线,还是3D曲线,存在G0连续距离偏差值。

输出参数:

 

图10

(图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连续距离偏差值。

输出参数:

返回顶部