0

私が書いたいくつかのコードに少し問題があります。基本的には、絶えず変化する 3 つの値を取得し、累積折れ線グラフの形で経時的にグラフ化します。ステージ全体にこの奇妙な線が引かれ、問題が何であるかを理解できないことを除けば、ほとんど機能します。完全なコードは以下のとおりです。フラッシュに貼り付けて実行できます。

import flash.display.Shape;
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.utils.Timer;

var y1:Array = new Array();
var y2:Array = new Array();
var y3:Array = new Array();
var avg:Array = new Array();

var y1Shape:Shape = new Shape();
var y2Shape:Shape = new Shape();
var y3Shape:Shape = new Shape();
var avgShape:Shape = new Shape();

var container:Sprite = new Sprite();

var scale:uint = 1;

var redrawGraph:int = setInterval(reDraw,500);

var y1Int:int = 0;
var y2Int:int = 0;
var y3Int:int = 0;

container.addChild(y1Shape);
container.addChild(y2Shape);
container.addChild(y3Shape);
container.addChild(avgShape);
this.addChild(container);

function reDraw():void
{
    y1Shape.graphics.clear();
    y2Shape.graphics.clear();
    y3Shape.graphics.clear();
    avgShape.graphics.clear();

    y1Shape.graphics.lineStyle(1, 0x0066FF, 1);
    y1Shape.graphics.beginFill(0x0066FF, 0.5);
    y2Shape.graphics.lineStyle(1, 0x009900, 1);
    y2Shape.graphics.beginFill(0x009900, 0.5);
    y3Shape.graphics.lineStyle(1, 0x990000, 1);
    y3Shape.graphics.beginFill(0x990000, 0.5);
    avgShape.graphics.lineStyle(1, 0x000000, 1);

    y1Int = rand();
    y2Int = rand();
    y3Int = rand();

    trace(y1Int, y2Int, y3Int);

    y1.unshift(y1Int);
    y2.unshift(y2Int);
    y3.unshift(y3Int);
    popOut(y1);
    popOut(y2);
    popOut(y3);

    var i:uint,sum:uint,aLength:uint,len:uint = y1.length,max:int = 0,height_:int = 400;
    scale = 10;
    for (i=0; i<len; i++)
    {
        max = Math.max(y1[i] + y2[i] + y3[i],max);
    }

    for (i=0; i<len; i++)
    {
        sum +=  y1[i] + y2[i] + y3[i];
    }

    avg.unshift(Math.round(sum/len));

    /*--------------------------------MATCHED GRAPH------------------------------------------*/
    var y1_commands:Vector.<int> = new Vector.<int>();
    var y1_coord:Vector.<Number>= new Vector.<Number>();
    var y1_coord_rev:Vector.<Number> = new Vector.<Number>();
    y1_commands.push(1);
    y1_coord.push(400,height_);

    for (i=0; i<len; i++)
    {
        y1_commands.push(2);
        y1_coord.push((400-i*scale),height_-(Math.round((y1[i]/max)*height_)));
        y1_coord_rev.unshift((400-i*scale),height_-(Math.round((y1[i]/max)*height_)));
    }
    for (i=len; i>0; i--)
    {
        y1_commands.push(2);
        y1_coord.push(400 - i*scale,height_);
    }
    y1_commands.push(2);
    y1_coord.push(400,height_);

    /*--------------------------------MATCHED GRAPH------------------------------------------*/

    /*----------------------------------BUSY GRAPH-------------------------------------------*/
    var y2_commands:Vector.<int> = new Vector.<int>();
    var y2_coord:Vector.<Number>= new Vector.<Number>();
    var y2_coord_rev:Vector.<Number> = new Vector.<Number>();
    y2_commands.push(1);
    y2_coord.push(400,height_-(Math.round((y1[i]/max)*height_)));

    for (i=0; i<len; i++)
    {
        y2_commands.push(2);
        y2_coord.push((400-i*scale),height_-(Math.round(((y1[i]+y2[i])/max)*height_)));
        y2_coord_rev.unshift((400-i*scale),height_-(Math.round(((y1[i]+y2[i])/max)*height_)));
    }
    for (i=len; i>0; i--)
    {
        y2_commands.push(2);
        y2_coord.push(400 - i*scale, height_-(Math.round((y1[i]/max)*height_)));
    }
    y2_commands.push(2);
    y2_coord.push(400,height_-(Math.round((y1[i]/max)*height_)));

    /*----------------------------------BUSY GRAPH-------------------------------------------*/

    /*----------------------------------VAC GRAPH-------------------------------------------*/
    var y3_commands:Vector.<int> = new Vector.<int>();
    var y3_coord:Vector.<Number>= new Vector.<Number>();
    var y3_coord_rev:Vector.<Number> = new Vector.<Number>();
    y3_commands.push(1);
    y3_coord.push(400,height_-(Math.round(((y1[i]+y2[i])/max)*height_)));

    for (i=0; i<len; i++)
    {
        y3_commands.push(2);
        y3_coord.push((400-i*scale),height_-(Math.round(((y1[i]+y2[i]+y3[i])/max)*height_)));
        y3_coord_rev.unshift((400-i*scale),height_-(Math.round(((y1[i]+y2[i]+y3[i])/max)*height_)));
    }
    for (i=len; i>0; i--)
    {
        y3_commands.push(2);
        y3_coord.push(400 - i*scale, height_-(Math.round(((y1[i]+y2[i])/max)*height_)));
    }
    y2_commands.push(2);
    y2_coord.push(400,height_-(Math.round(((y1[i]+y2[i])/max)*height_)));

    /*----------------------------------BUSY GRAPH-------------------------------------------*/
    //y3Shape.graphics.drawPath(y3_commands, y3_coord);
    y2Shape.graphics.drawPath(y2_commands, y2_coord);
    y1Shape.graphics.drawPath(y1_commands, y1_coord);

}

function popOut(a:Array):void
{
    if (a.length >=Math.ceil(400/scale))
    {
        a.pop();
    }
}

function rand():int
{
    return Math.floor(Math.random() * (1 + 5 - 0) + 0);
}

y3Shape は、y2Shape の問題が修正されるまでコメント アウトされます (両方を描画すると、問題の把握が難しくなります)。

何が起きているのでしょうか?

ありがとう

4

2 に答える 2

1

の近くにベクトルのトレースを挿入する.drawPathと、次のようなものが表示されます。

trace(y2_commands); // 1,2,2,2,2
trace(y2_coord); // 400,171,400,57,390,NaN,400,171,400,57

つまり、NaN(数値ではない)は、座標の計算にエラーがあることを意味します。

ps。y1[i]ビジーグラフの最初の計算では未定義です

于 2012-09-21T07:34:59.080 に答える
0

beginFill() を使用しているようです。ループしていないパスを描画すると、Flash はパスを何かで埋めるためにループする必要があります。したがって、開始点に行を追加して塗りつぶすことにより、暗黙的にループします。重複しないパスを取得するには、X 軸の 0 ポイントのすぐ下、グラフの最後のポイントのすぐ下、グラフの最初のポイントのすぐ下に 2 つのポイントをパスに追加します。

実はすでに設置しているのですが、なぜか2点ではなく全角で配置していて、その線の高さ位置が明らかに間違っています。あなたのコードは次のように述べています:

for (i=len; i>0; i--)
{
    y2_commands.push(2);
    y2_coord.push(400 - i*scale, height_-(Math.round((y1[i]/max)*height_)));
}

あなたが持っている必要があります:

for (i=len; i>0; i--)
{
    y2_commands.push(2);
    y2_coord.push(400 - i*scale, height_);
}

またはさらに良い:

y2_commands.push(2);
y2_commands.push(2);
y2_coord.push(400 - len*scale, height_);
y2_coord.push(400, height_);
于 2012-09-21T07:40:58.860 に答える