spline_curve

样条曲线(spline curves)

所谓样条曲线(Spline Curves)是指给定一组控制点而得到一条曲线,曲线的大致形状由这些点予以控制,一般可分为插值样条和逼近样条两种,插值样条通常用于数字化绘图或动画的设计,逼近样条一般用来构造物体的表面。工程中,很多实际应用场景都需要制作平滑的面、线。这些面、线都是被相应的条件约束。把这些需求和约束抽象为数理模型就是样板曲线。
样条曲线是经过一系列给定点的光滑曲线。最初,样条曲线都是借助于物理样条得到的,放样员把富有弹性的细木条(或有机玻璃条),用压铁固定在曲线应该通过的给定型值点处,样条做自然弯曲所绘制出来的曲线就是样条曲线。样条曲线不仅通过各有序型值点,并且在各型值点处的一阶和二阶导数连续,也即该曲线具有连续的、曲率变化均匀的特点。

样条曲线(spline curves)的种类

常用的样条有许多种,由它们的特征命名。以下列出其中几种:

  • [01] 按表达方式命名,如:非均匀有理 B 样条曲线(NURBS),又称为B样条(B-spline)。整个样条曲线是有每个基曲线的线性组合。每个曲线段的多项式由伯恩施坦多项式(Bernstein polynomial)表达。
  • [02] 按节点的特征命名,如:均匀样条。每个曲线段的长度相等且C(n − 1)连续。 若对每段曲线段的长度没有要求则称为非均匀样条。
  • [03] 用特殊条件限定命名,如:自然样条、差值样条。若要求在a与b二次导数为零则称为自然样条(natural splines)。若要求样条曲线穿过实际数据点则称为插值样条(interpolating splines)

样条曲线(spline curves)的特点

  • [01] 样条曲线(spline curvers)是由一组逼近控制多边形的光滑参数曲线段构成,这些曲线段就是样条曲线段。控制多边形也叫特征多边形,其顶点即使控制点,只有在特殊情况下(次数为0、阶数为1),样条曲线才能通过控制点。
  • [02] 样条曲线的次数,是由样条曲线数学定义中所取的基函数所决定的。从绘图的角度,可表述为样条曲线的次数等于绘制曲线段(组成样条曲线的各个小线段)用到折线(控制点相连的线段)的段数。最长用的是二次和三次。通过上述,以推理得到,样条曲线的次数+1等于控制点数(该组控制点决定曲线段的绘制)。
  • [03] 阶数与次数有关,样条曲线的阶是其次数加一。阶数越高,控制点越多,阶数等于控制点数(此处的控制点为决定曲线段的控制点数目,不是整个样条曲线的、总的控制点数目)。二次样条的阶数是三,样条曲线段由三个控制点决定;三次样条的阶数是四,样条曲线段与四个控制点决定。
  • [04] 权值可控制样条曲线段在控制多边形范围内做局部调整,反映了曲线靠近控制多边形的程度,权值越大,曲线段越靠近控制多边形。反之,则远离。对于NURBS曲线,当权值为1时,退化为非有理B样条曲线,可见非有理B样条曲线是NURBS的一个子集。而且样条曲线的阶数等于控制点总数时,非均匀有理B样条曲线就转换成了贝塞尔曲线。
  • [05] 允差是指样条曲线通过型值点的精确程度,允差越小,样条曲线与型值点越接近,允差为零,样条曲线将通过型值点

样条曲线的基础概念

  1. 基函数:曲线段的描述函数。基函数不同,样条曲线种类不同。
  2. 次数:基函数的幂指数。
  3. 阶数:次数+1,决定一段曲线段的控制点数。
  4. 控制点:约束样条曲线的边界条件。
  5. 权值:靠近边界条件的阈值。
  6. 允差:满足限定条件的阈值。
  7. 形值点:约束样条曲线走向的限定条件。
  8. 节点:通过设定节点数n,将样条曲线分割成n-1个曲线段。
对于结构体UF_CURVE_spline_t The caller must allocate a UF_CURVE_spline_t structure. This routine will fill the structure in. The knots and poles members will be allocated by this routine, and must be freed by the caller using UF_free, e.g. UF_free(spline_data->knots); UF_free(spline_data->poles); 在这个前提下我改怎么实现bool NxCurve::smoothSpline(tag_t from_spline, double tol_dist, double tol_angel, tag_t* smoothed_spline) { UF_UNDO_mark_id_t mark_id; UF_CURVE_spline_t spline_data = {0}; // 初始化结构体 int iNum_states = 0; UF_CURVE_state_t* states = nullptr; int iNum_states2 = 0; UF_CURVE_state_t* states2 = nullptr; int iError = 0; *smoothed_spline = NULL_TAG; try { UF_UNDO_set_mark(UF_UNDO_visible, NULL, &mark_id); UF_CALL(UF_CURVE_ask_spline_data(from_spline, &spline_data)); // 平滑处理 UF_CALL(UF_CURVE_smooth_spline_data(&spline_data, spline_data.order - 2, tol_dist, tol_angel, &iNum_states, &states)); // 创建新样条 UF_CALL(UF_CURVE_create_spline(&spline_data, smoothed_spline, &iNum_states2, &states2)); // 资源清理 UF_free(spline_data.knots); UF_free(spline_data.poles); if (states) { UF_free(states->value); UF_free(states); } if (states2) { UF_free(states2->value); UF_free(states2); } return (*smoothed_spline) ? 1 : 0; } catch (...) { // 安全释放所有可能分配的资源 UF_free(spline_data.knots); UF_free(spline_data.poles); if (states) { UF_free(states->value); UF_free(states); } if (states2) { UF_free(states2->value); UF_free(states2); } UF_CALL(UF_UNDO_undo_to_mark(mark_id, NULL)); return 0; } }
04-04
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值