代码之家  ›  专栏  ›  技术社区  ›  endolith

如何将点映射到扭曲的栅格上

  •  11
  • endolith  · 技术社区  · 15 年前

    an unwarped grid

    你想画另一个点,你知道它在同一个笛卡尔坐标系中的坐标。

    但是,您正在绘制的绘图与原始绘图不同。想象一下,以不对称的方式(没有重叠或任何复杂的东西)将原始平面打印在橡胶板上,在某些地方拉伸,在其他地方挤压。

    a warped grid source )

    您知道每个点集的拉伸和非拉伸坐标,但不知道基本拉伸函数。您知道新点的非拉伸坐标。

    如何根据附近点的拉伸位置估计在拉伸坐标中绘制新点的位置?它不需要精确,因为除非有更多信息,否则无法从一组重新映射的点确定实际拉伸函数。

    其他可能的关键字:扭曲扭曲的网格平面坐标

    4 回复  |  直到 12 年前
        1
  •  5
  •   Kartik Madhira Jacob    5 年前

    这听起来像是图像扭曲。这就是你应该做的:

    1. 创建一个 Delaunay triangulation 创建未扭曲栅格的坐标系,并使用已扭曲栅格和未扭曲栅格之间的对应关系知识为扭曲栅格创建三角剖分。现在您知道了每个图像中对应的三角形,并且由于没有重叠,您应该能够轻松地执行下一步。

    2. A ,在扭曲的图像中:

      1. 找到三角形 位于并使用未扭曲栅格中的三角形和扭曲栅格之间的变换来确定新位置。

    对此进行了详细的解释 here .

    另一种(更复杂的)方法是 Thin Plate Spline

        2
  •  2
  •   balint.miklos    15 年前

    据我所知,已包装和未包装网格点之间存在一对一的对应关系。我假设变形并不是那么极端,你可能有相交的网格线(就像你展示的图像)。

    该策略正是Jacob建议的:对两个网格进行三角剖分,使三角形之间存在一对一的对应关系,在三角剖分中定位要映射的点,然后在相应三角形中使用重心坐标计算新点的位置。

    预处理

    1. 生成 Delaunay triangulation WT .
    2. 对于每个三角形 在展开网格中的相应顶点之间添加三角形。这给出了一个三角测量 UWT 未包装点的。

    绘制一个点 p 进入包裹的网格

    1. 找到三角形 T(p1,p2,p3) 其中包含 P .
    2. 计算 barycentric coordinates (b1,b2,b3) 属于 P 在里面
    3. Tw(q1,q2,q3) 是三角形吗 WT 对应于 T(p1、p2、p3) . 新职位是
      b1 * q1 + b2 * q2 + b3 * q3 .

    这将提供一个变形函数作为 linear spline

        3
  •  2
  •   tfinniga    15 年前

    其他答案都很好。我唯一要补充的是你可能想看看 Free form deformation

    如果这是有用的,那么很有可能将变形网格/晶格拟合到已知对,然后就有了一种非常快速的变形未来点的方法。

        4
  •  0
  •   Jerry Coffin    15 年前

    很大程度上取决于你现有的点数。如果你只有一个点,你就不能用它来做很多事情——你可以在同一个方向上用同样的量来偏移第二个点,但是你没有足够的数据来做得更好。

    如果有相当多的现有点,可以通过这些点进行曲面拟合,并使用该拟合来近似新点的正确位置。给定N个点,您总是可以使用N阶多项式获得完美拟合,但您很少希望这样做——相反,您通常猜测拉伸函数是一个相当低阶的函数(例如,二次或三次),并在此基础上将曲面拟合到点。然后根据拟合曲面的函数放置新点。