Nav apraksta
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

RadarCoordHandler.cs 7.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. using System.Collections.Generic;
  2. using UnityEngine;
  3. using UnityEngine.UI;
  4. using XUGL;
  5. namespace XCharts.Runtime
  6. {
  7. [UnityEngine.Scripting.Preserve]
  8. internal sealed class RadarCoordHandler : MainComponentHandler<RadarCoord>
  9. {
  10. private const string INDICATOR_TEXT = "indicator";
  11. public override void InitComponent()
  12. {
  13. InitRadarCoord(component);
  14. }
  15. public override void Update()
  16. {
  17. base.Update();
  18. if (!chart.isPointerInChart)
  19. {
  20. component.context.isPointerEnter = false;
  21. return;
  22. }
  23. var radar = component;
  24. radar.context.isPointerEnter = radar.show &&
  25. Vector3.Distance(radar.context.center, chart.pointerPos) <= radar.context.radius;
  26. }
  27. public override void DrawBase(VertexHelper vh)
  28. {
  29. DrawRadarCoord(vh, component);
  30. }
  31. private void InitRadarCoord(RadarCoord radar)
  32. {
  33. float txtHig = 20;
  34. radar.painter = chart.GetPainter(radar.index);
  35. radar.refreshComponent = delegate()
  36. {
  37. radar.UpdateRadarCenter(chart.chartPosition, chart.chartWidth, chart.chartHeight);
  38. var radarObject = ChartHelper.AddObject("Radar" + radar.index, chart.transform, chart.chartMinAnchor,
  39. chart.chartMaxAnchor, chart.chartPivot, chart.chartSizeDelta);
  40. radar.gameObject = radarObject;
  41. radar.gameObject.hideFlags = chart.chartHideFlags;
  42. ChartHelper.HideAllObject(radarObject.transform, INDICATOR_TEXT);
  43. for (int i = 0; i < radar.indicatorList.Count; i++)
  44. {
  45. var indicator = radar.indicatorList[i];
  46. var pos = radar.GetIndicatorPosition(i);
  47. var objName = INDICATOR_TEXT + "_" + i;
  48. var label = ChartHelper.AddChartLabel(objName, radarObject.transform, radar.axisName.labelStyle,
  49. chart.theme.common, radar.GetFormatterIndicatorContent(i), Color.clear, TextAnchor.MiddleCenter);
  50. label.SetActive(radar.indicator && radar.axisName.labelStyle.show);
  51. AxisHelper.AdjustCircleLabelPos(label, pos, radar.context.center, txtHig, radar.axisName.labelStyle.offset);
  52. }
  53. chart.RefreshBasePainter();
  54. };
  55. radar.refreshComponent.Invoke();
  56. }
  57. private void DrawRadarCoord(VertexHelper vh, RadarCoord radar)
  58. {
  59. if (!radar.show) return;
  60. radar.UpdateRadarCenter(chart.chartPosition, chart.chartWidth, chart.chartHeight);
  61. if (radar.shape == RadarCoord.Shape.Circle)
  62. {
  63. DrawCricleRadar(vh, radar);
  64. }
  65. else
  66. {
  67. DrawPolygonRadar(vh, radar);
  68. }
  69. }
  70. private void DrawCricleRadar(VertexHelper vh, RadarCoord radar)
  71. {
  72. float insideRadius = 0, outsideRadius = 0;
  73. float block = radar.context.radius / radar.splitNumber;
  74. int indicatorNum = radar.indicatorList.Count;
  75. Vector3 p = radar.context.center;
  76. Vector3 p1;
  77. float angle = 2 * Mathf.PI / indicatorNum;
  78. var lineColor = radar.axisLine.GetColor(chart.theme.axis.splitLineColor);
  79. var lineWidth = radar.axisLine.GetWidth(chart.theme.axis.lineWidth);
  80. var lineType = radar.axisLine.GetType(chart.theme.axis.lineType);
  81. var splitLineColor = radar.splitLine.GetColor(chart.theme.axis.splitLineColor);
  82. var splitLineWidth = radar.splitLine.GetWidth(chart.theme.axis.splitLineWidth);
  83. splitLineWidth *= 2f;
  84. for (int i = 0; i < radar.splitNumber; i++)
  85. {
  86. var color = radar.splitArea.GetColor(i, chart.theme.axis);
  87. outsideRadius = insideRadius + block;
  88. if (radar.splitArea.show)
  89. {
  90. UGL.DrawDoughnut(vh, p, insideRadius, outsideRadius, color, Color.clear,
  91. 0, 360, chart.settings.cicleSmoothness);
  92. }
  93. if (radar.splitLine.show)
  94. {
  95. UGL.DrawEmptyCricle(vh, p, outsideRadius, splitLineWidth, splitLineColor,
  96. Color.clear, chart.settings.cicleSmoothness);
  97. }
  98. insideRadius = outsideRadius;
  99. }
  100. if (radar.axisLine.show)
  101. {
  102. for (int j = 0; j <= indicatorNum; j++)
  103. {
  104. float currAngle = j * angle;
  105. p1 = new Vector3(p.x + outsideRadius * Mathf.Sin(currAngle),
  106. p.y + outsideRadius * Mathf.Cos(currAngle));
  107. ChartDrawer.DrawLineStyle(vh, lineType, lineWidth, p, p1, lineColor);
  108. }
  109. }
  110. }
  111. private void DrawPolygonRadar(VertexHelper vh, RadarCoord radar)
  112. {
  113. float insideRadius = 0, outsideRadius = 0;
  114. float block = radar.context.radius / radar.splitNumber;
  115. int indicatorNum = radar.indicatorList.Count;
  116. Vector3 p1, p2, p3, p4;
  117. Vector3 p = radar.context.center;
  118. var startAngle = radar.startAngle * Mathf.PI / 180;
  119. var angle = 2 * Mathf.PI / indicatorNum;
  120. var lineColor = radar.axisLine.GetColor(chart.theme.axis.splitLineColor);
  121. var lineWidth = radar.axisLine.GetWidth(chart.theme.axis.lineWidth);
  122. var lineType = radar.axisLine.GetType(chart.theme.axis.lineType);
  123. var splitLineColor = radar.splitLine.GetColor(chart.theme.axis.splitLineColor);
  124. var splitLineWidth = radar.splitLine.GetWidth(chart.theme.axis.splitLineWidth);
  125. var splitLineType = radar.splitLine.GetType(chart.theme.axis.splitLineType);
  126. for (int i = 0; i < radar.splitNumber; i++)
  127. {
  128. var color = radar.splitArea.GetColor(i, chart.theme.axis);
  129. outsideRadius = insideRadius + block;
  130. p1 = new Vector3(p.x + insideRadius * Mathf.Sin(startAngle), p.y + insideRadius * Mathf.Cos(startAngle));
  131. p2 = new Vector3(p.x + outsideRadius * Mathf.Sin(startAngle), p.y + outsideRadius * Mathf.Cos(startAngle));
  132. for (int j = 0; j <= indicatorNum; j++)
  133. {
  134. float currAngle = startAngle + j * angle;
  135. p3 = new Vector3(p.x + outsideRadius * Mathf.Sin(currAngle),
  136. p.y + outsideRadius * Mathf.Cos(currAngle));
  137. p4 = new Vector3(p.x + insideRadius * Mathf.Sin(currAngle),
  138. p.y + insideRadius * Mathf.Cos(currAngle));
  139. if (radar.splitArea.show)
  140. {
  141. UGL.DrawQuadrilateral(vh, p1, p2, p3, p4, color);
  142. }
  143. if (radar.splitLine.NeedShow(i, radar.splitNumber))
  144. {
  145. ChartDrawer.DrawLineStyle(vh, splitLineType, splitLineWidth, p2, p3, splitLineColor);
  146. }
  147. p1 = p4;
  148. p2 = p3;
  149. }
  150. insideRadius = outsideRadius;
  151. }
  152. if (radar.axisLine.show)
  153. {
  154. for (int j = 0; j <= indicatorNum; j++)
  155. {
  156. float currAngle = startAngle + j * angle;
  157. p3 = new Vector3(p.x + outsideRadius * Mathf.Sin(currAngle),
  158. p.y + outsideRadius * Mathf.Cos(currAngle));
  159. ChartDrawer.DrawLineStyle(vh, lineType, lineWidth, p, p3, lineColor);
  160. }
  161. }
  162. }
  163. }
  164. }