2010-02-27 7 views
0

Я создал Flex LineChart, который показывает прогнозы с высоким и низким приливом с течением времени. Я использую LineSeries с формой = «кривая», которая создает хороший синусоидальный волновой график, представляющий уровень воды с течением времени. Ось X представляет собой время, а ось Y представляет собой уровень воды. Единственными точками данных, с которыми я должен работать, являются значения высокого и низкого приливов, но я хотел бы выяснить, как определить значения y произвольных значений x вдоль линии.Flex LineSeries - найти 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 } 
]); 

Вот моя диаграмма Line:

<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 на 26 февраля 2010 в 09: 00.

Было бы здорово, если бы я мог сделать

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

Но увы, что getYValue(xValue) функция не существует.

ответ

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

Интерполированное свойство LineSeries заполнит промежутки между первым и последним значениями. Однако, по вашему вопросу, вы пытаетесь расширить кривую, оценив ее. В этом случае Interpolate не будет работать.

Я бы предложил найти подходящую регрессионную модель оценки данных уровня воды и применить ее для получения большего количества точек на кривой. Из моего ограниченного опыта я мог бы рекомендовать модель, зависящую от взвешенных точек данных, называемых сплайновской моделью. Однако я не статистик и, возможно, ошибаюсь в рекомендации оценочной модели.

+0

Я не хочу расширять кривую в любом направлении, а скорее определять, какие значения отображаются вдоль визуализированной линии. Кажется, что если линия видна, то должен быть способ определить значения y вдоль линии, но, возможно, это невозможно. – echo

 Смежные вопросы

  • Нет связанных вопросов^_^