Keine Beschreibung
Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

BarHandler.PolarCoord.cs 9.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  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 BarHandler
  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. var pointerRadius = Vector2.Distance(chart.pointerPos, m_SeriePolar.context.center);
  68. Color32 color, toColor;
  69. for (int i = 0; i < serie.dataCount; i++)
  70. {
  71. var serieData = serie.data[i];
  72. if (pointerAngle >= serieData.context.startAngle &&
  73. pointerAngle < serieData.context.toAngle &&
  74. pointerRadius >= serieData.context.insideRadius &&
  75. pointerRadius < serieData.context.outsideRadius)
  76. {
  77. serie.context.pointerItemDataIndex = i;
  78. serie.context.pointerEnter = true;
  79. serieData.context.highlight = true;
  80. }
  81. else
  82. {
  83. serieData.context.highlight = false;
  84. }
  85. var state = SerieHelper.GetSerieState(serie, serieData, true);
  86. SerieHelper.GetItemColor(out color, out toColor, serie, serieData, chart.theme, state);
  87. serieData.interact.SetColor(ref needInteract, color, toColor);
  88. }
  89. }
  90. if (needInteract)
  91. {
  92. if (SeriesHelper.IsStack(chart.series))
  93. chart.RefreshTopPainter();
  94. else
  95. chart.RefreshPainter(serie);
  96. }
  97. }
  98. private void DrawPolarBar(VertexHelper vh, Serie serie)
  99. {
  100. var datas = serie.data;
  101. if (datas.Count <= 0)
  102. return;
  103. m_SeriePolar = chart.GetChartComponent<PolarCoord>(serie.polarIndex);
  104. if (m_SeriePolar == null)
  105. return;
  106. var m_AngleAxis = ComponentHelper.GetAngleAxis(chart.components, m_SeriePolar.index);
  107. var m_RadiusAxis = ComponentHelper.GetRadiusAxis(chart.components, m_SeriePolar.index);
  108. if (m_AngleAxis == null || m_RadiusAxis == null)
  109. return;
  110. var startAngle = m_AngleAxis.context.startAngle;
  111. var currDetailProgress = 0f;
  112. var totalDetailProgress = datas.Count;
  113. serie.animation.InitProgress(currDetailProgress, totalDetailProgress);
  114. var isStack = SeriesHelper.IsStack<Bar>(chart.series, serie.stack);
  115. if (isStack)
  116. SeriesHelper.UpdateStackDataList(chart.series, serie, null, m_StackSerieData);
  117. var barCount = chart.GetSerieBarRealCount<Bar>();
  118. var categoryWidth = m_AngleAxis.IsCategory() ?
  119. AxisHelper.GetDataWidth(m_AngleAxis, 360, datas.Count, null) :
  120. AxisHelper.GetDataWidth(m_RadiusAxis, m_SeriePolar.context.radius, datas.Count, null);
  121. var barGap = chart.GetSerieBarGap<Bar>();
  122. var totalBarWidth = chart.GetSerieTotalWidth<Bar>(categoryWidth, barGap, barCount);
  123. var barWidth = serie.GetBarWidth(categoryWidth, barCount);
  124. var offset = (categoryWidth - totalBarWidth) * 0.5f;
  125. var serieReadIndex = chart.GetSerieIndexIfStack<Bar>(serie);
  126. float gap = serie.barGap == -1 ? offset : offset + chart.GetSerieTotalGap<Bar>(categoryWidth, barGap, serieReadIndex);
  127. var areaColor = ColorUtil.clearColor32;
  128. var areaToColor = ColorUtil.clearColor32;
  129. var interacting = false;
  130. float start, end;
  131. float inside, outside;
  132. double radiusValue, angleValue;
  133. for (int i = 0; i < datas.Count; i++)
  134. {
  135. if (serie.animation.CheckDetailBreak(i))
  136. break;
  137. var serieData = datas[i];
  138. var itemStyle = SerieHelper.GetItemStyle(serie, serieData);
  139. var borderWidth = itemStyle.borderWidth;
  140. var borderColor = itemStyle.borderColor;
  141. radiusValue = serieData.GetData(0);
  142. angleValue = serieData.GetData(1);
  143. if (m_AngleAxis.IsCategory())
  144. {
  145. start = (float) (startAngle + categoryWidth * angleValue + gap);
  146. end = start + barWidth;
  147. inside = m_SeriePolar.context.insideRadius;
  148. if (isStack)
  149. {
  150. for (int n = 0; n < m_StackSerieData.Count - 1; n++)
  151. inside += m_StackSerieData[n][i].context.stackHeight;
  152. }
  153. outside = inside + m_RadiusAxis.GetValueLength(radiusValue, m_SeriePolar.context.radius);
  154. serieData.context.stackHeight = outside - inside;
  155. }
  156. else
  157. {
  158. start = startAngle;
  159. if (isStack)
  160. {
  161. for (int n = 0; n < m_StackSerieData.Count - 1; n++)
  162. start += m_StackSerieData[n][i].context.stackHeight;
  163. }
  164. end = start + m_AngleAxis.GetValueLength(angleValue, 360);
  165. serieData.context.stackHeight = end - start;
  166. inside = m_SeriePolar.context.insideRadius + categoryWidth * (float) radiusValue + gap;
  167. outside = inside + barWidth;
  168. }
  169. serieData.context.startAngle = start;
  170. serieData.context.toAngle = end;
  171. serieData.context.halfAngle = (start + end) / 2;
  172. if (!serieData.interact.TryGetColor(ref areaColor, ref areaToColor, ref interacting))
  173. {
  174. SerieHelper.GetItemColor(out areaColor, out areaToColor, serie, serieData, chart.theme);
  175. serieData.interact.SetColor(ref interacting, areaColor, areaToColor);
  176. }
  177. var needRoundCap = serie.roundCap && inside > 0;
  178. serieData.context.insideRadius = inside;
  179. serieData.context.outsideRadius = outside;
  180. serieData.context.areaCenter = m_SeriePolar.context.center;
  181. serieData.context.position = ChartHelper.GetPosition(m_SeriePolar.context.center, (start + end) / 2, (inside + outside) / 2);
  182. UGL.DrawDoughnut(vh, m_SeriePolar.context.center, inside, outside, areaColor, areaToColor,
  183. ColorUtil.clearColor32, start, end, borderWidth, borderColor, serie.gap / 2, chart.settings.cicleSmoothness,
  184. needRoundCap, true);
  185. }
  186. if (!serie.animation.IsFinish())
  187. {
  188. serie.animation.CheckProgress(totalDetailProgress);
  189. serie.animation.CheckSymbol(serie.symbol.GetSize(null, chart.theme.serie.lineSymbolSize));
  190. chart.RefreshChart();
  191. }
  192. }
  193. }
  194. }