0

時間の経過に伴う満潮と干潮の予測を示す Flex LineChart を作成しました。私は LineSeries を form="curve" で使用しています。これは、経時的な水位を表す素敵な正弦波グラフを生成します。X 軸は時間を表し、Y 軸は水位を表します。処理しなければならないデータ ポイントは満潮と干潮の値だけですが、線に沿った任意の x 値の y 値を決定する方法を見つけたいと思います。

たとえば、次のデータ ポイントがあるとします。

var highLowTidePredictions:ArrayCollection = new ArrayCollection( [
     { Date: new Date(2010, 1, 26,  7, 15), waterLevel: 20.3 },
     { Date: new Date(2010, 1, 26, 13, 15), waterLevel: -1.2 },
     { Date: new Date(2010, 1, 26, 19, 15), waterLevel: 19.0 },
     { Date: new Date(2010, 1, 27,  1, 15), waterLevel: -1.0 },
     { Date: new Date(2010, 1, 27,  7, 15), waterLevel: 18.7 },
     { Date: new Date(2010, 1, 27, 13, 15), waterLevel:  0.7 } 
]);

これが私の折れ線グラフです:

<mx:LineChart id="highLowLinePredictionsLineChart"
    width="100%" height="100%"
    dataProvider="{highLowTidePredictions}" 
    showDataTips="true">

    <mx:horizontalAxis>
            <mx:DateTimeAxis id="dta" />
    </mx:horizontalAxis>
    <mx:series>
            <mx:LineSeries id="lineSeries1" 
                   xField="Date" yField="waterLevel" 
                   form="curve" interpolateValues="true" sortOnXField="true"/>
    </mx:series>
</mx:LineChart>

waterLevelそして、2010 年 2 月 26 日 09:00 の時刻を知りたいです。

できたらかっこいいな

var date:Date = new Date(2010, 1, 26, 9, 0);
var waterLevel:Number = lineSeries1.getYValue(date);

しかし、残念ながらそのgetYValue(xValue)機能は存在しません。

4

2 に答える 2

1

LineSeries の補間プロパティは、最初と最後の値の間のギャップを埋めます。しかし、あなたの質問によれば、先に見積もって曲線を延長しようとしているようです。この場合、補間は機能しません。

水位データの推定に適した回帰モデルを見つけ、それを適用して曲線上のより多くのポイントを導き出すことをお勧めします。私の限られた経験から、スプライン モデルと呼ばれる加重データ ポイントに依存するモデルをお勧めできます。ただし、私は統計学者ではないため、推定モデルの推奨事項について間違っている可能性があります。

于 2010-02-27T06:27:07.023 に答える
0

わかりました、私はそれを理解しました。11 年生の数学の授業に戻らなければなりませんでした。

興味のある人のために、私が思いついた機能は次のとおりです。

満潮 (または干潮)のw1単位が でdate1、次の干潮 (または満潮)のw2単位がdate2の場合、次の関数は の水位wを返しますdate

private function getWaterLevel(date:Date, date1:Date, date2:Date, w1:Number, w2:Number):Number
{
    var t:Number = date.getTime();
    var t1:Number = date1.getTime();
    var t2:Number = date2.getTime();

    var A:Number = (w2 - w1) / 2;
    var B:Number = 2 * (t2 - t1);
    var C:Number = t1 + ((t2 - t1) / 2);
    var D:Number = w1 + ((w2 - w1) / 2);
    return A * Math.sin( ((2 * Math.PI)/B) * (t - C)) + D;  
}
于 2010-02-27T22:38:09.643 に答える