Unity論壇問答-如何裁剪一個多邊形
阿新 • • 發佈:2020-07-10
原貼: 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列印方面都有著比較重要的應用。