1. 描述
继承自PolyNode
PolyTree被设计成一个只读数据结构,只能用来接收裁剪或者偏置的结果。一般在结果中经常会选择是否使用Paths或者PolyTree来获取最终的结果;PolyTree数据结构优于Paths,能够正确反应返回类型的父子关系,能够对开放路径和闭合轮廓进行区别。也正因为PolyTree有着比Paths更复杂的结构,导致算法效率下降大约5%以上,PolyTree目前只能用于寻找父子关系或开放路径需要考虑的场合;
在Clipper.Execute和ClipperOffset.Execute两个函数中,可以使用一个空的PolyTree对象来作为接收solution参数接收结果,一旦裁剪工作和偏置工作完成后,函数就会将结果已PolyTree的形式返回出来;
一个PolyTree对象可以包含任何数目的PolyNode子对象,其中每一个PolyNode代表了多边形的一个轮廓(内轮廓或者外轮廓)。PolyTree本身就是一个特殊的PolyNode对象,它的子对象即代表结果中了最高级别的外轮廓,而它自身的Contour数据始终为空,被包含的最高级别的PolyNode还可能包含它自己的子对象(内孔),甚至自己的内孔还可以包括被嵌套的外轮廓等。但是外轮廓的子对象永远是孔,孔的子对象永远是外轮廓。
PolyTree可以包含开放路径。开放路径永远会在最高级别的子轮廓中存储,提供了两个函数可以快速的分离提取PolyTree开放路径和封闭轮廓—OpenPathsFromPolyTree和ClosedPathsFromPolyTree。
polytree: Contour = ()ChildCount = 1Childs[0]: Contour = ((10,10),(100,10),(100,100),(10,100))IsHole = FalseChildCount = 1Childs[0]: Contour = ((20,20),(20,90),(90,90),(90,20))IsHole = TrueChildCount = 2Childs[0]: Contour = ((30,30),(50,30),(50,50),(30,50))IsHole = FalseChildCount = 0Childs[1]: Contour = ((60,60),(80,60),(80,80),(60,80))IsHole = FalseChildCount = 0
2. 方法
2.1 ClipperLib.PolyTree()
返回新的PolyTree数据结构
PolyTree PolyTree()var polytree = new ClipperLib.PolyTree(); // creates PolyTree object
// cpr.Execute ...
2.2 ClipperLib.PolyTree.Clear()
该方法将删除PolyTree对象中所有的子对象。
Clear一般不需要显式调用,每次执行Clipper.Execute方法每次接受一个PolyTree参数,并在生成新的结果之前会自动清楚其中的内容。同样的,PolyTree的析构函数会自动清理其内部包含的PolyNode。
2.3 ClipperLib.PolyTree.GetFirst()
该方法返回第一个有效的polygon的PolyNode的指针,否则返回空;
该方法等价于调用Child[0]除非一个PolyTree的对象为空(无任何子对象),这种情况下使用Child[0]会产生越界。
PolyNode GetFirst()var polynode = polytree.GetFirst();
2.4 ClipperLib.PolyTree.Total()
Number Total() // read onlyvar total = polytree.Total();
返回该PolyTree所包含的所有PolyNodes的数量,该值不应和ChildCount混淆,后者是返回当前PolyNode所包含的下一层子轮廓数量。