原貼: Generate Polygons and Colliders Runtime in 2D Game
這是有一個2017年的帖子, 題主siddharth3322有了一個遊戲的創意, 而後在論壇徵詢一些實現方面的建議, 因而和Fido789一問一答持續了幾個月. git
最後遊戲上線了Google Play: Scale
遊戲的玩法以下:github
很明顯須要在遊戲過程當中不斷地建立多邊形, 題主使用了一個叫作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.
這個方法看起來很美好, 可是實際出現了問題:app
原始多邊形以下圖ide
裁剪後但願變成下面綠色部分性能
但實際上變成下面紅色部分google
Fido789回答道: 你找的這個算法只能針對凸多邊形, 但你應用在了凹多邊形上.
建議使用Clipper, 直接作一個多邊形的A and not B操做就行.
也許對這個應用來講能夠有更輕量級的解法方法, 可是在性能不重要的狀況下, 用Clipper不是很優雅麼.
看到國內有人翻譯了Clipper的中文文檔, 其中對Clipper的介紹以下:.net
Clipper庫是目前計算機圖形屆廣爲使用的圖形處理庫,能夠用於解決平面二維圖形的多邊形簡化、布爾運算和偏置處理,
在CAD、加工路徑與3D打印方面都有着比較重要的應用。翻譯