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

  • 2019 年 10 月 8 日
  • 笔记

根据上一篇文章,对于这一小步算法,我们令

最小化这个误差和,对 w 求偏导,并使其偏导值为 0。

我们依然用Mathematica推导公式。

如上代码,我们把公式写成"手写"公式一样的形式。我们分别声明了

以及

构造系数矩阵 F。

输出 F 结果为

如果放大上面的公式,结果很完美,可视化效果特别好看。挑其中一个系数放大看。

但是这种可视化效果对于写C++程序完全没有用

重新改写各个变量的声明。

我们摒弃了可视化效果很好的“上下标”,全部用普通字符来表示。再看输出系数矩阵 F 的代码。

输出其中一个系数看一下结果。

把输出直接拷贝到文本编辑器。

除了Power函数不合适,其他都可以很完美的输出到C++代码中。

另外,系数矩阵 C 如下。

接下来我们看C++代码。先直接看求取系数矩阵 F C 的函数。

上一篇文章。这一小步算法针对三角形做变形,每个三角形之间相互独立,每个三角形单独优化。所以根据第一步算法的代码,我们需要修改Triangle结构体。

其中每个三角形做优化需要生成系数矩阵 F C ,优化函数PreComputeScaleAdjustmentMatrixFC。另外,scale_factor_divisor 变量作为“放缩”变量。在上篇文章末尾说到。为了抵消"缩放"的效果,我们要计算一个比值

,然后对变形的三角形按照缩放比值来变换。这个 scale_factor_divisor 就是预计算的

另外,Mesh类也需要修改,需要添加一个函数给每个三角形做变形。

添加AdjustScaleToTriangle函数,输入三角形序号,输出三角形三个顶点的坐标,这里只输出 (x, y) 坐标值。

系数矩阵 F C MeshRead函数(具体看Coding.net本项目的源码)时就已经预计算过了。然后我们计算新的 v0f, v1f, v2f 这三个三角形顶点。最后几行就是对三角形做“放缩”

最后看一下这一小步的结果。绿色框三角形就是这一小步的结果。黑色框三角形是第一步算法的结果。

该文所有代码都已开源,地址为:

https://coding.net/u/forestsen/p/ARAPShapeManipulation