曲线(曲面上的曲线)等弧长均匀离散化库函数说明
曲线(曲面上的曲线)等弧长均匀离散化
曲线等弧长均匀离散化是几何开发和工程应用中很重要的基础操作,在以下这些场景中会用到:
1.生成四边网格之前需要先把曲面的边界线等弧长均匀离散化;
2.创建两张曲面的高阶连续桥接曲面,需要先把每张曲面的边界线 等弧长均匀离散化,再重构曲线,设定几何约束,计算桥接面;
3.分析曲面和曲面在相交线上是否G0, G1, G2, Gn连续, 需要先把交线等 弧长均匀离散化,再算出几何连续的数值信息,给出报告;
4.刀具加工轨迹线,需要按照刀具的固定移动步长对轨迹线 等 弧长均匀离散化。
5.用数值方法构造 NURBS 曲面补充孔洞,需要先把边界线(曲面edge) 等 弧长均匀离散化,给出所有点上的几何信息(法线,曲率),再利用这些信息构造方程优化计算。
6. 等几何分析 前处理中针对NURBS曲面细分出大小均匀的等几何单元。
还有更多应用场景,欢迎亲们在留言区补充。
通常,这些曲线有以下表示方式:空间曲线, 曲面上的曲线,曲面的边界线, 曲面和曲面之间交线等等, 它们基本分为两类:显示表达和隐式表达, 针对两种类型,都需要做 等 弧长均匀离散化。为了应用于光学产品加工,ResurfLib的 等 弧长均匀离散化库函数做到了纳米级别的精度。
库函数API说明:
DiscreteCurveByGap
定义等距距离的值,离散一段曲线,返回离散点的坐标值。
接口定义
DECLDIR bool DiscreteCurveByGap(double* cpx, double* cpy, double* cpz, double* weight,
int ctrlp_num, int is_rational, int degree, double* knot, double gaptol,
double**px, double** py, double** pz, int* point_num);
接口参数
输入数据:
曲线的数据:
double* cpx : 存储曲线控制顶点的 x 坐标 , 长度为 ctrlp_num;
double* cpy: 存储曲线控制顶点的 y坐标 , 长度为 ctrlp_num;
double* cpz: 存储曲线控制顶点的 z坐标 , 长度为 ctrlp_num;
double* weight: 存储曲线控制顶点的权值 , 长度为 ctrlp_num; 如果该曲线为非有理 B 样条曲线,则 weight 可以为空;
int ctrlp_num:曲线控制点的数目;
int is_rational: 1--曲线是有理B样条;0---曲线是多项式B样条;
int degree:曲线的次数;
double* knot: 曲线的节点向量, 长度为 ctrlp_num+degree+1;
double gaptol: 离散之后点和点之间的最大距离值,可以设为0.001;
输出数据:
double** px: 离散点集的x坐标;
double** py: 离散点集的y坐标;
double** pz: 离散点集的y坐标;
int* point_num: 离散点的数目;
返回值
bool : true 成功; false: 失败
DiscreteCurveByGapT
定义等距距离的值,离散一段曲线,返回离散点的坐标和参数值。
接口定义
DECLDIR bool DiscreteCurveByGapT(double* cpx, double* cpy, double* cpz, double* weight, int ctrlp_num,
int is_rational, int degree, double* knot, double gaptol,
double**px, double** py, double** pz, double** pu, int* point_num);
接口参数
输入数据:
曲线的数据:
double* cpx : 存储曲线控制顶点的 x 坐标 , 长度为 ctrlp_num;
double* cpy: 存储曲线控制顶点的 y坐标 , 长度为 ctrlp_num;
double* cpz: 存储曲线控制顶点的 z坐标 , 长度为 ctrlp_num;
double* weight: 存储曲线控制顶点的权值 , 长度为 ctrlp_num; 如果该曲线为非有理 B 样条曲线,则 weight 可以为空;
int ctrlp_num:曲线控制点的数目;
int is_rational: 1--曲线是有理B样条;0---曲线是多项式B样条;
int degree:曲线的次数;
double* knot: 曲线的节点向量, 长度为 ctrlp_num+degree+1;
double gaptol: 离散之后点和点之间的最大距离值,可以设为0.001;
输出数据:
double** px: 离散点集的x坐标;
double** py: 离散点集的y坐标;
double** pz: 离散点集的y坐标;
double** pu: 离散点集的参数值;
int* point_num: 离散点的数目;
返回值
bool : true 成功; false: 失败
DisCreteCurveOnSurfaceByGap
定义等距距离的值,离散一段曲面边界曲线,返回离散点的坐标。
曲面边界曲线 (surface edge) 是指落在曲面上的曲线,这条曲线由一条曲面的 2D 参数空间上的二维曲线定义 。 如下图中的蓝色曲线。
接口定义
extern "C" __declspec(dllimport) bool DisCreteCurveOnSurfaceByGap(double* cpu,
double* cpv, double* curve_weight, int ctrlp_num, int is_curve_rational, int degree, double* knot,
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,
double gptol, double** px, double** py, double** pz, int* point_num);
接口参数
输入数据:
参数包含两个部分内容: 曲面边界曲线的数据和NURBS 曲面数据
曲面边界曲线的数据:
double* cpu :二维曲线控制顶点的 u 向坐标 , 长度为 ctrlp_num;
double* cpv: 二维曲线控制顶点的 v 向坐标 , 长度为 ctrlp_num;
double* curve_weight: 二维曲线控制顶点的权值 , 长度为 ctrlp_num; 如果该曲线为非有理 B 样条曲线,则 curve_weight 可以为空;
int ctrlp_num: 二维曲线控制顶点数目;
int is_curve_rational: 二维曲线是否有理:1:有理;0:多项式;
int ctrlp_num: 二维曲线的次数;
double* knot: 二维曲线的节点向量, 长度为 ctrlp_num+degree+1;
NURBS 曲面数据 :
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 u_num : 曲面在 U 方向的控制点数目;
int v_num: 曲面在 V 方向的控制点数目;
int is_surf_rational: 曲面是否为有理 NURBS 曲面。 0 代表非有理 B 样条曲面 ; 1 代表有理 NURBS 曲面;
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 gaptol: 离散之后点和点之间的最大距离值,可以设为0.001;
说明:在ResurfLib中,所有NURB曲面的控制顶点数据存储是按照v方向的顺序存储的。如下图所示,沿着v方向存储了下标为0到48的控制顶点。

输出数据:
double** px: 离散点集的x坐标;
double** py: 离散点集的y坐标;
double** pz: 离散点集的y坐标;
int* point_num: 离散点的数目;
返回值
bool : true 成功; false: 失败
DisCreteCurveOnSurfaceByGapUV
定义等距距离的值,离散一段曲面边界曲线,返回离散点的(x,y,z)坐标和(u,v)参数值。
曲面边界曲线 (surface edge) 是指落在曲面上的曲线,这条曲线由一条曲面的 2D 参数空间上的二维曲线定义 。 如下图中的蓝色曲线。

接口定义
extern "C" __declspec(dllimport) bool DisCreteCurveOnSurfaceByGapUV(double* cpu, double* cpv,
double* curve_weight, int ctrlp_num, int is_curve_rational, int degree, double* knot,
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, double gptol,
double** px, double** py, double** pz, double** pu, double** pv, int* point_num);
接口参数
输入数据:
参数包含两个部分内容: 曲面边界曲线的数据和NURBS 曲面数据
曲面边界曲线的数据:
double* cpu :二维曲线控制顶点的 u 向坐标 , 长度为 ctrlp_num;
double* cpv: 二维曲线控制顶点的 v 向坐标 , 长度为 ctrlp_num;
double* curve_weight: 二维曲线控制顶点的权值 , 长度为 ctrlp_num; 如果该曲线为非有理 B 样条曲线,则 curve_weight 可以为空;
int ctrlp_num: 二维曲线控制顶点数目;
int is_curve_rational: 二维曲线是否有理:1:有理;0:多项式;
int ctrlp_num: 二维曲线的次数;
double* knot: 二维曲线的节点向量, 长度为 ctrlp_num+degree+1;
NURBS 曲面数据 :
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 u_num : 曲面在 U 方向的控制点数目;
int v_num: 曲面在 V 方向的控制点数目;
int is_surf_rational: 曲面是否为有理 NURBS 曲面。 0 代表非有理 B 样条曲面 ; 1 代表有理 NURBS 曲面;
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 gaptol: 离散之后点和点之间的最大距离值,可以设为0.001;
输出数据:
double** px: 离散点集的x坐标;
double** py: 离散点集的y坐标;
double** pz: 离散点集的y坐标;
double** pu: 离散点集的参数u值;
double** pv: 离散点集的参数v值;
int* point_num: 离散点的数目;
返回值
bool : true 成功; false: 失败
返回顶部
联系我们
如果您有任何问题、建议或需要技术支持,请通过以下方式联系我们:
支持渠道
- 电子邮件: info@resurf3d.com
- 电话: +86 1381 5859 460
- 在线聊天: 访问我们的网站并点击右下角的聊天图标
- 社区论坛: www.resurf3d.com