天天看點

使用 Clipper 庫的一些問題記錄

前言:

最近一直在使用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的問題來讨論,共同進步。