曲率定义与推导

曲率(curvature)

曲率试图去描述你车子拐弯拐的有多急(我的个人观点,不是定义一个数学量就产生了某种概念,而是为了描述一种概念找出一个合理的数学的定义)。(https://zhuanlan.zhihu.com/p/41795324)
在这里插入图片描述

曲率半径

在这里插入图片描述

显示方程
若有显示方程 [公式] ,把x看着参变量t,有

在这里插入图片描述

极坐标方程
在这里插入图片描述
θ \theta θ 看作参变量,代入得
在这里插入图片描述

推导

设道路的函数为
在这里插入图片描述
在这里插入图片描述
我们规定上图中向量 T T T的范数为1,曲率的严格定义为
在这里插入图片描述
规定T向量范数为1是为了保证
在这里插入图片描述
其中T和S都是向量,注意到T是范数为1的切线向量,我们可以这样计算向量T:

因为S’就是S(t)的切线嘛,又有
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述(洛必达法则)
在这里插入图片描述
在这里插入图片描述
最终答案是:
在这里插入图片描述

PCL求取三维点云模型每点曲率

https://blog.csdn.net/GoodLi199309/article/details/80537310

鉴于在实际使用中只需要一些曲率较大的点作为特征点使用(我们这里只研究最大的前800个点),所以在使用PCL库求取所有点的曲率后,我们

  • 首先将其曲率值与其对应的点在点集中的索引值进行结构化存储最终得到一个包含所有点索引与曲率值的集合。
  • 接着应用选择排序特点的逆思想(每一次将最大值放在集合的最开始处)对集合进行排序,为了不影响运行速度,当找到前800个曲率最大值时中断操作。
  • 通过对应的索引值在原始点集中找到这800个曲率值对应的模型点。

高斯曲率和平均曲率


	for (int i = 0; i < cloud_curvatures->size();i++){
		//平均曲率
		//curvature = ((*cloud_curvatures)[i].pc1 + (*cloud_curvatures)[i].pc2) / 2;
		//高斯曲率
		curvature = (*cloud_curvatures)[i].pc1 * (*cloud_curvatures)[i].pc2;
		//@yanyx  记得pcl里求的两个曲率pc1 pc2是用法线的主成分分析得到的,跟书上写的K1 k2这两个曲率是不同的,然后你在求高斯曲率的时候直接把pc1*pc2,这个是不对的吧?
		//pv.cPoint = tempPoint;
		pv.index = i;
		pv.curvature = curvature;
		tempCV.insert(tempCV.end(),pv);
}

曲面上任意一点都有无数个曲率,其中存在最大和最小值。
高斯曲率=最大曲率*最小曲率,(https://www.zhihu.com/question/40412131)
在这里插入图片描述
乘法,把它理解成**‘逻辑与’**,是否两个方向都有弯曲。

高斯曲率的几何意义表示曲面的弯曲程度,是相当重要的内蕴几何量,通过对高斯曲率的值的判断,可以大致分析出曲面上该点的弯曲情况,比如说K大于0说明是椭圆点,K可视作曲面相对球面的弯曲程度。参考文献:彭家贵, 陈卿. 微分几何[M]. 高等教育出版社, 2002.

K = 0 的面: 可展曲面,能够经弯曲(非拉伸、收缩、皱褶或撕裂)而而展开成一片平面
比如柱面
在这里插入图片描述

平均曲率=(最大曲率+最小曲率)/2
在这里插入图片描述
加法,把它理解成‘逻辑或’,是否任意一个方向上有弯曲.
当然值得注意
在这里插入图片描述
也会导致平均曲率为0.

H = 0 的面: 极小曲面, 满足一定的约束条件下表面积最小的曲面,
比如这个鞍面
在这里插入图片描述

代码: 求曲率最大的800个点

vector<PCURVATURE> allCurvates;
//计算模型所有点的曲率(Modelpath为模型所在路径)
allCurvates = getModelCurvatures(Modelpath);
//获取所有曲率中的最大、最小曲率
//选择排序
//找到最大的前800个曲率点
PCURVATURE temp;
int maxIndex = 0;
int count = 0;
for (int i = 0; i < allCurvates.size(); i++){
	float maxCurvature = -99999;
	for (int j = i + 1; j< allCurvates.size(); j++){
		if (maxCurvature<allCurvates[j].curvature){
			maxCurvature = allCurvates[j].curvature;
			maxIndex = j;
		}
	}
	if (maxCurvature>allCurvates[i].curvature){
		temp = allCurvates[maxIndex];
		allCurvates[maxIndex] = allCurvates[i];
		allCurvates[i] = temp;
		count++;
	}
	if (count>800){
		break;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hali_Botebie

文中错误请不吝指正!!!!!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值