使用 Clipper 库的一些问题记录

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_25923849/article/details/77257866

前言:
最近一直在使用Clipper库做一些图形裁剪相关的工作,发现这个库比较好用,使用过程中遇到了一些问题,现在记录一下,方便自己和他人。

首先感谢以下博文的帮助:
http://blog.csdn.net/ryfdizuo/article/details/40682639
https://fhln.blog.ustc.edu.cn/?p=302

还有官方的文档:
http://www.angusj.com/delphi/clipper/documentation/Docs/Units/ClipperLib/_Body.htm
http://www.angusj.com/delphi/clipper.php


使用过程中主要遇到以下两个问题:
一、裁剪的必要条件
二、存储裁剪后数据的solution类型—-PolyTree的弯路

在说正事之前还是要说明一点,本人不是编程科班出身,基础知识非常薄弱,可能看到和遇到的问题都很浅显,欢迎大佬批评指正,欢迎小白交流,我也只是记录一下心得,毕竟过几个月再看自己当时写的代码,谁也不知道是什么天书。配置使用就不谈了,官网都有,如果看不懂说明这篇心得对你没什么用哦。


正文:
一、裁剪的必要条件
利用clipper对象的Execute方法进行图形交互操作,我主要用了ctIntersection,也就是求交。
这里主要想说AddPaths过程中的两个对象的性质,要做相交(裁剪),需要两个图形,姑且把用来裁剪的叫剪刀,被裁剪的叫白纸。剪刀和白纸都有bClosed属性,也就是说明该图形是封闭图形还是开放图形,Clipper库的规定是只能用封闭的剪刀,对白纸不做要求,但如果是裁剪开放的白纸,需要PolyTree来做solution的容器。这也就引出了下一个问题,在用PolyTree时遇到的一些弯路。

//Clipper类中的AddPaths方法
bool AddPaths(const Paths &ppg, PolyType polyType, bool closed);

在向Clipper对象加入剪刀或白纸时需要指定bool closed参数,即上文提到的问题。这个问题有什么影响呢,简单来说,用封闭剪刀去裁剪封闭白纸得到的是一个封闭的图形块,用封闭剪刀去裁剪开放白纸得到的是一些线段。明白这个就可以根据自己的需求解决一些问题啦。

二、PolyTree的弯路
说是弯路,也只是自己没看清路。其实这些问题如果你有时间把Clipper的文档仔细读一遍,就迎刃而解了,关键是大部分同志只是想利用其中很少的功能迅速的解决问题,比如我。这就免不了遇到一些问题,走弯路。
上文说了裁剪的条件,那么我是需要得到折线段的那一类,也就是封闭剪刀(当然是必须封闭)去裁剪开放的白纸(也就是折线段的集合)。在这里不想说那些孔洞啊,回绕方式什么的,只是想提醒,PolyTree这个类型就是用来接受我这种开放裁剪需求的,但是!!你需要看一下他的结构,因为他里面的点不是按顺序存储的,其实是父子关系,遍历的时候要注意,我就在这里犯了错。还有一点,PolyTree的Clear方法你也要看一下,这个方法在Cipper调用Execute方法之前会自动执行,有时候会报错。

主要内容就是这些了,欢迎大家有更多关于Clipper的问题来讨论,共同进步。

猜你喜欢

转载自blog.csdn.net/sinat_25923849/article/details/77257866