官方例程:
gen_nurbs_interp.hdev,非均匀有理B样条插值
create a NURBS curve that interpolates a list of points
* Create a NURBS curve that interpolates a list of points.
dev_close_window ()
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
Rows := [150,160,130,140,180]
Cols := [50,200,300,400,450]
gen_cross_contour_xld (Cross, Rows, Cols, 12, 0.785398)
gen_nurbs_interp (Rows, Cols, [0,-10,0,10], 3, CtrlRows, CtrlCols, Knots)
gen_contour_nurbs_xld (Contour, CtrlRows, CtrlCols, Knots, 'auto', 3, 1, 5)
dev_display (Contour)
dev_display (Cross)
use a polygon XLD contour as control polygon and approximate the NURBS curve as contour
* use a polygon XLD contour as control polygon and approximate
* the NURBS curve as contour
get_contour_xld(Polygon, Row, Col)
gen_contour_nurbs_xld(NURBSContour, Row, Col, 'auto', 'auto', 3, 1.0, 10.0)
approx_chain_simple(halcon新版本已弃用)
/* read edge image */
read_image(&Image,"fig1_kan");
/* construct edge region */
hysteresis_threshold(Image,&RK1,64,255,40,1);
connection(RK1,&Rand);
/* fetch chain code */
T_get_region_contour(Rand,&Rows,&Columns);
firstline = get_i(Tline,0);
firstcol = get_i(Tcol,0);
/* approximation with lines and circular arcs */
T_approx_chain_simple(Rows,Columns,
&Bzl,&Bzc,&Br,&Bwl,&Bwc,&Ll0,&Lc0,&Ll1,&Lc1,&order);
nob = length_tuple(Bzl);
nol = length_tuple(Ll0);
/* draw lines and arcs */
set_i(WindowHandleTuple,WindowHandle,0);
set_line_width(WindowHandle,4);
if (nob>0) T_disp_arc(Bzl,Bzc,Br,Bwl,Bwc);
set_line_width(WindowHandle,1);
if (nol>0) T_disp_line(WindowHandleTuple,Ll0,Lc0,Ll1,Lc1);
相关算子:
gen_nurbs_interp
创建内插给定点的NURBS曲线的控制数据。gen_nurbs_interp创建NURBS控制数据的CtrlRows,CtrlCols和NURBS曲线的节点(对输入点(行,列)进行插值)。 如果输入点列表未闭合(即,第一个点与最后一个点相同),则必须在切线中按[drow_0,dcol_0,drow_n-1,dcol_n-1的顺序给出第一个和最后一个点的切线 ](对于封闭点列表,切线必须是一个空元组)。 此外,必须指定NURBS曲线的度数。
gen_contour_nurbs_xld
描述
gen_contour_nurbs_xld生成近似于NURBS曲线(非均匀有理B样条曲线)的XLD轮廓。 NURBS曲线由其度数,控制多边形(通过Rows和Cols),权重矢量和结矢量指定。
曲线的度数决定了曲线的微分度。曲线位于其控制多边形(Rows,Cols)的凸包内。权重中的权重确定各个控制点(行,颜色)吸引的曲线量。如果选择“自动”,则将为所有控制点生成具有相等权重的权重向量。结矢量描述曲线的域。通常,此参数可以设置为“自动”。
生成的轮廓的准确性取决于两个参数MaxDistance和MaxError。 MaxDistance限制两个后续轮廓点的最大距离。生成的轮廓与实际NURBS曲线之间的最大距离限制为MaxError。默认情况下,近似值必须满足两个约束条件,但是可以将这些参数之一设置为“忽略”。选择的MaxError和MaxDistance越低,曲线的近似值越好。请注意,所有轮廓点均精确地位于曲线上(数字误差除外)。
定义
阶数为N的NURBS曲线C由下式给出
基本函数N_ {i,p}由下式定义
因此,每个NURBS曲线都由其度数p,其控制多边形P_ {0},...,P_ {n-1}(行和列),权重矢量w =(w_ {0},...来确定。 ,w_ {n-1})(权重)及其结向量u =(u_ {0},...,u_ {n + p})(结)。
曲线的微分等级通过度p设置。至少需要p + 1个控制点P_ {i}才能形成有效曲线。结向量u描述曲线的域。它的长度必须为n + p + 1,并且其条目必须单调递增。每个条目u_ {i}代表曲线段[u_ {i-1},u_ {i})和[u_ {i},u_ {i + 1})之间的一个结。每个曲线段[u_ {i},u_ {i + 1})都位于控制点P_ {i-p},..,P_ {i}的凸包中。对于长度为零的每个曲线段,结k处的可微性降低。结向量中每个结的出现次数称为多重性。一个结的最大重数为p。只有起点和终点的复数可以是p + 1(实际上大多数曲线都是这种情况,因为在这种情况下,曲线的起点和终点分别对应于控制多边形的第一个终点)。如果起点和/或终点没有完全多重性,则曲线的范围将限制为[u_ {p},u_ {n}]。权重w_ {i}确定各个控制点P_ {i}对曲线的影响。
闭合曲线:如果起点和终点相等(P_ {0} = P_ {n-1})且结点设置为“自动”,则曲线将自动闭合,以使所有结点都具有多重性。请注意,在这种情况下,权重的长度要求为n-1。
smooth_contours_xld
平滑输入的XLD轮廓轮廓,并在SmoothedContours中返回平滑的轮廓。 通过将轮廓的点投影到局部回归线(即最小二乘近似线)上来进行平滑,该局部回归线是根据当前轮廓点每一侧的NumRegrPoints计算得出的。例如,在缩放轮廓之前应调用此运算符。
approx_chain(halcon新版本已弃用)
用圆弧和直线近似轮廓。曲线的坐标由一行直线和圆弧近似。该过程尝试在用户定义的范围内为某些参数输入值。这些范围的限制在函数的参数列表中明确说明(MinWidthCoord ... MaxWidthCoord,ThreshStart ... ThreshEnd,MinWidthSmooth ... MaxWidthSmooth,MinWidthCurve ... MaxWidthCurve)。另外,必须指出尖角阈值的参数区域的步长(ThreshStep)。通过缩小覆盖范围,可以缩短计算时间,但结果可能会变差。
参数Weight1,Weight2和Weight3指示是否将所需权重更多地放在近似精度上,以获取尽可能多的大片段或尽可能少的小片段。因此,对于(Weight1,Weight2,Weight3)(1,0,0)创建一个非常精确的近似值,而(0,1,1)创建一个尽可能少的大片段的近似值。
该过程的结果分别以圆弧和直线形式返回。如果对分段的顺序感兴趣,则可以从生成的元组中依次读取各个生成的元素;该顺序可以从返回参数顺序中得出(0:下一个元素是下一个线段,1:下一个元素是下一个弧段)。
approx_chain_simple(halcon新版本已弃用)
曲线的轮廓由一系列直线和圆弧近似。该过程的结果分别以圆弧和直线形式返回。 如果对分段的顺序感兴趣,则可以从生成的元组中依次读取各个生成的元素。 该顺序可以从返回参数顺序中得出(0:下一个元素是下一个线段,1:下一个元素是下一个弧段)。
参考文献
L. Piegl, W. Tiller: ”The NURBS Book”, 2nd Edition, Springer, 1997.
Bezier曲线、B-Spline和NURBS的区别与《THE NURBS BOOK 2nd》简介