union_cotangential_contours_xld(Contours : UnionContours : FitClippingLength, FitLength, MaxTangAngle, MaxDist, MaxDistPerp, MaxOverlap, Mode : )
union_cotangential_contours_xld根据输入的XLD轮廓在其端点处的局部曲率来联合轮廓。
结果保存于UnionContours 。
参数介绍
FitClippingLength
轮廓联合是如何运作的?
首先,确定轮廓中每个输入轮廓的端部。
参数FitClippingLength指定在轮廓线两端临时剪切的欧式长度。
使用此参数,可以忽略输入轮廓末端的假象。
FitLength
利用参数FitLength给出了检验并集的欧几里德长度。
在轮廓线的每一端,至少有许多点分配给其长度大于或等于FitLength的端部。
值“auto”可以在这里使用。
然后函数尝试将轮廓分割成直线和弧线,
并将第一个和最后一个段作为端点。
由于这是计算密集型的,建议尽可能使用数字指定的值来表示长度。
函数试着把一个圆装进每个末端。
然后,确定距离这些圆足够近的输入轮廓端点(根据圆拟合的均方根误差测量)。
这些点的切线对应于输入轮廓末端的局部曲率。
如果圆圈拟合失败,则操作符尝试拟合回归线。然后,轮廓端点的局部曲率对应于通过端点点的回归线的方向。
输入轮廓将根据其端点处的计算局部曲率统一。
如果同时满足多个阈值,则考虑两个轮廓线:
MaxTangAngle
参数MaxTangAngle指定两个轮廓线的切线之间的最大角度。
MaxDist
两个端点的最大距离由MaxDist参数给出。
MaxDistPerp
垂直于切线的最大距离由参数MaxDistPerp指定。
这个距离是垂直于另一个轮廓的轮廓的端点的距离的最小值。
MaxOverlap
最后一个阈值是轮廓线的重叠。
重叠的数量由一个端点在另一个轮廓切线上的投影决定,
反之亦然。端点与其投影之间的距离必须小于MaxOverlap。
与其他阈值相反,MaxOverlap可以变为负值。
负值表示切线方向上端点的最小距离。
min(a,b)<=MaxOverlap,这种情况a,b为负值,参考函数union_collinear_contours_ext_xld,
可以了解a,b的取值。
如果满足上述条件,则有可能由该操作符关闭单个轮廓或将多个轮廓合并为单个封闭轮廓。
要知道,已经关闭的轮廓不再考虑为一个联合。
如果所有的阈值都在轮廓线之间被满足,
则计算一个评分值。
角度和距离的计算值越接近于0,
则得分值越高。
然后按照分数值的顺序执行统一。
因此,如果统一有多个候选项,
则首先合并最佳拟合轮廓。
参数 Mode表示,是否应该将输入轮廓的现有属性复制到输出轮廓。
'attr_keep'复制属性,这会对操作符的性能产生负面影响。
'attr_forget'导致操作符忽略现有属性。
有关详细信息,请参见操作符union_邻接_contours_xld的参数模式描述。
例程
dev_close_window ()
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
dev_set_part (0, 0, 511, 511)
FitClippingLength := 0
FitLength := 30
MaxTangAngle := rad(45)
MaxDist := 25
MaxDistPerp := 10
MaxOverlap := 2
RowOffsets := [25,25,240,240]
ColumnOffsets := [0,256,0,256]
*
gen_test_contour (ContourConcat1, RowOffsets[0], ColumnOffsets[0])
gen_test_contour (ContourConcat2, RowOffsets[1], ColumnOffsets[1])
gen_test_contour (ContourConcat3, RowOffsets[2], ColumnOffsets[2])
gen_test_contour (ContourConcat4, RowOffsets[3], ColumnOffsets[3])
dev_clear_window ()
dev_set_line_width (3)
dev_set_colored (12)
dev_display (ContourConcat1)
dev_display (ContourConcat2)
dev_display (ContourConcat3)
dev_display (ContourConcat4)
*
TestFitClippingLength := 10
TestFitLength := 5
TestMaxTangAngle := rad(135)
*
union_cotangential_contours_xld (ContourConcat1, UnionContours1, FitClippingLength, FitLength, MaxTangAngle, MaxDist, MaxDistPerp, MaxOverlap, 'attr_forget')
union_cotangential_contours_xld (ContourConcat2, UnionContours2, TestFitClippingLength, FitLength, MaxTangAngle, MaxDist, MaxDistPerp, MaxOverlap, 'attr_forget')
union_cotangential_contours_xld (ContourConcat3, UnionContours3, FitClippingLength, TestFitLength, MaxTangAngle, MaxDist, MaxDistPerp, MaxOverlap, 'attr_forget')
union_cotangential_contours_xld (ContourConcat4, UnionContours4, FitClippingLength, FitLength, TestMaxTangAngle, MaxDist, MaxDistPerp, MaxOverlap, 'attr_forget')
*
dev_clear_window ()
dev_set_line_width (5)
dev_display (UnionContours1)
dev_display (UnionContours2)
dev_display (UnionContours3)
dev_display (UnionContours4)
dev_set_line_width (1)
dev_set_color ('white')
dev_display (ContourConcat1)
dev_display (ContourConcat2)
dev_display (ContourConcat3)
dev_display (ContourConcat4)
Message[0] := 'Results of'
其中函数gen_test_contour为自定义函数,
内部代码 为
Rows1 := [131.5,117.5,132,100.5] + RowOffset
Columns1 := [117.5,118.5,150.5,175.5] + ColumnOffset
Rows2 := [120.5,121,131.5,122.5] + RowOffset
Columns2 := [39.5,76,114.5,112.5] + ColumnOffset
Rows3 := [64.5,88,88,111.5] + RowOffset
Columns3 := [119.5,117.5,115.5,115.5] + ColumnOffset
Rows4 := [136.5,173.5,229.5,103.5] + RowOffset
Columns4 := [117.5,106.5,272.5,185.5] + ColumnOffset
gen_contour_nurbs_xld (Contour1, Rows1, Columns1, [0,0,0,0,1,1,1,1], 'auto', 3, 1, 5)
gen_contour_nurbs_xld (Contour2, Rows2, Columns2, [0,0,0,0,1,1,1,1], 'auto', 3, 1, 5)
gen_contour_nurbs_xld (Contour3, Rows3, Columns3, [0,0,0,0,1,1,1,1], 'auto', 3, 1, 5)
gen_contour_nurbs_xld (Contour4, Rows4, Columns4, [0,0,0,0,1,1,1,1], 'auto', 3, 1, 5)
concat_obj (Contour1, Contour2, ContourConcat)
concat_obj (ContourConcat, Contour3, ContourConcat)
concat_obj (ContourConcat, Contour4, ContourConcat)
return ()
|