原贴: 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打印方面都有着比较重要的应用。