我遇到了从给定网格(形状)中获取主曲率的问题。
我正在尝试使用Matlab文件交换中的'patchcurvature'方法。然而,该方法总是给出正曲率。我认为可能是该方法将网格视为单独的补丁,并计算每个补丁的主曲率。 [〜,〜,方向1,Dir2中,PrincipalCurvature1,PrincipalCurvature1] = patchcurvature(meshFaceVertices);
我还尝试使用另一种名为'surfature'的Matlab文件交换方法;然而,它计算由表面上的三个2D点阵列定义的“表面”的主曲率。我不确定如何使用由顶点和面定义的现有网格创建具有2D点阵列的“曲面”。有一些方法将表面转换为网格,但不是相反...
任何想法都将不胜感激。非常感谢和新年快乐!!!
最佳, 甲
答案 0 :(得分:3)
Principal curvatures,如果我没有错过不同的定义,则在可微分的曲面上定义,但网格(通常是三角形的集合)是不可微分的。我可以想象一些可能的近似主曲率的方法。
假设您的网格是通过从可微表面采样获得的,那么您需要做的是polynomial regression,更具体地说,quadratic interpolation在您尝试计算曲率的点周围的附近顶点上。 / p>
首先,您需要确定您感兴趣的点的法线向量。法向量可以通过网格三角形的法线方向(AB×AC,交叉产生三角形的两个边)获得,并用其他一些法向量进行插值。
找到法线向量后,可以变换网格的坐标,使点位于原点,法线向量指向z轴。 (具有沿z轴以角度θ旋转的参数)
然后你的下一个目标是找到一个表面
1 1 z = --- alpha * x^2 + --- beta * y^2 2 2
最接近你的点集,有三个参数alpha,beta和theta。
然后alpha和beta是主要成分。
我不确定,但已经有一个matlab函数可以为你做回归。
答案 1 :(得分:0)
作为Iyomis的替代方案,可能对您的问题不太具体,但在一般情况下可能有用:您可以计算切线平面,给定您的网格法线,在给定点,投影相邻顶点的法线(或者更好的是平面法线和相邻法线之间的插值到那个平面上,然后只对结果点使用主成分分析。
嗯,它不完全是主曲率,但它是一个很好的近似值。我相信pcl(http://pointclouds.org)库使用类似的主要曲率实现。
答案 2 :(得分:0)
为什么不按定义去做,而是去做。对于Z的含义,其中z是描述表面高度的XY网格。
[Fx,Fy] = gradient(Z);
[Fxx,~] = gradient(Fx);
[~,Fyy] = gradient(Fy);
curv_norm=abs(Fxx.*Fyy-Fxy.^2);
normeliztion_size_mat = (1+Fx.^2+Fy.^2).^2;
normelized_size_mat=curv_norm/normelization_size_mat;