曲线(曲面上的曲线)等弧长均匀离散化

曲线等弧长均匀离散化是几何开发和工程应用中很重要的基础操作,在以下这些场景中会用到:

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的控制顶点。

nurbs

输出数据:

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: 失败

 

 

 

 

返回顶部

联系我们

如果您有任何问题、建议或需要技术支持,请通过以下方式联系我们:

支持渠道

返回顶部