性能分析中看到螺旋线的影子
性能分析中看到螺旋线的影子
一发失效规范文件(AC-121-FS-2014-123)中提到,转弯区应按照12.5%的外扩率,对保护区进行外扩。规范中未明确指定外扩时的基准圆弧,因此在理解上就有多种情况出现。比如以转弯区外边界圆弧为基准外扩,以转弯区标称圆弧外扩,及以转弯区内边界圆弧外扩。粗略来想,以内边界内收、外边界外扩保护区范围应该最大了,但真实的情况是怎样的呢?
通过软件模拟,可以得到下面这张图形:
由于外扩的距离与基准圆弧的长度成正比关系,所以,半径越大,收敛或是外扩的效果越显著。
于是可以看到,以外边界圆弧为基准外扩时,外部范围最大。而以标称圆弧为基准内收时得到的内部范围,比内边界弧内收后的范围要大。
若以内、外弧分别去外扩,与之相对的以标称圆弧外扩,保护区整体有内收的趋势。从简化计算、统一标准的角度来考虑,直接以标称圆弧为基准进行保护区计算更符合规范的初衷。若真是遇到环境较为苛刻的情况,全部以外边界圆弧为基准来计算外扩范围,得到的范围将是最大的。
等距离外扩是螺旋线的典型特征,而这里绘制出的内、外边界,实际上正是阿基米德螺旋线(不是风螺旋线)的一个局部区间。
设转弯速度为V,转弯半径为r,外扩速度为v,根据比率关系,转弯一周(360°)所用时间(t)为:
t = 2*Pi*r/V
外扩距离(s)等于:
S = 0.125*2*Pi*r
外扩速度:
v= s/t = (0.125*2*Pi*r)/(2*Pi*r/V) =
0.125*V
由以上计算可知,这里的阿基米德螺旋线外扩速度是基圆旋转速度的0.125倍。相当于考虑了0.125倍的真空速大小的正侧风,持续不断的向外(或向内)对转弯飞机进行影响。
以标称转弯弧为基准弧进行外扩的另一个好处是,在以25%比率内收时,可以有统一的内收位置,具体如下图所示:
上图中转弯开始时并未达到900米的半宽,所以初始段按12.5%外扩。到达半宽900米外,假定仍在转弯过程中,外边界需要继续外扩,直至取得航迹引导的一点为止。
初始转弯时的半宽为900米的情况如下图所示:
初始半宽为900米的情况下,整体结构看起来略简单一些。转弯角度累积较多以后,整个图形看起来会有些奇怪,请大家多多指教。
附赠一段定制圆弧的函数代码(ActionScript3.0格式),欢迎改编、移植。
参数说明:
pen:Graphics绘图对象(提供一个画板)
r:Number标称转弯半径
startAng:Number起始转弯角度(0~360度)
endAng:Number结束转弯的角度(0~360度)
expandRate:Number指定的外扩率(0:圆弧,12.5%:外扩 -12.5%:内收)
offset:Number偏移量(-900~900,在半径的基础上增加偏移量以确定外扩或是内收的起点)
参数示意图:
绘制顺时针外扩圆弧的源代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | public function drawOffsetArc(pen:Graphics,r: Number , startAng: Number , endAng: Number , expandRate: Number , offset: Number ) : void { //startAng and endAng’s value should between 0 ~ 360 if (startAng< 0 || startAng> 360 || endAng< 0 || endAng> 360 ) return ; if (endAng<startAng) { endAng += 360 ; } var rad: Number = Math.PI/ 180 ; var R: Number = r + offset; //实际的半径 var pt:Point = new Point(R*Math.cos(startAng*rad) , R*Math.sin(startAng*rad)); pen.moveTo(pt.x, pt.y); for ( var i: Number = 0 ; i<endAng-startAng; i += 3 ) { R = r + offset + expandRate*(i ) * r * rad; pt.x = R * Math.cos((startAng +i) * rad); pt.y = R * Math.sin((startAng+i) * rad); pen.lineTo(pt.x, pt.y); } R = r + offset + expandRate * (endAng-startAng) * r * rad; //外扩终点的半径 pt = new Point(R * Math.cos(endAng* rad), R * Math.sin(endAng * rad)); //外扩区的终点 pen.lineTo(pt.x, pt.y); } |
微信扫一扫
关注该公众号
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律