基于python计算曲线的曲率

这篇具有很好参考价值的文章主要介绍了基于python计算曲线的曲率。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


最近需要对曲线的曲率做一个粗略的估计,在此记录下。其实计算曲率就是为了求这段弧长对应的半径,也就是说,我们把曲线看成圆的弧长就行,那么问题就简单了。

一、实现原理

1.1、计算点到直线的距离——海伦公式

如下图所示,要计算A到CB的长度。

基于python计算曲线的曲率

Δ \Delta ΔABC的三条边分别为a,b,c,那么海伦公式计算面积S如下:
S = p ( p − a ) ( p − b ) ( p − c ) 其 中 : p = 1 2 ( a + b + c ) S=\sqrt{p(p-a)(p-b)(p-c)} \\ 其中: p=\frac{1}{2}(a+b+c) S=p(pa)(pb)(pc) :p=21(a+b+c)
将p带入海伦公式,得:
S = 1 4 ( a + b + c ) ( a + b − c ) ( a + c − b ) ( b + c − a ) S=\frac{1}{4}\sqrt{(a+b+c)(a+b-c)(a+c-b)(b+c-a)} S=41(a+b+c)(a+bc)(a+cb)(b+ca)
如下图所示,AD是A到直线BC的距离,即是AD是 Δ \Delta ΔABC边BC上的高
基于python计算曲线的曲率

S = a ∗ A D 2 S=\frac{a*AD}{2} S=2aAD
即:
1 4 ( a + b + c ) ( a + b − c ) ( a + c − b ) ( b + c − a ) = a ∗ A D 2 \frac{1}{4}\sqrt{(a+b+c)(a+b-c)(a+c-b)(b+c-a)}=\frac{a*AD}{2} 41(a+b+c)(a+bc)(a+cb)(b+ca) =2aAD

合并可以得:
A D = 1 2 a ( a + b + c ) ( a + b − c ) ( a + c − b ) ( b + c − a ) AD=\frac{1}{2a}\sqrt{(a+b+c)(a+b-c)(a+c-b)(b+c-a)} AD=2a1(a+b+c)(a+bc)(a+cb)(b+ca)

1.2、弓高和弦长计算半径

如图所示,我们已知了弦长L和弓高H,需要求R。我们可以根据三角形得勾股定理求得。

基于python计算曲线的曲率

对于直角三角形OPQ,OP=R-H,OQ=R,PQ= L 2 \frac{L}{2} 2L,那么计算如下:
R 2 = ( L 2 ) 2 + ( R − H ) 2 R 2 = L 4 4 + R 2 − 2 R H + H 2 2 R H = L 4 4 + H 2 R = L 2 4 + H 2 2 H R^{2}=(\frac{L}{2})^{2}+(R-H)^{2} \\ R^{2}= \frac{L^{4}}{4}+R^{2}-2RH+H^{2} \\ 2RH=\frac{L^{4}}{4}+H^{2} \\ R=\frac{\frac{L^{2}}{4}+H^{2}}{2H} R2=(2L)2+(RH)2R2=4L4+R22RH+H22RH=4L4+H2R=2H4L2+H2

二、python实现曲率计算

import numpy as np
def get_arc_curve(pts):
	'''
	获取弧度值
	:param pts:
	:return:
	'''

	# 计算弦长
	start = np.array(pts[0])
	end = np.array(pts[len(pts) - 1])
	l_arc = np.sqrt(np.sum(np.power(end - start, 2)))

	# 计算弧上的点到直线的最大距离
	# 计算公式:\frac{1}{2a}\sqrt{(a+b+c)(a+b-c)(a+c-b)(b+c-a)}
	a = l_arc
	b = np.sqrt(np.sum(np.power(pts - start, 2), axis=1))
	c = np.sqrt(np.sum(np.power(pts - end, 2), axis=1))
	dist = np.sqrt((a + b + c) * (a + b - c) * (a + c - b) * (b + c - a)) / (2 * a)
	h = dist.max()

	# 计算曲率
	r = ((a * a) / 4 + h * h) / (2 * h)

	return r


if __name__ == '__main__':
	x = np.linspace(1, 100, 99).astype(np.int64)
	y = (x ** 2)
	xy = list(zip(x, y))  # list of points in 2D space
	print(get_arc_curve(xy))

参考连接:

有弦长弓高怎么算半径

【编程】快速计算点到直线距离,不用点斜式

OpenCV:简单计算曲线弧度-弓形弧度文章来源地址https://www.toymoban.com/news/detail-400009.html

到了这里,关于基于python计算曲线的曲率的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 自动驾驶道路曲率计算

    车道曲率和中心点偏离距离计算 知道车道曲率计算的方法 知道计算中心点偏离距离的计算 曲线的曲率就是针对曲线上某个点的切线方向角对弧长的转动率,通过微分来定义,表明曲线偏离直线的程度。数学上表明曲线在某一点的弯曲程度的数值。曲率越大,表示曲线的弯曲

    2024年02月09日
    浏览(37)
  • 基于PostGIS的曲线拐点计算

    在这篇博文中,我将介绍一种查找曲线拐点的方法。 一个简单的理解方式:将曲线想象成我们正在行驶的道路,我们想要找到我们停止右转并开始左转或反之的点,如下所示: 我们将展示解决方案的草图和 PostGIS 中的实际实施。 我认为这是一个很好的展示在数据库中实现

    2024年02月04日
    浏览(39)
  • PCL 计算点云法向量与表面曲率(C++详细过程版)

      计算点云法向量和表面曲率是PCL里的经典算法之一,具体算法原理和实现代码见:PCL 计算点云法向量并显示。为充分了解算法实现的每一个细节和有待改进的地方,使用C++代码对算法实现过程进行复现。 注意: PCL中的算法邻域搜索只能是K近邻搜索或半径搜索,无法实现

    2024年02月12日
    浏览(39)
  • MATLAB 自定义实现点云法向量和曲率计算(详细解读)(64)

    首先说明: ------这里代码手动实现,不调用matlab提供的法向量计算接口,更有助于大家了解法向量和曲率的计算方法,步骤清晰,属于点云处理的深入,相信如何从点云坐标得到每个点的法向量和曲率会在看完代码后完全了解,进而即使用别的语言也能完全按照这个步骤实现

    2024年04月14日
    浏览(36)
  • 【数值计算方法】曲线拟合与插值:Lagrange插值、Newton插值及其python/C实现

    目录 一、近似表达方式 插值(Interpolation) 拟合(Fitting) 投影(Projection) 二、插值 1. Lagrange插值 Lagrange插值公式 线性插值(n=1) 抛物插值(n=2) python实现 C语言实现 2. Newton插值 python实现 C语言实现         插值、拟合和投影都是常用的近似表达方式,用于对数据或函数进

    2024年02月02日
    浏览(45)
  • 基于python开发实现数学中各种经典曲线的可视化

    今天正好有点时间就想着把之前零星时间里面做的一点小东西整合一下梳理出来,本文的核心目的就是想要基于python来开发实现各种有趣的数学曲线的可视化展示。 笛卡尔心形线是一种二维平面曲线,由法国数学家笛卡尔在17世纪提出。它得名于其形状类似于传统的心形符号

    2024年02月10日
    浏览(46)
  • python 数据、曲线平滑处理——基于Numpy.convolve实现滑动平均滤波——详解

    滑动平均滤波法 (又称: 递推平均滤波法 ),它把连续取N个采样值看成一个队列 ,队列的长度固定为N ,每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据(先进先出原则) 。把队列中的N个数据进行算术平均运算,就可获得新的滤波结果。 N值的选取:流量,N=

    2024年02月09日
    浏览(50)
  • 【Python_PyQtGraph 学习笔记(六)】基于GraphicsLayoutWidget 实现 曲线对象PlotDataItem 隐藏功能

    通过GraphicsLayoutWidget 可以绘制多条曲线。如果绘制多条曲线后,既想保存多条曲线的数据,又想显示其中一条曲线或几条曲线应该如何实现呢? 首先想通过GraphicsLayoutWidget 类提供的方法实现,但是PlotItem图形对象和PlotDataItem曲线对象都没有提供曲线的隐藏方法; 通过查看其源

    2023年04月08日
    浏览(56)
  • 曲线生成 | 基于多项式插值的轨迹规划(附ROS C++/Python/Matlab仿真)

    🔥附C++/Python/Matlab全套代码🔥课程设计、毕业设计、创新竞赛必备!详细介绍全局规划(图搜索、采样法、智能算法等);局部规划(DWA、APF等);曲线优化(贝塞尔曲线、B样条曲线等)。 🚀详情:图解自动驾驶中的运动规划(Motion Planning),附几十种规划算法 多项式插值(polynomial

    2024年02月03日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包