本文转自知乎计算离散点的曲率(附Python, MATLAB代码)
在很多学科中的很多计算任务中都需要用到曲线的曲率(或者曲率半径),numpy库里和matlab build-in里都没有现成的能从离散点来算曲率的方法,网上找到的代码又不敢直接用,毕竟是要高频率用到自己科研上的工具,所以决定结合找到的资料自己推一下,并造出python和matlab的轮子,造福后人
公式很简单:
曲率:
![](https://img-blog.csdnimg.cn/20210727105518904.png)
在二维情况下,其标量形式为:
![](https://img-blog.csdnimg.cn/20210727105534379.png)
所以对于解析情况非常简单,可以直接对于曲线表达式进行解析求导,但是对于离散的点,情况反倒会比较复杂,因为这里的x和y的一阶和二阶导数如果直接用差分方法来计算的话会造成比较大的误差。
这里比较保险的做法是,使用三个点确定的二次曲线的的曲率作为我们估计的曲率:
![](https://img-blog.csdnimg.cn/img_convert/0f07fb946016846c11e032226050616b.png)
然后使用中间这个点(x2,y2)处的曲率作为这三个点的曲率估计
具体方法是先表示成参数方程的样子,
对于曲线参数t,有:
![](https://img-blog.csdnimg.cn/2021072710555795.png)
6个未知数,三个点里有6个已知分量,列六个方程,解出这 (a1,a2,a3), (b1,b2,b3)即可。
这里使用两段矢量的长度来作为取值范围:
![](https://img-blog.csdnimg.cn/20210727105609588.png)
这里我们希望参数方程中的t满足如下条件:
![](https://img-blog.csdnimg.cn/20210727105618394.png)
则有:
![](https://img-blog.csdnimg.cn/20210727105626703.png)
以及
![](https://img-blog.csdnimg.cn/20210727105637250.png)
写成矩阵形式:
![](https://img-blog.csdnimg.cn/20210727105645234.png)
以及
![](https://img-blog.csdnimg.cn/20210727105654311.png)
简写为:
![](https://img-blog.csdnimg.cn/20210727105701564.png)
可以使用求矩阵逆的方式求解线性方程:
![](https://img-blog.csdnimg.cn/20210727105707577.png)
有了(a1,a2,a3)和(b1,b2,b3)就有了曲线的解析方程,接下来就和解析求曲率一样了,先算变量导数:
![](https://img-blog.csdnimg.cn/20210727105715112.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTM5OTExMQ==,size_16,color_FFFFFF,t_70)
然后就是最终的曲率:
![](https://img-blog.csdnimg.cn/2021072710572385.png)
这样,任意给定三个点,都可以估计出这三个点是比较【弯的】还是比较【直的】,直的曲率小,van的曲率大。
随手生成两个例子算算:
(1)圆形:
![](https://img-blog.csdnimg.cn/img_convert/007e1c55f44cf67b75839f9cba2a3a11.png)
好理解,圆形所有地方都是一样弯
(2)正弦
![](https://img-blog.csdnimg.cn/img_convert/9b62eea3216822da92aca833d7326837.png)
波峰和波谷最弯,0点附近最直。
具体实现源码:
python及matlab实现源码
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)