Commit 1db980acedd503c51f3ac0e4ddef9b606d26e047

Authored by toan
1 parent 0de4d7c99d
Exists in master

Update bug schedule

Showing 1 changed file with 2 additions and 1 deletions Inline Diff

sources/RoboforkApp/Controls/ScheduleCanvas.cs
1 using RoboforkApp.DataModel; 1 using RoboforkApp.DataModel;
2 using System; 2 using System;
3 using System.Collections.Generic; 3 using System.Collections.Generic;
4 using System.Linq; 4 using System.Linq;
5 using System.Text; 5 using System.Text;
6 using System.Threading.Tasks; 6 using System.Threading.Tasks;
7 using System.Windows; 7 using System.Windows;
8 using System.Windows.Controls; 8 using System.Windows.Controls;
9 using System.Windows.Media; 9 using System.Windows.Media;
10 using System.Windows.Media.Animation; 10 using System.Windows.Media.Animation;
11 using System.Windows.Shapes; 11 using System.Windows.Shapes;
12 12
13 namespace RoboforkApp 13 namespace RoboforkApp
14 { 14 {
15 public class ScheduleCanvas : Canvas 15 public class ScheduleCanvas : Canvas
16 { 16 {
17 const double COOR_Y = 65; 17 private double COOR_Y = 65;
18 const double RADIUS_NODE = 25; 18 const double RADIUS_NODE = 25;
19 public simulationRobo simulation; 19 public simulationRobo simulation;
20 private VehicleModelList vehicleModelList; 20 private VehicleModelList vehicleModelList;
21 private Point _startPoint; 21 private Point _startPoint;
22 private Point _endPoint; 22 private Point _endPoint;
23 private bool _isGoal = false; 23 private bool _isGoal = false;
24 private double _speed; 24 private double _speed;
25 private int _index; 25 private int _index;
26 26
27 private List<ucNode> _lstNode; 27 private List<ucNode> _lstNode;
28 28
29 /// <summary> 29 /// <summary>
30 /// Create simulation 30 /// Create simulation
31 /// </summary> 31 /// </summary>
32 /// <param name="lstNode">List node on schedule</param> 32 /// <param name="lstNode">List node on schedule</param>
33 /// <param name="vehicleModel">Vehicle model on map</param> 33 /// <param name="vehicleModel">Vehicle model on map</param>
34 /// <param name="vehicleIndex">Current index of vehicle</param> 34 /// <param name="vehicleIndex">Current index of vehicle</param>
35 public void CreateSimulation(List<ucNode> lstNode, VehicleModel vehicleModel, int vehicleIndex) 35 public void CreateSimulation(List<ucNode> lstNode, VehicleModel vehicleModel, int vehicleIndex)
36 { 36 {
37 //If node is less than 2 so return 37 //If node is less than 2 so return
38 if (this.Children.Count < 2) 38 if (this.Children.Count < 2)
39 { 39 {
40 return; 40 return;
41 } 41 }
42 42
43 this.Children.Remove(simulation); 43 this.Children.Remove(simulation);
44 this.COOR_Y = DesignerCanvas.CanvasScheduleHeight / 2 - 15;
44 45
45 //Init data 46 //Init data
46 this._lstNode = lstNode; 47 this._lstNode = lstNode;
47 this.vehicleModelList = vehicleModel.VehicleModelList[vehicleIndex]; 48 this.vehicleModelList = vehicleModel.VehicleModelList[vehicleIndex];
48 this._startPoint = new Point(Canvas.GetLeft(_lstNode[_index]) + RADIUS_NODE, COOR_Y); 49 this._startPoint = new Point(Canvas.GetLeft(_lstNode[_index]) + RADIUS_NODE, COOR_Y);
49 this._endPoint = new Point(Canvas.GetLeft(_lstNode[_index + 1]) + RADIUS_NODE, COOR_Y); 50 this._endPoint = new Point(Canvas.GetLeft(_lstNode[_index + 1]) + RADIUS_NODE, COOR_Y);
50 51
51 //Get speed 52 //Get speed
52 double scheDis = GetDistance(_startPoint, _endPoint); 53 double scheDis = GetDistance(_startPoint, _endPoint);
53 double mapDis = GetDistance(new Point(vehicleModelList.pointMapList[_index].pointMap_X, vehicleModelList.pointMapList[_index].pointMap_Y), 54 double mapDis = GetDistance(new Point(vehicleModelList.pointMapList[_index].pointMap_X, vehicleModelList.pointMapList[_index].pointMap_Y),
54 new Point(vehicleModelList.pointMapList[_index + 1].pointMap_X, vehicleModelList.pointMapList[_index + 1].pointMap_Y + 1)); 55 new Point(vehicleModelList.pointMapList[_index + 1].pointMap_X, vehicleModelList.pointMapList[_index + 1].pointMap_Y + 1));
55 this._speed = GetSpeed(mapDis, scheDis, vehicleModelList.pointMapList[_index].speed_Map); 56 this._speed = GetSpeed(mapDis, scheDis, vehicleModelList.pointMapList[_index].speed_Map);
56 57
57 //Check next node is goal 58 //Check next node is goal
58 this._index += 1; 59 this._index += 1;
59 if (_index == _lstNode.Count - 1) 60 if (_index == _lstNode.Count - 1)
60 { 61 {
61 _isGoal = true; 62 _isGoal = true;
62 } 63 }
63 64
64 // Start simulation 65 // Start simulation
65 RoboSimulation(); 66 RoboSimulation();
66 } 67 }
67 68
68 /// <summary> 69 /// <summary>
69 /// Create robo simulation on line 70 /// Create robo simulation on line
70 /// </summary> 71 /// </summary>
71 private void RoboSimulation() 72 private void RoboSimulation()
72 { 73 {
73 simulation = new simulationRobo(); 74 simulation = new simulationRobo();
74 simulation.storyBoard = CreatPathAnimation(_startPoint, _endPoint, _speed); 75 simulation.storyBoard = CreatPathAnimation(_startPoint, _endPoint, _speed);
75 this.Children.Add(simulation); 76 this.Children.Add(simulation);
76 } 77 }
77 78
78 /// <summary> 79 /// <summary>
79 /// Get storyboard 80 /// Get storyboard
80 /// </summary> 81 /// </summary>
81 /// <param name="startPoint">Point start line</param> 82 /// <param name="startPoint">Point start line</param>
82 /// <param name="endPoit">Point end line</param> 83 /// <param name="endPoit">Point end line</param>
83 /// <param name="speed">speed on line</param> 84 /// <param name="speed">speed on line</param>
84 /// <returns>Storyboard</returns> 85 /// <returns>Storyboard</returns>
85 private Storyboard CreatPathAnimation(Point startPoint, Point endPoit, double speed) 86 private Storyboard CreatPathAnimation(Point startPoint, Point endPoit, double speed)
86 { 87 {
87 PathGeometry animationPath = new PathGeometry(); 88 PathGeometry animationPath = new PathGeometry();
88 PathFigure pFigure = new PathFigure(); 89 PathFigure pFigure = new PathFigure();
89 pFigure.StartPoint = startPoint; //new Point(50, 65); 90 pFigure.StartPoint = startPoint; //new Point(50, 65);
90 LineSegment lineSegment = new LineSegment(); 91 LineSegment lineSegment = new LineSegment();
91 lineSegment.Point = endPoit; // new Point(800, 65); 92 lineSegment.Point = endPoit; // new Point(800, 65);
92 pFigure.Segments.Add(lineSegment); 93 pFigure.Segments.Add(lineSegment);
93 animationPath.Figures.Add(pFigure); 94 animationPath.Figures.Add(pFigure);
94 95
95 // Freeze the PathGeometry for performance benefits. 96 // Freeze the PathGeometry for performance benefits.
96 animationPath.Freeze(); 97 animationPath.Freeze();
97 98
98 // Create a MatrixAnimationUsingPath to move the 99 // Create a MatrixAnimationUsingPath to move the
99 // simulation along the path by animating 100 // simulation along the path by animating
100 // its MatrixTransform. 101 // its MatrixTransform.
101 MatrixAnimationUsingPath matrixAnimation = new MatrixAnimationUsingPath(); 102 MatrixAnimationUsingPath matrixAnimation = new MatrixAnimationUsingPath();
102 matrixAnimation.PathGeometry = animationPath; 103 matrixAnimation.PathGeometry = animationPath;
103 matrixAnimation.SpeedRatio = speed; 104 matrixAnimation.SpeedRatio = speed;
104 matrixAnimation.AutoReverse = false; 105 matrixAnimation.AutoReverse = false;
105 matrixAnimation.DoesRotateWithTangent = true; 106 matrixAnimation.DoesRotateWithTangent = true;
106 matrixAnimation.Completed += delegate { AnimationCompleted(this._isGoal); }; 107 matrixAnimation.Completed += delegate { AnimationCompleted(this._isGoal); };
107 108
108 // Set the animation to target the Matrix property 109 // Set the animation to target the Matrix property
109 // of the MatrixTransform named "ButtonMatrixTransform". 110 // of the MatrixTransform named "ButtonMatrixTransform".
110 Storyboard.SetTargetName(matrixAnimation, "fl"); 111 Storyboard.SetTargetName(matrixAnimation, "fl");
111 Storyboard.SetTargetProperty(matrixAnimation, new PropertyPath(MatrixTransform.MatrixProperty)); 112 Storyboard.SetTargetProperty(matrixAnimation, new PropertyPath(MatrixTransform.MatrixProperty));
112 113
113 // Create a Storyboard to contain and apply the animation. 114 // Create a Storyboard to contain and apply the animation.
114 Storyboard pathAnimationStoryboard = new Storyboard(); 115 Storyboard pathAnimationStoryboard = new Storyboard();
115 pathAnimationStoryboard.Children.Add(matrixAnimation); 116 pathAnimationStoryboard.Children.Add(matrixAnimation);
116 117
117 return pathAnimationStoryboard; 118 return pathAnimationStoryboard;
118 } 119 }
119 120
120 /// <summary> 121 /// <summary>
121 /// Process when simulation is end line 122 /// Process when simulation is end line
122 /// </summary> 123 /// </summary>
123 /// <param name="isGoal">check is node end</param> 124 /// <param name="isGoal">check is node end</param>
124 private void AnimationCompleted(bool isGoal) 125 private void AnimationCompleted(bool isGoal)
125 { 126 {
126 // If not end node 127 // If not end node
127 if (!isGoal) 128 if (!isGoal)
128 { 129 {
129 this.Children.Remove(simulation); 130 this.Children.Remove(simulation);
130 this._startPoint = _endPoint; 131 this._startPoint = _endPoint;
131 this._endPoint = new Point(Canvas.GetLeft(_lstNode[_index + 1]) + RADIUS_NODE, COOR_Y); 132 this._endPoint = new Point(Canvas.GetLeft(_lstNode[_index + 1]) + RADIUS_NODE, COOR_Y);
132 133
133 //Get speed 134 //Get speed
134 double scheDis = GetDistance(_startPoint, _endPoint); 135 double scheDis = GetDistance(_startPoint, _endPoint);
135 double mapDis = GetDistance(new Point(vehicleModelList.pointMapList[_index].pointMap_X, vehicleModelList.pointMapList[_index].pointMap_Y), 136 double mapDis = GetDistance(new Point(vehicleModelList.pointMapList[_index].pointMap_X, vehicleModelList.pointMapList[_index].pointMap_Y),
136 new Point(vehicleModelList.pointMapList[_index + 1].pointMap_X, vehicleModelList.pointMapList[_index + 1].pointMap_Y + 1)); 137 new Point(vehicleModelList.pointMapList[_index + 1].pointMap_X, vehicleModelList.pointMapList[_index + 1].pointMap_Y + 1));
137 this._speed = GetSpeed(mapDis, scheDis, vehicleModelList.pointMapList[_index].speed_Map); 138 this._speed = GetSpeed(mapDis, scheDis, vehicleModelList.pointMapList[_index].speed_Map);
138 139
139 //Check next node is goal 140 //Check next node is goal
140 this._index += 1; 141 this._index += 1;
141 if (this._index == this._lstNode.Count - 1) 142 if (this._index == this._lstNode.Count - 1)
142 { 143 {
143 this._isGoal = true; 144 this._isGoal = true;
144 } 145 }
145 RoboSimulation(); 146 RoboSimulation();
146 return; 147 return;
147 } 148 }
148 149
149 // Reset data when finish 150 // Reset data when finish
150 this._index = 0; 151 this._index = 0;
151 this._speed = 0; 152 this._speed = 0;
152 this._isGoal = false; 153 this._isGoal = false;
153 } 154 }
154 155
155 /// <summary> 156 /// <summary>
156 /// Get speed on schedule 157 /// Get speed on schedule
157 /// </summary> 158 /// </summary>
158 /// <param name="mapDis">Distance the line on Map</param> 159 /// <param name="mapDis">Distance the line on Map</param>
159 /// <param name="scheDis">Distance the line on Schedule</param> 160 /// <param name="scheDis">Distance the line on Schedule</param>
160 /// <param name="mapSpeed">Speed the fork on Map</param> 161 /// <param name="mapSpeed">Speed the fork on Map</param>
161 /// <returns>Speed the fork on schedule</returns> 162 /// <returns>Speed the fork on schedule</returns>
162 private double GetSpeed(double mapDis, double scheDis, double mapSpeed) 163 private double GetSpeed(double mapDis, double scheDis, double mapSpeed)
163 { 164 {
164 if (mapDis == 0) 165 if (mapDis == 0)
165 return 0.0; 166 return 0.0;
166 167
167 return mapSpeed * (scheDis / mapDis); 168 return mapSpeed * (scheDis / mapDis);
168 } 169 }
169 170
170 /// <summary> 171 /// <summary>
171 /// Get distance between two point 172 /// Get distance between two point
172 /// </summary> 173 /// </summary>
173 /// <param name="point1">Point 1</param> 174 /// <param name="point1">Point 1</param>
174 /// <param name="point2">Point 2</param> 175 /// <param name="point2">Point 2</param>
175 /// <returns>Distance between two point</returns> 176 /// <returns>Distance between two point</returns>
176 private double GetDistance(Point point1, Point point2) 177 private double GetDistance(Point point1, Point point2)
177 { 178 {
178 //pythagorean theorem c^2 = a^2 + b^2 179 //pythagorean theorem c^2 = a^2 + b^2
179 //thus c = square root(a^2 + b^2) 180 //thus c = square root(a^2 + b^2)
180 double a = (double)(point2.X - point1.X); 181 double a = (double)(point2.X - point1.X);
181 double b = (double)(point2.Y - point1.Y); 182 double b = (double)(point2.Y - point1.Y);
182 183
183 return Math.Sqrt(a * a + b * b); 184 return Math.Sqrt(a * a + b * b);
184 } 185 }
185 } 186 }
186 } 187 }
187 188