风螺旋公切线算法详解

风螺旋公切线算法详解

2017-12-29 刘崇军 风螺旋线

好久不见,近来一切可好?2017年最后这段时间里,狂补了一把C#,希望未来能够从软件代码层面实现风螺旋算法的验证与推广。今天跟大家分享的这个话题的底图就是最近一段时间的学习成果:一个基于WPF架构的非常简单的绘图框架,以及对风螺旋的自动化绘制进行的实现。闲话少叙,开始今天的主题。

在掌握了风螺旋切线计算的基础上,就可以开始公切线算法的研究了。公切线的计算是飞行程序模板中非常关键的一项内容,因此,在开始模板算法分享之前,详细回顾一下公切线的算法是非常有必要的。

风螺旋公切线计算首先是基于以下4个基础设定:

/// 1. 同一程序模块内,转弯基础参数相同。无论是程序转弯、还是等待模板,在同一个ICAO标准模板中,转弯参数是相同的,即转弯半径是相同的。

/// 2. 风螺旋的切线与Esita方向相垂直。之前从原理及数学软件上对此项内容进行了证明,这是公切线的一个基础条件。

/// 3. Esita方向与对应的基准圆半径之间的夹角恒等于偏流角DA。ICAO DOC8168中的配图明确标注了此项内容DA= arcsin(w/v)。

/// 4. Esita的大小与sita角度可以互相换算。距离可以换算成旋转角度,反之旋转的角度可以换算为对应的距离。这是本公众号中多次提及的一个基本概念。风螺旋是假想的航空器的飞行轨迹,对这个轨迹整体进行旋转时,它的外扩规律符合按照Esita方向等距离外扩的特性,外扩的大小与旋转过的角度有直接的换算关系。

除以上4个基础设定以外,公切线计算中按照个人偏好使用了以下的标识来表示风螺旋的参数(如图1所示):

图1 风螺旋参数示意图

rotation: 从系统的零度旋转至风螺旋起点的角度。航空地图中采用的是磁北为零度,计算机系统中多数以水平向右为零度的起点,顺时针角度增大为默认条件。

offset:表示外扩距离的一个量。对于一个风螺旋来说,外扩和旋转角度可以互相换算,因此,最佳方案是对每一个风螺旋都设定一个初始的系统角度(rotation)和一个初始的外扩距离(offset)。

sita:用来表示从风螺旋起点开始实际的转弯角度。通过该角度可以换算出从起点开始一共外扩了多少距离,或者用来表示风螺旋中的某个具体位置点。

Esita:与sita角相对应的外扩距离。这个Esita的方向与对应半径的延长线之间的夹角为偏流角DA,与该位置处风螺旋切线的夹角为90度。

为了更清晰的表示计算关系,对图1中的关键点进行编号得到图2的内容:

图2  风螺旋公切线的角度关系

图2中绘制了两条实心的风螺旋线ws1和ws2,以及与它们对应的无外扩的虚线风螺旋。虚线风螺旋与圆周的交点视为风螺旋的实际起始角度。旋转与外扩可以相互换算,因此可知,实线风螺旋与虚线风螺旋之间是“等距平行”关系。

由于Esita与风螺旋的切线相垂直(基础设定2),因此,若两个风螺旋之间存在有公切线,则必定分别有两个Esita与公切线相垂直,如图1中的Esita1和Esita2,它们二者为平行关系。

由于两个Esita与对应的半径Radius之间夹角固定为偏流角DA(基础设定3),因此可知对应半径之间为平行关系。因为,两条风螺旋的基础参数是相同的,因此,两个半径是相等的。于是图2中的abcd是一个平行四边形。从d点向fc边做垂线,得到垂足e点,可知defg是一个矩形。

ws2风螺旋在公切点位置处的Esita可以分成两部分,EsitaA和EsitaB,前者与ws1中的外扩距离是相等的,后者产生的原因是两条风螺旋初始条件的差异所造成。若每弧度可以外扩的距离为Edist,则EsitaB可表示为offset2
- offset1 + (rotation1-rotation2) *
Edist,即初始外扩距离之差,加上初始角度之差所换算成的外扩距离,就构成了图2中的EsitaB。图2中的EsitaA可视为两条风螺旋共同旋转过的角度所形成的距离,因为外扩的效率是相同的,相同的外扩角度可以得到相同的外扩距离。rotation1-rotation2这个公式是浪费了两天多的时间才最终纠错纠出来的,之前在Flash系统中不存在此问题,C#中的绘图系统真是复杂许多。rotation1-rotation2代表了以rotation2为基准角度,初始的角度差值。

具体的计算步骤如下:

1、放置风螺旋,计算dc线的角度。

当我们向屏幕中放置一条风螺旋时,它的中心点位置就可视为一个已知条件。设两个中心点坐标分别为c1(x,y),c2(x,y),那么,线段ab在软件系统中的角度为:

arctan((c2.y-c1.y)/(c2.x-c1.x)),这里需要用到反正切函数,获得一个角度值,称之为基准线角度,用baseLineAngle来表示,圆心点间的距离用distance来表示。dc线与ab线平行且相等,因此,baseLineAngle就是dc线的方向。

2、计算dg线的角度。

图2中⊿dce为一个直角三角形,∠cde的值用angle来表示,它等于arcsin(EsitaB/distance)。图2中逆时针方向角度减小,因此可将线段dg的角度表示为:baseLineAngle
– angle - Pi/2 (所有角度值均用弧度来表示),公切线的方向就等于baseLineAngle – angle。

若ws1的外扩距离大于ws2时,angle角的值为负值,位置关系如图3所示:

图3 angle角为负值的情况

此时,∠cdg的值可表示为Pi/2
+ angle(因为angle小于零),线段dg的角度可以表示为baseLineAngle -(Pi/2 +
angle),化简后,得到的公式为baseLineAngle – angle-
Pi/2。与前面讨论的angle大于零时的公式是完全一致的,也就是说不论ws1或ws2外扩距离谁大,dg线的角度始终可以用baseLineAngle
– angle - Pi/2来表示,公切线的角度可以用baseLineAngle– angle来表示。

3、计算dg线的长度。

从dg线的角度反推对应的半径的方向,可采用公式:baseLineAngle
- angle - Pi/2 +
DA(因为Esita与半径的夹角总等于DA)。得到圆周半径方向之后,分别与各自的rotation参数相减,就可以得到风螺旋真实的旋转角度,用这个旋转角度sita换算成外扩距离,再加上初始的外扩距离,就可以得到dg线的长度,角度、长度都知道以后,可以得到准确的切点位置。连接两个切点的坐标,得到的线段即是两条风螺旋线的公切线。

公切线的计算过程就是这样,您get到了没?

另外再附两张公切线的示意图,因为手工条件下真是很难想像公切线会出现在什么地方(以后这个问题将不是问题 :-))

这两张图与前面的图的区别在于:初始的 rotation 大小关系对调了一下,结论完全相同。这就是自动化计算的魅力所在,哈哈哈。



可以预见的未来中,风螺旋线将成为一门新兴的学科,它将与阿基米德螺旋渐开线螺旋共同纳入
等距螺旋
的框架,成为几何课程的一部分,风螺旋相关计算将成为飞行程序设计入门课程的一部分。本公众号将以此为目标持续努力,全面开源共享。期待在不远的将来风螺旋线精确计算方法将成为DOC8168的一部分,并且成为飞行程序领域送给
几何研究领域的一份礼物!

祝大家:新年快乐!

微信扫一扫
关注该公众号

原文地址:https://www.cnblogs.com/windspiral/p/8151080.html

时间: 2024-10-24 14:41:10

风螺旋公切线算法详解的相关文章

并查集算法详解

更好的阅读体验 并查集算法详解 算法详解 维护类型 身为一个数据结构,我们的并查集,它的维护对象是我们的关注点. 并查集适合维护具有非常强烈的传递性质,或者是连通集合性质. 性质详解 传递性质 传递性,也就是具有传递效应的性质,比如说A传递给B一个性质或者条件,让B同样拥有了这个性质或者条件,那么这就是我们所说的传递性. 连通集合性质 连通集合性,和数学概念上的集合定义是差不多的, 比如说A和B同属一个集合,B和C同属一个集合,那么A,B,C都属于同一个集合.这就是我们所谓的连通集合性质. 算法

EM算法(3):EM算法详解

目录 EM算法(1):K-means 算法 EM算法(2):GMM训练算法 EM算法(3):EM算法详解

[转] KMP算法详解

转载自:http://www.matrix67.com/blog/archives/115 KMP算法详解 如果机房马上要关门了,或者你急着要和MM约会,请直接跳到第六个自然段.    我们这里说的KMP不是拿来放电影的(虽然我很喜欢这个软件),而是一种算法.KMP算法是拿来处理字符串匹配的.换句话说,给你两个字符串,你需要回答,B串是否是A串的子串(A串是否包含B串).比如,字符串A="I'm matrix67",字符串B="matrix",我们就说B是A的子串.

[搜索]波特词干(Porter Streamming)提取算法详解(3)

 接上 [搜索]波特词干(Porter Streamming)提取算法详解(2) 下面分为5大步骤来使用前面提到的替换条件来进行词干提取. 左边是规则,右边是提取成功或者失败的例子(用小写字母表示). 步骤1 SSES -> SS                   caresses  ->  caress IES  -> I                          ponies    ->  poni ties      ->  ti SS   -> S

KMP算法详解(图示+代码)

算法过程非常绕,不要企图一次就能看明白,多尝试就会明白一些.下面试图用比较直观的方法解释这个算法,对KMP算法的解释如下: 1. 首先,字符串"BBC ABCDAB ABCDABCDABDE"的第一个字符与搜索词"ABCDABD"的第一个字符,进行比较.因为B与A不匹配,所以搜索词后移一位. 2. 因为B与A不匹配,搜索词再往后移. 3. 就这样,直到字符串有一个字符,与搜索词的第一个字符相同为止. 4. 接着比较字符串和搜索词的下一个字符,还是相同. 5. 直到字

安全体系(三)——SHA1算法详解

本文主要讲述使用SHA1算法计算信息摘要的过程. 安全体系(零)—— 加解密算法.消息摘要.消息认证技术.数字签名与公钥证书 安全体系(一)—— DES算法详解 安全体系(二)——RSA算法详解 为保证传输信息的安全,除了对信息加密外,还需要对信息进行认证.认证的目的有两:一是验证信息的发送者是合法的,二是验证信息的完整性.Hash函数就是进行信息认证的一种有效手段. 1.Hash函数和消息完整性 Hash函数也称为杂凑函数或散列函数,函数输入为一可变长度x,输出为一固定长度串,该串被称为输入x

php 二分查找法算法详解

一.概念:二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好:其缺点是要求待查表为有序表,且插入删除困难.因此,折半查找方法适用于不经常变动而查找频繁的有序列表.首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功:否则利用中间位置记录将表分成前.后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表.重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功. 二.代

【转】AC算法详解

原文转自:http://blog.csdn.net/joylnwang/article/details/6793192 AC算法是Alfred V.Aho(<编译原理>(龙书)的作者),和Margaret J.Corasick于1974年提出(与KMP算法同年)的一个经典的多模式匹配算法,可以保证对于给定的长度为n的文本,和模式集合P{p1,p2,...pm},在O(n)时间复杂度内,找到文本中的所有目标模式,而与模式集合的规模m无关.正如KMP算法在单模式匹配方面的突出贡献一样,AC算法对于

支持向量机(SVM)(五)-- SMO算法详解

一.我们先回顾下SVM问题. A.线性可分问题 1.SVM基本原理: SVM使用一种非线性映射,把原训练            数据映射到较高的维.在新的维上,搜索最佳分离超平面,两个类的数据总可以被超平面分开. 2.问题的提出: 3.如何选取最优的划分直线f(x)呢? 4.求解:凸二次规划 建立拉格朗日函数: 求偏导数: B.线性不可分问题 1.核函数 如下图:横轴上端点a和b之间红色部分里的所有点定为正类,两边的黑色部分里的点定为负类. 设: g(x)转化为f(y)=<a,y> g(x)=