As-rigid-as possible shape manipulation: 第二步算法的第二小步代码

  • 2019 年 10 月 8 日
  • 笔记

由上篇文章,我们用Mathematica代码推导了第二步算法第二小步的公式。

首先修改Mesh类。

Mesh类中添加了PreComputeScaleAdjustmentMatrixHf函数,求解如下公式中的系数矩阵和系数向量。

看这个函数的代码。

如上篇文章所述,有如下公式。

遍历所有三角形,在三角形内部,以三角形的三条边为单位,即按当前三角形顶点顺序,每次选择两个顶点作为一条边向量。然后按照上篇文章推导的系数矩阵 H 分解为 H' D

于是我们有,

其中

这两个矩阵和控制点相关,所以在每一次鼠标点击控制点后都要重新排列自由点和控制点,进而预计算这两个矩阵。所以我们再修改onMouseClick函数。

在计算完第一步算法的 scale free matrix 之后,紧接着就计算系数矩阵 H' D

但是另外一个系数向量 f 非常特殊,根据上篇文章的推导,我们发现系数向量 f 是由第二步算法的第一小步的结果输入而来。而第一小步的结果是随用户拖拉控制点使三角形变形而来。所以,需要再修改Deform函数。

看上述代码。在第一步算法结束后,遍历三角形,在三角形内部调用AdjustScaleToTriangle函数,得到当前的 fitted 三角形三个顶点的坐标。然后给系数向量 f 赋值。

因为所有的点都被重排为自由点 u 和控制点 q 的顺序,而系数向量 f₀ 只是针对于自由点 u 的。所以还需要从 f 中按照自由点 u 在点集中的顺序抽取出 f0

接下来代码涉及到解方程的步骤。我们知道了 H', D, f₀ 和实时的 q 就可以通过解方程的形式求出 u。

我们看最终的程序运行结果。