100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > 基于python计算曲线的曲率

基于python计算曲线的曲率

时间:2023-05-08 00:49:17

相关推荐

基于python计算曲线的曲率

文章目录

一、实现原理1.1、计算点到直线的距离——海伦公式1.2、弓高和弦长计算半径二、python实现曲率计算

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

一、实现原理

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

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

设Δ\DeltaΔABC的三条边分别为a,b,c,那么海伦公式计算面积S如下:

S=p(p−a)(p−b)(p−c)其中:p=12(a+b+c)S=\sqrt{p(p-a)(p-b)(p-c)} \\ 其中: p=\frac{1}{2}(a+b+c) S=p(p−a)(p−b)(p−c)​其中:p=21​(a+b+c)

将p带入海伦公式,得:

S=14(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+b−c)(a+c−b)(b+c−a)​

如下图所示,AD是A到直线BC的距离,即是AD是Δ\DeltaΔABC边BC上的高

S=a∗AD2S=\frac{a*AD}{2} S=2a∗AD​

即:

14(a+b+c)(a+b−c)(a+c−b)(b+c−a)=a∗AD2\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+b−c)(a+c−b)(b+c−a)​=2a∗AD​

合并可以得:

AD=12a(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+b−c)(a+c−b)(b+c−a)​

1.2、弓高和弦长计算半径

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

对于直角三角形OPQ,OP=R-H,OQ=R,PQ=L2\frac{L}{2}2L​,那么计算如下:

R2=(L2)2+(R−H)2R2=L44+R2−2RH+H22RH=L44+H2R=L24+H22HR^{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+(R−H)2R2=4L4​+R2−2RH+H22RH=4L4​+H2R=2H4L2​+H2​

二、python实现曲率计算

import numpy as npdef 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_arcb = 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 rif __name__ == '__main__':x = np.linspace(1, 100, 99).astype(np.int64)y = (x ** 2)xy = list(zip(x, y)) # list of points in 2D spaceprint(get_arc_curve(xy))

参考连接:

有弦长弓高怎么算半径

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

OpenCV:简单计算曲线弧度-弓形弧度

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。