c++ - 如何从凸形中形成凹形?

标签 c++ math graphics sfml concave

我试图绕过只能在 SFML c++ 库中形成凸形的规则。

To do this I'm planning on testing given vertices, and if concave, splitting the vertices into groups, testing each groups' concaveness, and repeating until a full set of concave shapes results that look just like the original shape when put together

我想知道的是...

  • 测试形状凹度的方程式是什么:它是什么以及它是如何工作的?

  • 我如何拆分凹形的顶点,以便最终由尽可能少的凸形形成形状?

  • 实现我的目标的最佳实践是什么?

谢谢!


最佳答案

您可以通过绕过所有边并检查下一条边始终沿同一方向(左/右手)移动来测试形状是否为凸包。这是一种快速且廉价的算法。这里有一个实现:en.wikipedia.org/wiki/Graham_scan

如果您没有凸包,请执行包裹包装算法以获得包含所有点的凸包(同样非常快)。 en.wikipedia.org/wiki/Gift_wrapping_algorithm

现在,寻找在您的形状上但不在凸包上的点。对于这些点的每次运行,从这些点创建一个新形状(加上凸包任一侧的 2 个)。

递归现在是你的 friend :对你刚刚制作的每个子形状执行完全相同的过程。

我已经使用这种技术来测试包含在任意形状内的点:即点必须在凸包内(易于测试),但不是任何子形状或它们的子形状,或它们的子形状....

关于c++ - 如何从凸形中形成凹形?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6686279/

相关文章:

java - Oj 算法并发

cocoa - Cocoa 中的图形界面按钮

c# - 我可以在没有这些工件的情况下使用 graphics.RotateTransform() 吗?

c++ - Visual C++ 6.0 中查找源文件的预设位置

c++ - 将每个值传递到数组中

c++ - iostream 使用 << 构造字符串

algorithm - 找到一个最佳的 n 正方形大小(每个都相同)以适合矩形容器的大部分

javascript - HTML5 Canvas 坐标给出了奇怪的 Angular

Java2D : Capturing an event on a Line object

c++ - ICU 货币区域获取面额