zl程序教程

您现在的位置是:首页 >  .Net

当前栏目

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

2023-02-18 16:43:47 时间

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

2016-10-17 刘崇军 风螺旋线

    一发失效规范文件(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,在半径的基础上增加偏移量以确定外扩或是内收的起点)

参数示意图:

绘制顺时针外扩圆弧的源代码

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);

}
 

微信扫一扫
关注该公众号