2010-02-27 5 views
0

J'ai créé un Flex LineChart qui affiche les prévisions de marées hautes et basses au fil du temps. J'utilise la LineSeries avec form = "curve", qui produit un joli graphique sinusoïdal représentant le niveau d'eau dans le temps. L'axe des abscisses représente le temps et l'axe des Y représente le niveau d'eau. Les seuls points de données avec lesquels je dois travailler sont les valeurs hautes et basses, mais j'aimerais savoir comment déterminer les valeurs y des valeurs x arbitraires le long de la ligne.Flex LineSeries - recherche de la valeur y le long de la courbe

Par exemple, disons que j'ai les points de données suivants:

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

Voici mon graphique de ligne:

<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> 

Et je veux connaître le waterLevel le 26 fév 2010 à 09: 00

Ce serait cool si je pouvais faire

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

Mais hélas, cette fonction ne getYValue(xValue) existe pas.

Répondre

0

Ok, je l'ai compris. Je devais juste retourner à la classe de mathématiques de 11e année.

Pour ceux qui est curieux, voici la fonction que je suis venu avec:

Si le haut (ou bas) marée est w1 unités à date1 et la marée basse (ou élevée) suivant est w2 unités à date2, puis la fonction suivante donne le niveau d'eau w au 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

La propriété interpolate de LineSeries remplira les espaces entre les première et dernière valeurs. Cependant, il semble par votre question que vous cherchiez à étendre la courbe en estimant à l'avance. Interpoler ne fonctionnera pas dans ce cas.

Je suggère de trouver un modèle de régression approprié de l'estimation des données de niveau d'eau et de l'appliquer pour dériver plus de points sur la courbe. De mon expérience limitée, je pourrais recommander un modèle dépendant des points de données pondérés appelés le modèle Spline. Cependant, je ne suis pas un statisticien et je pourrais me tromper sur la recommandation du modèle d'estimation.

+0

Je ne cherche pas à étendre la courbe dans l'une ou l'autre direction, mais plutôt à déterminer quelles valeurs sont affichées le long de la ligne rendue. Il semble que si la ligne est visible, il devrait y avoir un moyen de déterminer les valeurs y le long de la ligne, mais ce n'est peut-être pas possible. – echo

Questions connexes