graphics - 两个相交多边形之间的平滑过渡(有趣的问题)

标签 graphics polygons

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

我对此转变的标准是:

  1. 这种转变在时间和空间上都是连续的
  2. 从多边形 A“填充”到多边形 B 的区域应该被填充,就好像 A 中的液体正在倒入 B 的形状
  3. 重要的是,该动画可以即时计算,也可以通过一组需要很少空间(例如小于几 Kb)的参数来定义。

作弊是完全可以的,任何解决这个问题并使其看起来不错的方法都是可能的解决方案。

我考虑过但大多被排除的解决方案:

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

大家有什么不同的想法吗?

最佳答案

如果您想保持简单且快速,您可以继续您的最后一个想法,即考虑缩放多边形 A,使其逐渐填充多边形 B。您不一定需要检查向外缩放的顶点是否仍在多边形 B 内。根据您的代码环境和 API 的情况,您可以使用多边形 B 的轮廓来掩盖扩展多边形 A 的像素。

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

关于graphics - 两个相交多边形之间的平滑过渡(有趣的问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6907192/

相关文章:

c# - 相邻多边形的简化

r - 仅将多边形重复区域(重叠)分配给一个多边形

postgis - 如何将相邻多边形合并为 1 个多边形并保留最小/最大数据?

iphone - 如何将iPhone点击手势识别限制在圆形图像内?

查找包围点的多边形的算法 - 仅定义线

javascript - 选择 map 控件外部的 Google map 多边形并修改属性

html - 从 Blackberry 上的 BrowserField 获取图形对象或位图

C# picturebox 绘制速度

graphics - 如何使用 ocamlopt 的 Graphics 模块编译 ocaml 程序?

java - 图像填充后颜色不同