高阶Laplace曲面形变算法(Polyharmonic Deformation)

  数学上曲面的连续光滑形变可以通过最小化能量函数来建模得到,其中能量函数用来调节曲面的拉伸或弯曲程度,那么能量函数最小化同时满足所有边界条件的最优解就是待求曲面。

  能量函数通常是二次函数形式:

其中S*代表关于曲面参数u和v的k阶偏导。

  对于上述优化问题的求解方法,通常利用变分法得到对应的Euler-Lagrange方程,然后求解该方程得到最优解。对于二次能量函数形式,其对应的Euler-Lagrange方程为如下多阶调和方程:

  例如对于,那么对应的Euler-Lagrange方程就是2阶Laplace方程Δ2x = 0。上式中Δ代表Laplace算子,边界区域δΩ的限制条件bj保证了系统存在非平凡解。

  对于k = 1,上述方程描述的是满足曲面面积最小的表面;对于k = 2,方程描述的是满足曲面弯曲最小的表面,对于k = 3,方程描述的是满足曲面曲率变化最小的表面。

  方程的边界条件可以选择Dirichlet边界条件(第一类边界条件),即指定曲面边界点的位置,或者Neumann 边界条件(第二类边界条件),即指定曲面边界点的法向方向。

  如果曲面用三角网格形式表示,那么我们在方程中需要使用离散Laplace算子,这是一个线性算子,具体形式在“网格形变算法”中有所解释,其表达式如下:

其中αij和βij为边eij对应的2个对角,N1(pi)表示顶点pi的1环邻域点,A(pi)表示顶点pi的Voronoi面积。

function L = Laplace_Matrix(V, F)
    nV = size(V,1);
    L = sparse(nV,nV);
    for i = 1:3
       i1 = mod(i-1,3)+1;
       i2 = mod(i  ,3)+1;
       i3 = mod(i+1,3)+1;
       Vec1 = V(F(:,i2),:) - V(F(:,i1),:);
       Vec2 = V(F(:,i3),:) - V(F(:,i1),:);

       cotangle = 0.5 .* dot(Vec1, Vec2, 2) ./ norm(cross(Vec1, Vec2, 2));

       L = L + sparse(F(:,i2), F(:,i3), cotangle, nV, nV);
    end
    L = L + L‘;
    L = -spdiags(full( sum(L,2) ), 0, nV, nV) + L;
end

  利用离散线性Laplace算子,方程可以变化为稀疏线性方程组:

其中p = (p1, … , pp)是计算域内的待求点,对应下图中黄色点集;h = (h1, … , hp)是计算域内的控制点,对应下图中红色和蓝色点集,它们代表了方程中的边界条件。需要注意的是为满足求解得到的曲面Ck连续,方程中需要待求点外k+1环的控制点集作为边界条件。

 

 

 

 

图:k阶能量方程使得曲面边界满足Ck-1连续

左:k = 1,中:k = 2,右:k = 3

本文为原创,转载请注明出处:http://www.cnblogs.com/shushen

参考文献:

[1] Mario Botsch and Leif Kobbelt. 2004. An intuitive framework for real-time freeform modeling. ACM Trans. Graph. 23, 3 (August 2004), 630-634.

时间: 2024-11-05 15:55:47

高阶Laplace曲面形变算法(Polyharmonic Deformation)的相关文章

chapter5.1高阶函数

高阶函数 函数在Python中是一等公民 函数也是对象,可调用对象 函数可以做为普通变量.参数.返回值等 数学概念y = g(f(x)) 在数学和计算机科学中,高阶函数要满足至少一个以下的条件 接收一个或多个函数 输出一个函数,最多一个,不能多 def counter(base): def inc(step = 1): nonlocal base base += step return base return inc s1 = counter(5) s2 = counter(5) 比较两个函数,

网格形变算法(Laplacian-Based Deformation)

网格上顶点的Laplace坐标(均匀权重)定义为:,其中di为顶点vi的1环邻域顶点数. 网格Laplace坐标可以用矩阵形式表示:△=LV,其中,那么根据网格的Laplace坐标通过求解稀疏线性方程组可以得到网格的顶点坐标. 基于网格Laplace形变算法的思想:网格上顶点的Laplace坐标作为网格的细节特征,其在网格形变前后的局部坐标系内不发生变化.Laplace形变问题可以用如下数学优化形式表达,那么问题的关键是如何得到网格形变后的Laplace坐标,或者说是每个顶点Laplace坐标的

阿里云人工智能小Ai是比深度学习更高阶的算法

(上图为阿里云人工智能科学家闵万里) 4月8日,在<我是歌手>的第四季总决赛中,出现了一个不速之客,这就是扬言能预测歌王的阿里云人工智能机器人小Ai.开场前,小Ai预测黄致列夺冠概率第一,尽管最终的歌王是李玟,但小Ai成功预测了前三名. 在了解阿里云人工智能机器人小Ai的基本运作过程后,记者认为小Ai的算法其实已经不仅是深度学习,而是在深度学习之上的更高阶算法,并就此向阿里云人工智能科学家闵万里求证,得到的回复:是的. 小Ai算法高阶在哪里? 尽管阿里云方面没有透露关于小Ai更多算法方面的信息

基于Hadoop2.0、YARN技术的大数据高阶应用实战(Hadoop2.0\YARN\Ma

Hadoop的前景 随着云计算.大数据迅速发展,亟需用hadoop解决大数据量高并发访问的瓶颈.谷歌.淘宝.百度.京东等底层都应用hadoop.越来越多的企 业急需引入hadoop技术人才.由于掌握Hadoop技术的开发人员并不多,直接导致了这几年hadoop技术的薪水远高于JavaEE及 Android程序员. Hadoop入门薪资已经达到了8K以上,工作1年可达到1.2W以上,具有2-3年工作经验的hadoop人才年薪可以达到30万—50万. 一般需要大数据处理的公司基本上都是大公司,所以学

[Node.js] 闭包和高阶函数

原文地址:http://www.moye.me/2014/12/29/closure_higher-order-function/ 引子 最近发现一个问题:一部分写JS的人,其实对于函数式编程的概念并不是太了解.如下的代码片断,常常让他们觉得不可思议: OAuth2Server.prototype.authCodeGrant = function (check) { var self = this; return function (req, res, next) { new AuthCodeG

初学 Python(十二)——高阶函数

初学 Python(十二)--高阶函数 初学 Python,主要整理一些学习到的知识点,这次是高阶函数. #-*- coding:utf-8 -*- ''''' 话说高阶函数: 能用函数作为参数的函数 称为高阶函数 ''' #函数作参 def f(x): return x*x #map函数为内置函数,意思为将第二个参数的list作用到f函数中 #最后的结果为一个list print map(f,[1,2,3,4,5]) #reduce函数为内置函数,意思将第二参数的序列作用到add函数值 #将结

Python 函数式编程--高阶函数Map、Reduce、Filter、Sorted

1.1   高阶函数 变量可指向函数 >>> abs(-10) 10 >>> x = abs    --x指向abs函数 >>> x(-1)      --直接调用x 1 调用abs和调用x完全相同. 函数名也是变量 >>> abs = 10 >>> abs(-10) Traceback (most recent call last): File "<stdin>", line 1,

高阶函数和装饰器

函数式:一种编程范式 纯函数式编程:没有变量,支持高阶函数编程 Python不是纯函数式编程语言,支持高阶函数编程 变量可以指向函数,函数名就是指向函数的一个变量,与普通变量没有区别 高阶函数:能接收函数做参数的函数. map():是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回. def f(x): return x*x print map(f, [1, 2, 3, 4, 5, 6, 7

Python 学习——高阶函数 filter 和 sorted

filter filter函数顾名思义,筛选,通过调用函数进行筛选序列中的满足函数的子项 以实例来说话: 过滤一个序列中所有的偶数,保留奇数 另如下,过滤掉一个序列中的所有空格以及空字符等信息 可以知道,filter函数传入了两个参数,第一个为函数,第二个为序列 sorted 排序也是在程序中经常用到的算法.无论使用冒泡排序还是快速排序,排序的核心是比较两个元素的大小.如果是数字,我们可以直接比较,但如果是字符串或者两个dict呢?直接比较数学上的大小是没有意义的,因此,比较的过程必须通过函数抽