zoukankan      html  css  js  c++  java
  • 性能分析中看到螺旋线的影子

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

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

    微信扫一扫
    关注该公众号

  • 相关阅读:
    分析java程序的命令总结jps,jstack
    Tomcat配置详解及tomcat的连接数与线程池
    Go入门练习题
    WebSocket的原理,及如何测试websocket是否连接成功
    day3-每天进步一点基础知识-正则练习题
    day2-每天进步一点基础知识
    day1-每天进步一点
    数组有没有length()这个方法? String有没有length()这个方法?
    List, Set, Map是否继承自Collection接口?
    启动一个线程是用run()还是start()?
  • 原文地址:https://www.cnblogs.com/windspiral/p/7860633.html
Copyright © 2011-2022 走看看