/// <summary>
 /// Create a view data for MultiDimensionGraph.
 /// </summary>
 /// <returns>Visual dimension graph view data.</returns>
 public static VisualDimensionGraph CreateMultiDimensionGraphData()
 {
     VisualDimensionGraph data = new VisualDimensionGraph();
     data.SelectedDimensions = new ObservableCollection<int>();
     data.StaticTrajectory = new VisualMultiTrajectory(data.SelectedDimensions);
     data.StaticTrajectory.TimeAxis = data.TimeAxis;
     data.DeltaTrajectory = new VisualMultiTrajectory(data.SelectedDimensions);
     data.DeltaTrajectory.TimeAxis = data.TimeAxis;
     data.AccelerationTrajectory = new VisualMultiTrajectory(data.SelectedDimensions);
     data.AccelerationTrajectory.TimeAxis = data.TimeAxis;
     data.PhoneDurations.TimeAxis = data.TimeAxis;
     return data;
 }
 /// <summary>
 /// Create a view data for SingleDimensionGraph.
 /// </summary>
 /// <returns>Visual dimension graph view data.</returns>
 public static VisualDimensionGraph CreateSingleDimensionGraphData()
 {
     VisualDimensionGraph data = new VisualDimensionGraph();
     data.StaticTrajectory = new VisualSingleTrajectory();
     data.StaticTrajectory.TimeAxis = data.TimeAxis;
     data.DeltaTrajectory = new VisualSingleTrajectory();
     data.DeltaTrajectory.TimeAxis = data.TimeAxis;
     data.AccelerationTrajectory = new VisualSingleTrajectory();
     data.AccelerationTrajectory.TimeAxis = data.TimeAxis;
     data.PhoneDurations.TimeAxis = data.TimeAxis;
     return data;
 }
        /// <summary>
        /// Build trajectory information.
        /// </summary>
        /// <param name="dimensionGraphData">Dimension graph data.</param>
        /// <param name="mousePos">Mouse position.</param>
        /// <param name="parameters">Parameter list.</param>
        /// <param name="auxiliaryParameters">Auxiliary parameters.</param>
        /// <param name="means">Mean list.</param>
        /// <param name="deviations">Deviation list.</param>
        /// <param name="trajectoryInfo">Trajectory info.</param>
        public static void BuildTrajectoryInfo(VisualDimensionGraph dimensionGraphData,
            double mousePos, Collection<double> parameters,
            Collection<double> auxiliaryParameters, Collection<double> means,
            Collection<double> deviations, VisualTrajectoryInfo trajectoryInfo)
        {
            double time = dimensionGraphData.TimeAxis.StartingTime +
                ViewHelper.PixelToTimeSpan(mousePos, dimensionGraphData.TimeAxis.ZoomScale);
            trajectoryInfo.Time = time / 1000.0;
            int frameIndex = (int)Math.Floor(time / dimensionGraphData.TimeAxis.SampleInterval);
            if (frameIndex >= means.Count)
            {
                frameIndex = means.Count - 1; // the graph board has width
            }

            trajectoryInfo.FrameIndex = frameIndex;
            if (parameters.Count > frameIndex)
            {
                trajectoryInfo.GeneratedParameter = parameters[frameIndex];
            }
            else
            {
                trajectoryInfo.GeneratedParameter = double.NegativeInfinity;
            }

            trajectoryInfo.Mean = means[frameIndex];
            trajectoryInfo.StandardDeviation = deviations[frameIndex];

            int segIndex = 0;
            VisualSegment segment = FindSegment(dimensionGraphData.WordSegments, frameIndex, out segIndex);
            if (segment != null)
            {
                trajectoryInfo.Word = segment.Text;
            }

            segment = FindSegment(dimensionGraphData.PhoneSegments, frameIndex, out segIndex);

            if (segment != null)
            {
                trajectoryInfo.Phone = segment.Text;
            }
            
            trajectoryInfo.ShowCandidatesParameter = dimensionGraphData.DisplayController.TrajectoryDisplayController.AuxiliaryTrajectoryShowed;
            if (trajectoryInfo.ShowCandidatesParameter)
            {
                if (auxiliaryParameters.Count > frameIndex)
                {
                    trajectoryInfo.CandidatesParameter = auxiliaryParameters[frameIndex];
                }
                else
                {
                    trajectoryInfo.CandidatesParameter = double.NegativeInfinity;
                }
            }
        }