我尝试从脉冲曲线上提取其曲率(如下图所示)。该脉冲是在一个长度和高度为150x100单元格的网格上使用C++实现的有限差分计算得出的。
我提取了所有具有相同值(等高线/级别集)的点,并在下面的图中将它们标记为红色连续线。其他颜色可以忽略。
然后,我尝试通过以下方式从已经很嘈杂(由于网格离散化)的轮廓线中找到曲率:
(已应用移动平均)
1) 通过切线计算曲率
点P处的曲线曲率定义为:
因此,曲率是delta角度与P和N之间的弧长之比的极限。由于我的点之间有一定距离,我无法足够近似极限,因此曲率无法正确计算。我用圆测试了它,圆自然具有恒定曲率。但我无法重现这个结果(只有1位有效数字是正确的)。
2) 使用弧长参数化的线的二阶导数
我根据弧长对线进行了一阶导数计算,并应用了移动平均平滑,然后再次进行了导数计算(2阶导数)。但是,在这里我也只得到了1个有效数字的正确结果。不幸的是,求导数会将已有的噪声扩大到更高的水平。
3) 在局部使用圆来逼近曲线
由于圆的半径倒数是曲率,我采用了以下方法:
到目前为止,这是最好的方法(2个正确有效数字),但我需要进一步改进。所以我的新想法如下:
不再使用离散点处的值来确定曲率,而是想用三维样条曲面来近似脉冲轮廓。然后从中提取某个特定值的等值集以获得平滑的点线,从中可以找到一个好的曲率。
到目前为止,我找不到一个可以生成这样的Bezier样条曲面的C++库。你能帮我指路吗?
你认为这种方法值得一试吗?还是说我在曲率上会失去太多精度?
你知道其他方法吗?
谢谢您的耐心帮助!
编辑:看起来我不能作为新用户发布图片,所以我从问题中删除了所有图片,尽管我认为它们很重要来解释我的问题。有没有什么办法可以让我仍然展示它们呢?
编辑2:好的,搞定了 :)