2011-08-02 31 views
3

我有一个有趣的问题,我一直试图解决一段时间。没有“正确的”解决方案,因为没有成功的严格标准。我想做到的是两个简单的多边形之间的多边形B.多边形多边形B.完全包含在一个平稳过渡,从多边形A两个相交多边形之间的平滑过渡(有趣的问题)

我对这个过渡标准是:

  1. 的过渡是在时间和空间上连续
  2. 从多边形A“填充”为多边形B的区域应填充好像A中有液体倒出成B形
  3. 重要的是,这个动画可以在飞行中进行计算,也可以通过一组需要的参数进行定义空间,比如少于几个Kb。

作弊是完美的罚款,任何方式来解决这个问题,使它看起来不错是一个可能的解决方案。

解决方案,我认为,和大多排除:

  • 配对起来一个顶点和B,只需插。看起来不好,在凹多边形的情况下不起作用。
  • 将区域B-A划分成凸多边形,也许是一个Voronoi图,并通过在较小的凸多边形上执行BFS来计算多边形的离散状态。然后我在离散状态之间进行插值。注意:如果多边形B-A是凸的,则转换相当平凡。我没有采用这个解决方案,因为将B-A划分成尺寸相同的小凸多边形令人惊讶地困难
  • 模拟:细分多边形A.以离散的小步骤沿着多边形线正常(向外)移动每个顶点。对于每一步,检查顶点是否仍然在B内。如果不是,则返回到前一个位置。重复,直到A等于B.我不喜欢这个解决方案,因为检查一个顶点是否在一个多边形内是很慢的。

有没有人有任何不同的想法?

+0

对于堆栈溢出,这不是一个合适的问题。它太宽泛了,你基本上要求别人为你写代码(或者至少为你提供一个算法)。 – user1118321

回答

0

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

在现代OpenGL中,您可以在片段着色器。您必须将多边形B渲染到纹理,将该纹理发送到着色器,然后使用该纹理查看渲染的当前片段是否映射到由多边形B设置的纹理值。如果不是,该片段被丢弃。您需要使纹理与屏幕一样大。如果不是,则需要在着色器中包含一些相机计算,以便可以将“测试的片段”“渲染”到纹理中,方法与将多边形B渲染到该纹理中的方式相同。