説明なし
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

LineHandler.PolarCoord.cs 12KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  1. using UnityEngine;
  2. using UnityEngine.UI;
  3. using XUGL;
  4. namespace XCharts.Runtime
  5. {
  6. /// <summary>
  7. /// For polar coord
  8. /// </summary>
  9. internal sealed partial class LineHandler
  10. {
  11. private PolarCoord m_SeriePolar;
  12. private void UpdateSeriePolarContext()
  13. {
  14. if (m_SeriePolar == null)
  15. return;
  16. var needCheck = (chart.isPointerInChart && m_SeriePolar.IsPointerEnter()) || m_LegendEnter;
  17. var lineWidth = 0f;
  18. if (!needCheck)
  19. {
  20. if (m_LastCheckContextFlag != needCheck)
  21. {
  22. var needAnimation1 = false;
  23. lineWidth = serie.lineStyle.GetWidth(chart.theme.serie.lineWidth);
  24. m_LastCheckContextFlag = needCheck;
  25. serie.context.pointerItemDataIndex = -1;
  26. serie.context.pointerEnter = false;
  27. serie.interact.SetValue(ref needAnimation1, lineWidth, false);
  28. foreach (var serieData in serie.data)
  29. {
  30. var symbol = SerieHelper.GetSerieSymbol(serie, serieData);
  31. var symbolSize = symbol.GetSize(serieData.data, chart.theme.serie.lineSymbolSize);
  32. serieData.context.highlight = false;
  33. serieData.interact.SetValue(ref needAnimation1, symbolSize);
  34. }
  35. if (needAnimation1)
  36. {
  37. if (SeriesHelper.IsStack(chart.series))
  38. chart.RefreshTopPainter();
  39. else
  40. chart.RefreshPainter(serie);
  41. }
  42. }
  43. return;
  44. }
  45. m_LastCheckContextFlag = needCheck;
  46. var themeSymbolSize = chart.theme.serie.lineSymbolSize;
  47. lineWidth = serie.lineStyle.GetWidth(chart.theme.serie.lineWidth);
  48. var needInteract = false;
  49. if (m_LegendEnter)
  50. {
  51. serie.context.pointerEnter = true;
  52. serie.interact.SetValue(ref needInteract, lineWidth, true, chart.theme.serie.selectedRate);
  53. for (int i = 0; i < serie.dataCount; i++)
  54. {
  55. var serieData = serie.data[i];
  56. var size = SerieHelper.GetSysmbolSize(serie, serieData, chart.theme, themeSymbolSize, SerieState.Emphasis);
  57. serieData.context.highlight = true;
  58. serieData.interact.SetValue(ref needInteract, size);
  59. }
  60. }
  61. else
  62. {
  63. serie.context.pointerItemDataIndex = -1;
  64. serie.context.pointerEnter = false;
  65. var dir = chart.pointerPos - new Vector2(m_SeriePolar.context.center.x, m_SeriePolar.context.center.y);
  66. var pointerAngle = ChartHelper.GetAngle360(Vector2.up, dir);
  67. for (int i = 0; i < serie.dataCount; i++)
  68. {
  69. var serieData = serie.data[i];
  70. var angle0 = serieData.context.angle;
  71. var angle1 = i >= serie.dataCount - 1 ? angle0 : serie.data[i + 1].context.angle;
  72. if (pointerAngle >= angle0 && pointerAngle < angle1)
  73. {
  74. serie.context.pointerItemDataIndex = i;
  75. serie.context.pointerEnter = true;
  76. serieData.context.highlight = true;
  77. }
  78. else
  79. {
  80. serieData.context.highlight = false;
  81. }
  82. }
  83. }
  84. if (needInteract)
  85. {
  86. if (SeriesHelper.IsStack(chart.series))
  87. chart.RefreshTopPainter();
  88. else
  89. chart.RefreshPainter(serie);
  90. }
  91. }
  92. private void DrawPolarLine(VertexHelper vh, Serie serie)
  93. {
  94. var datas = serie.data;
  95. if (datas.Count <= 0)
  96. return;
  97. m_SeriePolar = chart.GetChartComponent<PolarCoord>(serie.polarIndex);
  98. if (m_SeriePolar == null)
  99. return;
  100. var m_AngleAxis = ComponentHelper.GetAngleAxis(chart.components, m_SeriePolar.index);
  101. var m_RadiusAxis = ComponentHelper.GetRadiusAxis(chart.components, m_SeriePolar.index);
  102. if (m_AngleAxis == null || m_RadiusAxis == null)
  103. return;
  104. var startAngle = m_AngleAxis.startAngle;
  105. var firstSerieData = datas[0];
  106. var lp = PolarHelper.UpdatePolarAngleAndPos(m_SeriePolar, m_AngleAxis, m_RadiusAxis, firstSerieData);
  107. var cp = Vector3.zero;
  108. var lineColor = SerieHelper.GetLineColor(serie, null, chart.theme, serie.context.colorIndex);
  109. var lineWidth = serie.lineStyle.GetWidth(chart.theme.serie.lineWidth);
  110. var currDetailProgress = 0f;
  111. var totalDetailProgress = datas.Count;
  112. serie.animation.InitProgress(currDetailProgress, totalDetailProgress);
  113. var ltp = Vector3.zero;
  114. var lbp = Vector3.zero;
  115. var ntp = Vector3.zero;
  116. var nbp = Vector3.zero;
  117. var itp = Vector3.zero;
  118. var ibp = Vector3.zero;
  119. var clp = Vector3.zero;
  120. var crp = Vector3.zero;
  121. bool bitp = true, bibp = true;
  122. if (datas.Count <= 2)
  123. {
  124. for (int i = 0; i < datas.Count; i++)
  125. {
  126. var serieData = datas[i];
  127. cp = PolarHelper.UpdatePolarAngleAndPos(m_SeriePolar, m_AngleAxis, m_RadiusAxis, datas[i]);
  128. serieData.context.position = cp;
  129. serie.context.dataPoints.Add(cp);
  130. }
  131. UGL.DrawLine(vh, serie.context.dataPoints, lineWidth, lineColor, false, false);
  132. }
  133. else
  134. {
  135. for (int i = 1; i < datas.Count; i++)
  136. {
  137. if (serie.animation.CheckDetailBreak(i))
  138. break;
  139. var serieData = datas[i];
  140. cp = PolarHelper.UpdatePolarAngleAndPos(m_SeriePolar, m_AngleAxis, m_RadiusAxis, datas[i]);
  141. serieData.context.position = cp;
  142. serie.context.dataPoints.Add(cp);
  143. var np = i == datas.Count - 1 ? cp :
  144. PolarHelper.UpdatePolarAngleAndPos(m_SeriePolar, m_AngleAxis, m_RadiusAxis, datas[i + 1]);
  145. UGLHelper.GetLinePoints(lp, cp, np, lineWidth,
  146. ref ltp, ref lbp,
  147. ref ntp, ref nbp,
  148. ref itp, ref ibp,
  149. ref clp, ref crp,
  150. ref bitp, ref bibp, i);
  151. if (i == 1)
  152. {
  153. UGL.AddVertToVertexHelper(vh, ltp, lbp, lineColor, false);
  154. }
  155. if (bitp == bibp)
  156. {
  157. if (bitp)
  158. UGL.AddVertToVertexHelper(vh, itp, ibp, lineColor, true);
  159. else
  160. {
  161. UGL.AddVertToVertexHelper(vh, ltp, clp, lineColor, true);
  162. UGL.AddVertToVertexHelper(vh, ltp, crp, lineColor, true);
  163. }
  164. }
  165. else
  166. {
  167. if (bitp)
  168. {
  169. UGL.AddVertToVertexHelper(vh, itp, clp, lineColor, true);
  170. UGL.AddVertToVertexHelper(vh, itp, crp, lineColor, true);
  171. }
  172. else if (bibp)
  173. {
  174. UGL.AddVertToVertexHelper(vh, clp, ibp, lineColor, true);
  175. UGL.AddVertToVertexHelper(vh, crp, ibp, lineColor, true);
  176. }
  177. }
  178. lp = cp;
  179. }
  180. }
  181. if (!serie.animation.IsFinish())
  182. {
  183. serie.animation.CheckProgress(totalDetailProgress);
  184. serie.animation.CheckSymbol(serie.symbol.GetSize(null, chart.theme.serie.lineSymbolSize));
  185. chart.RefreshChart();
  186. }
  187. }
  188. private void DrawPolarLineArrow(VertexHelper vh, Serie serie)
  189. {
  190. if (!serie.show || serie.lineArrow == null || !serie.lineArrow.show)
  191. return;
  192. if (serie.context.dataPoints.Count < 2)
  193. return;
  194. var lineColor = SerieHelper.GetLineColor(serie, null, chart.theme, serie.context.colorIndex);
  195. var startPos = Vector3.zero;
  196. var arrowPos = Vector3.zero;
  197. var lineArrow = serie.lineArrow.arrow;
  198. var dataPoints = serie.context.dataPoints;
  199. switch (serie.lineArrow.position)
  200. {
  201. case LineArrow.Position.End:
  202. if (dataPoints.Count < 3)
  203. {
  204. startPos = dataPoints[dataPoints.Count - 2];
  205. arrowPos = dataPoints[dataPoints.Count - 1];
  206. }
  207. else
  208. {
  209. startPos = dataPoints[dataPoints.Count - 3];
  210. arrowPos = dataPoints[dataPoints.Count - 2];
  211. }
  212. UGL.DrawArrow(vh, startPos, arrowPos, lineArrow.width, lineArrow.height,
  213. lineArrow.offset, lineArrow.dent, lineArrow.GetColor(lineColor));
  214. break;
  215. case LineArrow.Position.Start:
  216. startPos = dataPoints[1];
  217. arrowPos = dataPoints[0];
  218. UGL.DrawArrow(vh, startPos, arrowPos, lineArrow.width, lineArrow.height,
  219. lineArrow.offset, lineArrow.dent, lineArrow.GetColor(lineColor));
  220. break;
  221. }
  222. }
  223. private void DrawPolarLineSymbol(VertexHelper vh)
  224. {
  225. for (int n = 0; n < chart.series.Count; n++)
  226. {
  227. var serie = chart.series[n];
  228. if (!serie.show)
  229. continue;
  230. if (!(serie is Line))
  231. continue;
  232. var count = serie.dataCount;
  233. float symbolBorder = 0f;
  234. float[] cornerRadius = null;
  235. Color32 symbolColor, symbolToColor, symbolEmptyColor, borderColor;
  236. for (int i = 0; i < count; i++)
  237. {
  238. var serieData = serie.GetSerieData(i);
  239. var state = SerieHelper.GetSerieState(serie, serieData, true);
  240. var symbol = SerieHelper.GetSerieSymbol(serie, serieData, state);
  241. if (ChartHelper.IsIngore(serieData.context.position))
  242. continue;
  243. if (!symbol.show || !symbol.ShowSymbol(i, count))
  244. continue;
  245. var symbolSize = SerieHelper.GetSysmbolSize(serie, serieData, chart.theme, chart.theme.serie.lineSymbolSize, state);
  246. SerieHelper.GetItemColor(out symbolColor, out symbolToColor, out symbolEmptyColor, serie, serieData, chart.theme, n);
  247. SerieHelper.GetSymbolInfo(out borderColor, out symbolBorder, out cornerRadius, serie, null, chart.theme, state);
  248. symbolSize = serie.animation.GetSysmbolSize(symbolSize);
  249. chart.DrawSymbol(vh, symbol.type, symbolSize, symbolBorder, serieData.context.position,
  250. symbolColor, symbolToColor, symbolEmptyColor, borderColor, symbol.gap, cornerRadius);
  251. }
  252. }
  253. }
  254. }
  255. }