欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 高考 > (4)JS-Clipper2之PolyTree

(4)JS-Clipper2之PolyTree

2025/9/14 19:52:35 来源:https://blog.csdn.net/yilvqingtai/article/details/144343299  浏览:    关键词:(4)JS-Clipper2之PolyTree

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所包含的下一层子轮廓数量。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词