代码之家  ›  专栏  ›  技术社区  ›  echo

flex lineseries-沿曲线查找y值

  •  0
  • echo  · 技术社区  · 15 年前

    我创建了一个灵活的折线图,显示随着时间推移的涨潮和落潮预测。我使用的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) 函数不存在。

    2 回复  |  直到 15 年前
        1
  •  1
  •   Sri    15 年前

    lineseries的interpolate属性将填充第一个值和最后一个值之间的间隙。然而,从你的问题看来,你是在寻求通过提前估计来扩展曲线。在这种情况下,插值将不起作用。

    我建议找到一个合适的水位数据估计回归模型,并应用它在曲线上得到更多的点。根据我有限的经验,我可以推荐一个依赖于加权数据点的模型,称为样条模型。然而,我不是统计学家,可能对估算模型的建议有错误。

        2
  •  0
  •   echo    15 年前

    好吧,我知道了。刚上完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;  
    }