3

我有一个有趣的问题,我已经尝试解决了一段时间。对此没有“正确”的解决方案,因为没有严格的成功标准。我想要完成的是两个简单多边形之间的平滑过渡,从多边形 A 到多边形 B。多边形 A 完全包含在多边形 B 中。

我对这种转变的标准是:

  1. 过渡在时间和空间上是连续的
  2. 从多边形 A “填充”到多边形 B 的区域应该被填充,就好像 A 中有液体倒出成 B 的形状一样
  3. 重要的是,该动画既可以动态计算,也可以由一组需要很少空间的参数定义,比如少于几 Kb。

作弊完全没问题,任何解决这个问题的方法都是可行的。

我考虑过的解决方案,大部分被排除在外:

  • 将 A 和 B 中的顶点配对并简单地进行插值。在凹多边形的情况下看起来不好并且不起作用。
  • 将区域 BA 划分为凸多边形,可能是 Voronoi 图,并通过对较小的凸多边形进行 BFS 来计算多边形的离散状态。然后我在离散状态之间进行插值。注意:如果多边形 BA 是凸的,则过渡是相当微不足道的。我没有采用这种解决方案,因为将 BA 分成大小相等的小凸多边形非常困难
  • 模拟:细分多边形 A。沿多边形线法线(向外)以离散但小的步长移动每个顶点。对于每一步,检查顶点是否仍在 B 内。如果不是,则移回先前的位置。重复直到 A 等于 B。我不喜欢这个解决方案,因为检查顶点是否在多边形内很慢。

有没有人有不同的想法?

4

1 回答 1

0

如果你想保持这个简单和有点快,你可以继续你的最后一个想法,你考虑缩放多边形 A 以便它逐渐填充多边形 B。你不必检查向外缩放的顶点是否仍在内部多边形 B。根据您的代码环境和 API 的样子,您可以用多边形 B 的轮廓掩盖扩展多边形 A 的像素。

在现代 OpenGL 中,您可以在片段着色器中执行此操作。您必须将多边形 B 渲染到纹理,将该纹理发送到着色器,然后使用该纹理来查找当前正在渲染的片段是否映射到多边形 B 设置的纹理值。如果不是,片段被丢弃。您需要使纹理与屏幕一样大。如果没有,您需要在着色器中包含一些相机计算,以便您可以将要测试的片段“渲染”到纹理中,就像将多边形 B 渲染到该纹理中一样。

于 2014-11-10T21:20:36.963 回答