如何将点映射到扭曲网格上
-
05-07-2019 - |
题
假设您有一组坐标为笛卡尔坐标系的点。
您想要绘制另一个点,并且您知道它在相同的笛卡尔坐标系中的坐标。
但是,您正在绘制的绘图与原始绘图失真。想象一下,将原始平面打印在橡胶板上,然后在某些地方拉伸并以不对称的方式将其捏在其他地方(没有重叠或任何复杂的情况)。
( source )
您知道每组点的拉伸和未拉伸坐标,但不知道基础拉伸函数。你知道一个新点的未拉伸坐标。
如何根据附近点的拉伸位置估算在拉伸坐标中绘制新点的位置?它不需要精确,因为除非您有更多信息,否则无法从一组重映射点确定实际拉伸函数。
其他可能的关键字:扭曲的扭曲网格平面坐标unwarp
解决方案
好的,所以这听起来像是图像变形。这是你应该做的:
-
为您的未扭曲网格创建 Delaunay三角测量并使用您的知识翘曲和未翘曲网格之间的对应关系为翘曲网格创建三角剖分。现在您知道每个图像中的相应三角形,并且由于没有重叠,您应该能够毫不费力地执行下一步。
-
现在,在扭曲的图像中找到对应的
A
点:- 找到三角形
A
,并使用未扭曲网格中的三角形和扭曲网格之间的变换来计算新位置。
醇>
- 找到三角形
另一种(更复杂的)方法是薄板样条(也会有解释)在上面的幻灯片中。)
其他提示
我知道你在包裹和未包裹的网格点之间有一对一的对应关系。我假设变形不是那么极端,你可能有交叉的网格线(就像你显示的图像)。
这个策略正是雅各布所建议的:对三个网格进行三角测量,使得三角形之间存在一对一的对应关系,找到要在三角剖分中映射的点,然后在相应的三角形中使用重心坐标来计算新点位置。
<强>预处理强>
- 生成包裹网格点的 Delaunay三角剖分,让我们称之为
WT 代码>
- 对于
WT
中的每个三角形,在展开的网格中的相应顶点之间添加一个三角形。这给出了未包装点的三角剖分UWT
。
醇>
将点 p
映射到包装的网格
其他答案很棒。我要补充的唯一一件事就是你可能想看看自由形状变形作为描述变形的一种方式。
如果这很有用,那么很可能将变形网格/点阵拟合到已知对中,然后你就可以非常快速地改变未来的点。
很大程度上取决于您拥有多少现有积分。如果你只有一个,你可以用它做的事情真的不多 - 你可以在同一个方向上将第二个点偏移相同的数量,但你没有足够的数据来做到这一点。
如果您有相当数量的现有点,您可以通过这些点进行曲面拟合,并使用它来近似新点的正确位置。给定N个点,你总是可以使用N次多项式得到一个完美的拟合,但你很少想这样做 - 相反,你通常猜测拉伸函数是一个相当低阶的函数(例如二次或三次)和拟合在此基础上的点的表面。然后根据拟合曲面的函数放置新点。