性能分析中看到螺旋线的影子

性能分析中看到螺旋线的影子

刘崇军 风螺旋线

    一发失效规范文件(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);
 
}
 

微信扫一扫
关注该公众号

posted @   刘崇军  阅读(407)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示