基于python计算曲线的曲率

本文介绍了如何使用Python计算曲线的曲率,主要涉及海伦公式计算点到直线的距离以及通过弓高和弦长计算半径的方法。通过这些原理,可以对曲线进行弧度的粗略估计。文章提供了具体的Python实现代码,用于计算给定点集上曲线的曲率。
摘要由CSDN通过智能技术生成


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

一、实现原理

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

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

在这里插入图片描述

Δ \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上的高
在这里插入图片描述

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。我们可以根据三角形得勾股定理求得。

在这里插入图片描述

对于直角三角形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:简单计算曲线弧度-弓形弧度

Python计算河流曲率可以使用地理信息系统(GIS)库,例如Geopandas和Shapely。以下是一种计算河流曲率的方法: 1. 首先,你需要准备河流的地理数据,通常以矢量文件(如Shapefile)的形式存储。你可以使用Geopandas库来读取和处理这些数据。 2. 读取河流数据后,你可以使用Shapely库来计算河流的曲率曲率是指曲线在某一点处的弯曲程度。 3. 首先,你需要将河流线转换为点集。可以通过将河流线分割成一系列点来实现,这些点可以代表河流的一小段。 4. 对于每个点,你可以使用Shapely库中的`curvature`函数来计算曲率。该函数返回一个表示曲率的值,可以用来衡量河流在该点处的弯曲程度。 5. 最后,你可以将计算得到的曲率值与相应的点进行关联,并进行进一步的分析或可视化。 下面是一个示例代码,演示了如何使用Geopandas和Shapely库计算河流曲率: ```python import geopandas as gpd from shapely.geometry import LineString # 读取河流数据 river_data = gpd.read_file('river.shp') # 将河流线转换为点集 river_points = [] for line in river_data['geometry']: points = list(line.coords) river_points.extend(points) # 计算曲率 curvatures = [] for i in range(1, len(river_points)-1): prev_point = river_points[i-1] curr_point = river_points[i] next_point = river_points[i+1] line = LineString([prev_point, curr_point, next_point]) curvature = line.curvature curvatures.append(curvature) # 将曲率值与点进行关联 river_data['curvature'] = [None] + curvatures + [None] # 输出结果 print(river_data[['geometry', 'curvature']]) ``` 请注意,以上代码仅为示例,实际使用时需要根据具体的数据格式和需求进行适当的修改。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值