PageRenderTime 49ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/FlashCard/WindowsFormsApplication1/Tabs/Stats.cs

https://bitbucket.org/floAr/personal
C# | 280 lines | 218 code | 62 blank | 0 comment | 9 complexity | 441e8e3a928014653bbbf5743177bfbd MD5 | raw file
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Drawing;
  5. using System.Data;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using ZedGraph;
  10. namespace FlashCard
  11. {
  12. public partial class Stats : UserControl
  13. {
  14. private Deck<Word> wordDeck;
  15. private Deck<KanjiCharacter> kanjiDeck;
  16. public Stats()
  17. {
  18. InitializeComponent();
  19. }
  20. public void LoadDeck(Deck<Word> wordDeck, Deck<KanjiCharacter> kanjiDeck)
  21. {
  22. this.wordDeck = wordDeck;
  23. this.kanjiDeck = kanjiDeck;
  24. graphTypeBox.SelectedIndex = 1;
  25. }
  26. public void UpdateGraph()
  27. {
  28. switch (graphTypeBox.SelectedIndex)
  29. {
  30. case 0:
  31. UpdateHistoryGraph();
  32. break;
  33. case 1:
  34. UpdatePointGraph();
  35. break;
  36. case 2:
  37. UpdateMultiplierGraph();
  38. break;
  39. case 3:
  40. UpdateAverageGraph();
  41. break;
  42. default:
  43. break;
  44. }
  45. }
  46. private void graph_ZoomEvent(ZedGraphControl graph, ZoomState oldState, ZoomState newState)
  47. {
  48. GraphPane pane = graph.GraphPane;
  49. CurveItem curve = pane.CurveList.First();
  50. double max = 20;
  51. if (curve.Points.Count > 0)
  52. {
  53. max = curve.Points[curve.Points.Count - 1].X;
  54. }
  55. Scale scale = pane.XAxis.Scale;
  56. double difference = 5.0 - (scale.Max - scale.Min);
  57. if (difference > 0)
  58. {
  59. scale.Max += difference / 2.0;
  60. scale.Min -= difference / 2.0;
  61. }
  62. scale.Min = Math.Max(scale.Min, 1);
  63. scale.Max = Math.Min(scale.Max, max);
  64. }
  65. private void graphTypeBox_SelectedIndexChanged(object sender, EventArgs e)
  66. {
  67. UpdateGraph();
  68. }
  69. private void bucketSizeControl_ValueChanged(object sender, EventArgs e)
  70. {
  71. UpdateGraph();
  72. }
  73. private void UpdateHistoryGraph()
  74. {
  75. GraphPane pane = graphControl.GraphPane;
  76. IList<int> pointHistory = wordDeck.CurrentCard.Stats.PointHistory;
  77. pane.CurveList.Clear();
  78. pane.Title.Text = wordDeck.CurrentCard.EnglishWord + " (" + wordDeck.CurrentCard.KanaWord + ") History";
  79. pane.XAxis.Title.Text = "Time";
  80. pane.XAxis.Scale.Min = Math.Max(1, pointHistory.Count - 20 + 1);
  81. pane.XAxis.Scale.Max = Math.Max(20, pointHistory.Count);
  82. pane.XAxis.Scale.MajorStep = 2;
  83. pane.XAxis.Scale.MinorStep = 1;
  84. pane.YAxis.Title.Text = "Points";
  85. pane.YAxis.Scale.Min = 0;
  86. pane.YAxis.Scale.Max = wordDeck.MaxPoints;
  87. pane.YAxis.Scale.MajorStep = 20;
  88. pane.YAxis.Scale.MinorStep = 10;
  89. graphControl.ScrollMinX = 1;
  90. graphControl.ScrollMaxX = pane.XAxis.Scale.Max;
  91. PointPairList list = new PointPairList();
  92. for (int i = 0; i < pointHistory.Count; i++)
  93. {
  94. list.Add(i + 1, pointHistory[i]);
  95. }
  96. LineItem curve = pane.AddCurve(string.Empty, list, Color.Blue, SymbolType.Circle);
  97. curve.Line.Width = 2.0f;
  98. curve.Symbol.Size = 8.0f;
  99. curve.Symbol.Fill = new Fill(Color.White);
  100. curve.Line.Fill = new Fill(Color.White, Color.Blue, 45.0f);
  101. graphControl.Refresh();
  102. graphControl.IsEnableHZoom = true;
  103. }
  104. private void UpdatePointGraph()
  105. {
  106. GraphPane pane = graphControl.GraphPane;
  107. pane.CurveList.Clear();
  108. pane.Title.Text = "Point Distribution";
  109. int bucketSize = (int)bucketSizeControl.Value;
  110. int minX = wordDeck.MaxPoints / 2;
  111. int[] points = new int[minX / bucketSize + 1];
  112. foreach (Word word in wordDeck.EnabledCards)
  113. {
  114. if (word.Stats.Points > minX)
  115. {
  116. points[(word.Stats.Points - minX) / bucketSize]++;
  117. }
  118. }
  119. double maxY = points.Max() * 1.1;
  120. pane.XAxis.Title.Text = "Points";
  121. pane.XAxis.Scale.Min = minX;
  122. pane.XAxis.Scale.Max = wordDeck.MaxPoints;
  123. pane.XAxis.Scale.MajorStep = 10;
  124. pane.XAxis.Scale.MinorStep = 5;
  125. pane.YAxis.Title.Text = "Number of Words";
  126. pane.YAxis.Scale.Min = 0;
  127. pane.YAxis.Scale.Max = maxY;
  128. pane.YAxis.Scale.MajorStep = Math.Floor(maxY / 10);
  129. pane.YAxis.Scale.MinorStep = double.MaxValue;
  130. graphControl.ScrollMinX = minX;
  131. graphControl.ScrollMaxX = wordDeck.MaxPoints;
  132. PointPairList list = new PointPairList();
  133. for (int i = 0; i < points.Length; i++)
  134. {
  135. list.Add(minX + i * bucketSize, points[i]);
  136. }
  137. LineItem curve = pane.AddCurve(string.Empty, list, Color.Green, SymbolType.Circle);
  138. curve.Line.Width = 2.0f;
  139. curve.Symbol.Size = 3.0f;
  140. curve.Symbol.Fill = new Fill(Color.Green);
  141. curve.Line.Fill = new Fill(Color.White, Color.Green, 45.0f);
  142. graphControl.Refresh();
  143. graphControl.IsEnableHZoom = false;
  144. }
  145. private void UpdateAverageGraph()
  146. {
  147. GraphPane pane = graphControl.GraphPane;
  148. IList<double> pointHistory = wordDeck.PointAverageHistory;
  149. pane.CurveList.Clear();
  150. pane.Title.Text = "Point Average History";
  151. pane.XAxis.Title.Text = "Time";
  152. pane.XAxis.Scale.Min = Math.Max(1, pointHistory.Count - 20 + 1);
  153. pane.XAxis.Scale.Max = Math.Max(20, pointHistory.Count);
  154. pane.XAxis.Scale.MajorStep = 2;
  155. pane.XAxis.Scale.MinorStep = 1;
  156. pane.YAxis.Title.Text = "Points";
  157. pane.YAxis.Scale.Min = wordDeck.PointCutOff;
  158. pane.YAxis.Scale.Max = wordDeck.MaxPoints;
  159. pane.YAxis.Scale.MajorStep = 10;
  160. pane.YAxis.Scale.MinorStep = 5;
  161. graphControl.ScrollMinX = 1;
  162. graphControl.ScrollMaxX = pane.XAxis.Scale.Max;
  163. PointPairList list = new PointPairList();
  164. for (int i = 0; i < pointHistory.Count; i++)
  165. {
  166. list.Add(i + 1, pointHistory[i]);
  167. }
  168. LineItem curve = pane.AddCurve(string.Empty, list, Color.Red, SymbolType.Circle);
  169. curve.Line.Width = 2.0f;
  170. curve.Symbol.Size = 8.0f;
  171. curve.Symbol.Fill = new Fill(Color.White);
  172. curve.Line.Fill = new Fill(Color.White, Color.Red, 45.0f);
  173. graphControl.Refresh();
  174. graphControl.IsEnableHZoom = true;
  175. }
  176. private void UpdateMultiplierGraph()
  177. {
  178. GraphPane pane = graphControl.GraphPane;
  179. pane.CurveList.Clear();
  180. pane.Title.Text = "Multiplier Distribution";
  181. double bucketSize = (double)(bucketSizeControl.Value / 10);
  182. double maxX = wordDeck.EnabledCards.Max(w => w.Stats.Multiplier);
  183. double[] multipliers = new double[(int)(maxX / bucketSize) + 1];
  184. foreach (Word word in wordDeck.EnabledCards)
  185. {
  186. if (word.Stats.Multiplier >= 0)
  187. {
  188. multipliers[(int)(word.Stats.Multiplier / bucketSize)]++;
  189. }
  190. }
  191. double maxY = multipliers.Max() * 1.1;
  192. pane.XAxis.Title.Text = "Multipliers";
  193. pane.XAxis.Scale.Min = 0;
  194. pane.XAxis.Scale.Max = maxX;
  195. pane.XAxis.Scale.MajorStep = maxX / 10;
  196. pane.XAxis.Scale.MinorStep = maxX / 20;
  197. pane.YAxis.Title.Text = "Number of Words";
  198. pane.YAxis.Scale.Min = 0;
  199. pane.YAxis.Scale.Max = maxY;
  200. pane.YAxis.Scale.MajorStep = Math.Floor(maxY / 10);
  201. pane.YAxis.Scale.MinorStep = double.MaxValue;
  202. graphControl.ScrollMinX = 0;
  203. graphControl.ScrollMaxX = maxX;
  204. PointPairList list = new PointPairList();
  205. for (int i = 0; i < multipliers.Length; i++)
  206. {
  207. list.Add(i * bucketSize, multipliers[i]);
  208. }
  209. LineItem curve = pane.AddCurve(string.Empty, list, Color.Black, SymbolType.Circle);
  210. curve.Line.Width = 2.0f;
  211. curve.Symbol.Size = 3.0f;
  212. curve.Symbol.Fill = new Fill(Color.Black);
  213. curve.Line.Fill = new Fill(Color.White, Color.Black, 45.0f);
  214. graphControl.Refresh();
  215. graphControl.IsEnableHZoom = false;
  216. }
  217. }
  218. }