1. 程式人生 > 實用技巧 >Unity論壇問答-如何裁剪一個多邊形

Unity論壇問答-如何裁剪一個多邊形

原貼: Generate Polygons and Colliders Runtime in 2D Game

這是有一個2017年的帖子, 題主siddharth3322有了一個遊戲的創意, 然後在論壇徵詢一些實現方面的建議, 於是和Fido789一問一答持續了幾個月.

最後遊戲上線了Google Play: Scale

遊戲的玩法如下:

很明顯需要在遊戲過程中不斷地建立多邊形, 題主使用了一個叫做PolyMesh的程式碼來生成多邊形.
而這個元件需要按順序提供各個頂點.
於是有了一個問題, 如何按照順序(如順時針)排序各個頂點呢?

題主參考了StackOverflow上的一個回答: Sort points in clockwise order?


方法是首先找到多邊形的中心點, 然後在排序中把比較方法設為:

det = (a.x - center.x) * (b.y - center.y) - (b.x - center.x) * (a.y - center.y)


註釋中說這是計算向量Vca與向量Vcb的叉乘, 根據正負來判斷順序.
也可以整理一下式子, 認為這是在比較斜率k.

這個方法看起來很美好, 但是實際出現了問題:

原始多邊形如下圖

裁剪後希望變成下面綠色部分

但實際上變成下面紅色部分

Fido789回答道: 你找的這個演算法只能針對凸多邊形, 但你應用在了凹多邊形上.
建議使用Clipper, 直接做一個多邊形的A and not B操作就行.




也許對這個應用來說可以有更輕量級的解法方法, 但是在效能不重要的情況下, 用Clipper不是很優雅麼.

看到國內有人翻譯了Clipper的中文文件, 其中對Clipper的介紹如下:

Clipper庫是目前計算機圖形屆廣為使用的圖形處理庫,可以用於解決平面二維圖形的多邊形簡化、布林運算和偏置處理,
在CAD、加工路徑與3D列印方面都有著比較重要的應用。