difference_closed_contours_xld(Contours, Sub : ContoursDifference : : )
函数计算Contours-Sub 的结果轮廓,结果保存于ContoursDifference
如果单个输入轮廓没有关闭,则通过连接它们的起点和终点自动闭合。
在内部计算时,由Contours, Sub对应的闭合区域先确认,然后再计算区域的不同部分。
将这两组输入轮廓称为边界集。边界集由任意数量的边界(分别为Contours, Sub)组成。
每个边界可以是凸凹自交的。
边界嵌套可形成内孔。
这种边界集所包围的区域由所谓的偶奇规则定义。
因此,它由具有以下性质的所有点组成:
由该点与位于区域外的另一个参考点连接而成的线具有奇数个带有边界的交叉点。
更具描述性的是,这意味着如果一个边界完全位于另一个边界所包围的区域内,
则该边界定义了该区域内的一个洞。
同样,将一个边界集的两个单独边界的重叠区域作为一个“孔”,
即,它不属于这两个边界所围合的区域。
注意,被边界包围的区域并不取决于边界的方向。
自交边界可以在交点处分割,也可以重新排序,使其在交点处接触自身。
产生的边界被视为单独的边界。
由此产生的边界轮廓差被自动划分为包围区域的边界和包围孔的边界。
该信息存储在全局轮廓属性'is_hole'中。
对于包围孔的边界,全局轮廓属性'is_hole'被设置为1。
否则,它被设置为0。
注意,行和列坐标相差小于1e-06像素的后续点被视为一个点。
例程
gen_ellipse_contour_xld (Contour1, 200, 200, 0, 100, 100, 0, 6.28318, 'positive', 1.5)
gen_ellipse_contour_xld (Contour2, 200, 300, 0, 100, 100, 0, 6.28318, 'positive', 1.5)
difference_closed_contours_xld (Contour1, Contour2, ContoursDifference)
dev_set_line_width (5)
dev_set_color ('green')
dev_display (Contour1)
dev_set_color ('red')
dev_display (Contour2)
dev_set_line_width (3)
dev_set_color ('blue')
dev_display (ContoursDifference)
stop ()
dev_clear_window ()
dev_set_line_width (1)
dev_set_color ('white')
*第二种
gen_ellipse_contour_xld (Boundary1, 200, 200, 0, 100, 100, 0, 6.28318, 'positive', 1.5)
gen_ellipse_contour_xld (Hole1, 200, 200, 0, 75, 75, 0, 6.28318, 'positive', 1.5)
concat_obj (Boundary1, Hole1, BoundarySet1)
gen_ellipse_contour_xld (Boundary2, 200, 300, 0, 100, 100, 0, 6.28318, 'positive', 1.5)
gen_ellipse_contour_xld (Hole2, 200, 300, 0, 75, 75, 0, 6.28318, 'positive', 1.5)
concat_obj (Boundary2, Hole2, BoundarySet2)
difference_closed_contours_xld (BoundarySet1, BoundarySet2, ContoursDifference)
dev_set_line_width (5)
dev_set_color ('green')
dev_display (BoundarySet1)
dev_set_color ('red')
dev_display (BoundarySet2)
dev_set_line_width (3)
dev_set_color ('blue')
dev_display (ContoursDifference)
例程调用difference_closed_contours_xld 两次,
计算不同轮廓的差集。
单步执行,查看效果。
|