diff --git a/Assets/XCharts/CHANGELOG.md b/Assets/XCharts/CHANGELOG.md
index acbc2fcf..92d13204 100644
--- a/Assets/XCharts/CHANGELOG.md
+++ b/Assets/XCharts/CHANGELOG.md
@@ -1,9 +1,10 @@
# 更新日志
+* (2020.03.20) 增加`Serie`的`radarType`参数设置`多圈`和`单圈`雷达图
* (2020.03.17) 增加`BarChart`可用`ItemStyle`的`backgroundColor`设置数据项背景颜色
* (2020.03.17) 增加`SerieData`的`ItemStyle`和`Emphasis`可单独配置数据项样式的支持
-* (2020.03.15) 重构`EmptyCricle`类型的`Symbol`边宽取自`ItemStyle`的`borderWidth`
+* (2020.03.15) 重构`EmptyCricle`类型的`Symbol`边宽取自`ItemStyle`的`borderWidth`参数
* (2020.03.15) 重构`SerieSymbol`,去掉`color`和`opacity`参数,用`ItemStyle`参数代替
* (2020.03.14) 发布`v1.3.1`版本
* (2020.03.14) 修复`LineChart`开启`ingore`时部分数据可能绘制异常的问题
diff --git a/Assets/XCharts/Documentation/XCharts配置项手册.md b/Assets/XCharts/Documentation/XCharts配置项手册.md
index ee42387d..cb65cb13 100644
--- a/Assets/XCharts/Documentation/XCharts配置项手册.md
+++ b/Assets/XCharts/Documentation/XCharts配置项手册.md
@@ -546,9 +546,15 @@
* `show`:系列是否显示在图表上。
* `type`:`Radar`。
* `name`:系列名称。用于 `tooltip` 的显示,`legend` 的图例筛选。
+* `radarType`:雷达图类型`RadarType`,支持以下类型:
+ * `Multiple`:多圈雷达图。此时可一个雷达里绘制多个圈,一个serieData就可组成一个圈(多维数据)。
+ * `Single`:单圈雷达图。此时一个雷达只能绘制一个圈,多个serieData组成一个圈,数据取自`data[1]`。
* `radarIndex`:雷达图所使用的 `radar` 组件的 `index`。
* `symbol`:标记的图形 [SerieSymbol](#SerieSymbol)。
* `lineStyle`:线条样式 [LineStyle](#LineStyle)。
+* `itemStyle`:标记样式 [ItemStyle](#ItemStyle)。
+* `areaStyle`:区域填充样式 [AreaStyle](#AreaStyle)。
+* `label`:图形上的文本标签 [SerieLabel](#SerieLabel),可用于说明图形的一些数据信息,比如值,名称等。
* `animation`:起始动画 [SerieAnimation](#SerieAnimation)。
* `data`:系列中的数据项 [SerieData](#SerieData) 数组,可以设置`1`到`n`维数据。
diff --git a/Assets/XCharts/Editor/PropertyDrawers/SerieDrawer.cs b/Assets/XCharts/Editor/PropertyDrawers/SerieDrawer.cs
index 28ac7d55..2b3168ed 100644
--- a/Assets/XCharts/Editor/PropertyDrawers/SerieDrawer.cs
+++ b/Assets/XCharts/Editor/PropertyDrawers/SerieDrawer.cs
@@ -28,6 +28,7 @@ namespace XCharts
SerializedProperty name = prop.FindPropertyRelative("m_Name");
SerializedProperty stack = prop.FindPropertyRelative("m_Stack");
SerializedProperty m_AxisIndex = prop.FindPropertyRelative("m_AxisIndex");
+ SerializedProperty m_RadarType = prop.FindPropertyRelative("m_RadarType");
SerializedProperty m_RadarIndex = prop.FindPropertyRelative("m_RadarIndex");
SerializedProperty m_MinShow = prop.FindPropertyRelative("m_MinShow");
SerializedProperty m_MaxShow = prop.FindPropertyRelative("m_MaxShow");
@@ -213,6 +214,8 @@ namespace XCharts
drawRect.y += EditorGUI.GetPropertyHeight(m_Emphasis);
break;
case SerieType.Radar:
+ EditorGUI.PropertyField(drawRect, m_RadarType);
+ drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
EditorGUI.PropertyField(drawRect, m_RadarIndex);
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
EditorGUI.PropertyField(drawRect, m_Symbol);
@@ -223,6 +226,8 @@ namespace XCharts
drawRect.y += EditorGUI.GetPropertyHeight(m_ItemStyle);
EditorGUI.PropertyField(drawRect, m_AreaStyle);
drawRect.y += EditorGUI.GetPropertyHeight(m_AreaStyle);
+ EditorGUI.PropertyField(drawRect, m_Label);
+ drawRect.y += EditorGUI.GetPropertyHeight(m_Label);
EditorGUI.PropertyField(drawRect, m_Emphasis);
drawRect.y += EditorGUI.GetPropertyHeight(m_Emphasis);
break;
@@ -490,11 +495,12 @@ namespace XCharts
height += EditorGUI.GetPropertyHeight(prop.FindPropertyRelative("m_Animation"));
break;
case SerieType.Radar:
- height += 5 * EditorGUIUtility.singleLineHeight + 4 * EditorGUIUtility.standardVerticalSpacing;
+ height += 6 * EditorGUIUtility.singleLineHeight + 5 * EditorGUIUtility.standardVerticalSpacing;
height += EditorGUI.GetPropertyHeight(prop.FindPropertyRelative("m_Symbol"));
height += EditorGUI.GetPropertyHeight(prop.FindPropertyRelative("m_LineStyle"));
height += EditorGUI.GetPropertyHeight(prop.FindPropertyRelative("m_ItemStyle"));
height += EditorGUI.GetPropertyHeight(prop.FindPropertyRelative("m_AreaStyle"));
+ height += EditorGUI.GetPropertyHeight(prop.FindPropertyRelative("m_Label"));
height += EditorGUI.GetPropertyHeight(prop.FindPropertyRelative("m_Emphasis"));
height += EditorGUI.GetPropertyHeight(prop.FindPropertyRelative("m_Animation"));
break;
diff --git a/Assets/XCharts/Runtime/Component/Main/Radar.cs b/Assets/XCharts/Runtime/Component/Main/Radar.cs
index fe959f1b..53c9b9e7 100644
--- a/Assets/XCharts/Runtime/Component/Main/Radar.cs
+++ b/Assets/XCharts/Runtime/Component/Main/Radar.cs
@@ -181,7 +181,7 @@ namespace XCharts
/// the center position of radar in container.
/// 雷达图在容器中的具体中心点。
///
- public Vector2 runtimeCenterPos { get; internal set; }
+ public Vector3 runtimeCenterPos { get; internal set; }
///
/// the true radius of radar.
/// 雷达图的运行时实际半径。
diff --git a/Assets/XCharts/Runtime/Component/Main/Serie.cs b/Assets/XCharts/Runtime/Component/Main/Serie.cs
index ae149f59..ac13960b 100644
--- a/Assets/XCharts/Runtime/Component/Main/Serie.cs
+++ b/Assets/XCharts/Runtime/Component/Main/Serie.cs
@@ -165,6 +165,20 @@ namespace XCharts
ProgressBar
}
+ ///
+ /// 雷达图类型
+ ///
+ public enum RadarType
+ {
+ ///
+ /// 多圈雷达图。此时可一个雷达里绘制多个圈,一个serieData就可组成一个圈(多维数据)。
+ ///
+ Multiple,
+ ///
+ /// 单圈雷达图。此时一个雷达只能绘制一个圈,多个serieData组成一个圈,数据取自`data[1]`。
+ ///
+ Single
+ }
///
/// 采样类型
///
@@ -256,6 +270,7 @@ namespace XCharts
[SerializeField] private bool m_Clip = true;
[SerializeField] private bool m_Ignore = false;
[SerializeField] private float m_IgnoreValue = 0;
+ [SerializeField] private RadarType m_RadarType = RadarType.Multiple;
[SerializeField] private List m_Data = new List();
@@ -627,6 +642,14 @@ namespace XCharts
set { if (PropertyUtility.SetStruct(ref m_IgnoreValue, value)) SetVerticesDirty(); }
}
///
+ /// 雷达图类型。
+ ///
+ public RadarType radarType
+ {
+ get { return m_RadarType; }
+ set { if (PropertyUtility.SetStruct(ref m_RadarType, value)) SetVerticesDirty(); }
+ }
+ ///
/// 仪表盘轴线。
///
public GaugeAxis gaugeAxis
@@ -1413,9 +1436,9 @@ namespace XCharts
}
}
-
-
+
+
internal float GetBarWidth(float categoryWidth)
{
diff --git a/Assets/XCharts/Runtime/Component/Sub/SerieData.cs b/Assets/XCharts/Runtime/Component/Sub/SerieData.cs
index 1a036fe0..14938d7f 100644
--- a/Assets/XCharts/Runtime/Component/Sub/SerieData.cs
+++ b/Assets/XCharts/Runtime/Component/Sub/SerieData.cs
@@ -82,7 +82,7 @@ namespace XCharts
///
/// 是否启用单个数据项的高亮样式。
///
- public bool enableEmphasis{ get { return m_EnableEmphasis; } set { m_EnableEmphasis = value; } }
+ public bool enableEmphasis { get { return m_EnableEmphasis; } set { m_EnableEmphasis = value; } }
///
/// 单个数据项的高亮样式设置。
///
@@ -172,7 +172,6 @@ namespace XCharts
///
public float runtimePieOffsetRadius { get; internal set; }
public Vector3 runtiemPieOffsetCenter { get; internal set; }
-
private List m_PreviousData = new List();
private List m_DataUpdateTime = new List();
private List m_DataUpdateFlag = new List();
diff --git a/Assets/XCharts/Runtime/RadarChart.cs b/Assets/XCharts/Runtime/RadarChart.cs
index cb635d86..8374177b 100644
--- a/Assets/XCharts/Runtime/RadarChart.cs
+++ b/Assets/XCharts/Runtime/RadarChart.cs
@@ -71,6 +71,7 @@ namespace XCharts
radar.ClearDirty();
}
}
+ m_RadarsDirty = false;
}
base.CheckComponent();
}
@@ -205,134 +206,320 @@ namespace XCharts
Dictionary serieNameSet = new Dictionary();
private void DrawData(VertexHelper vh)
{
- Vector3 startPoint = Vector3.zero;
- Vector3 toPoint = Vector3.zero;
- Vector3 firstPoint = Vector3.zero;
-
serieNameSet.Clear();
- int serieNameCount = -1;
for (int i = 0; i < m_Series.Count; i++)
{
var serie = m_Series.list[i];
- var radar = m_Radars[serie.radarIndex];
- int indicatorNum = radar.indicatorList.Count;
- var angle = 2 * Mathf.PI / indicatorNum;
- Vector3 p = radar.runtimeCenterPos;
- serie.animation.InitProgress(1, 0, 1);
- if (!IsActive(i) || serie.animation.HasFadeOut())
+ serie.index = i;
+ switch (serie.radarType)
+ {
+ case RadarType.Multiple:
+ DrawMutipleRadar(vh, serie, i);
+ break;
+ case RadarType.Single:
+ DrawSingleRadar(vh, serie, i);
+ break;
+ }
+ }
+ }
+
+ private void DrawMutipleRadar(VertexHelper vh, Serie serie, int i)
+ {
+ var startPoint = Vector3.zero;
+ var toPoint = Vector3.zero;
+ var firstPoint = Vector3.zero;
+
+ var radar = m_Radars[serie.radarIndex];
+ var indicatorNum = radar.indicatorList.Count;
+ var angle = 2 * Mathf.PI / indicatorNum;
+ var centerPos = radar.runtimeCenterPos;
+ var serieNameCount = -1;
+ serie.animation.InitProgress(1, 0, 1);
+ if (!IsActive(i) || serie.animation.HasFadeOut())
+ {
+ return;
+ }
+ var rate = serie.animation.GetCurrRate();
+ var dataChanging = false;
+ var dataChangeDuration = serie.animation.GetUpdateAnimationDuration();
+ for (int j = 0; j < serie.data.Count; j++)
+ {
+ var serieData = serie.data[j];
+ int key = i * 1000 + j;
+ if (!radar.runtimeDataPosList.ContainsKey(key))
+ {
+ radar.runtimeDataPosList.Add(i * 1000 + j, new List(serieData.data.Count));
+ }
+ else
+ {
+ radar.runtimeDataPosList[key].Clear();
+ }
+ string dataName = serieData.name;
+ int serieIndex = 0;
+ if (string.IsNullOrEmpty(dataName))
+ {
+ serieNameCount++;
+ serieIndex = serieNameCount;
+ }
+ else if (!serieNameSet.ContainsKey(dataName))
+ {
+ serieNameSet.Add(dataName, serieNameCount);
+ serieNameCount++;
+ serieIndex = serieNameCount;
+ }
+ else
+ {
+ serieIndex = serieNameSet[dataName];
+ }
+ if (!serieData.show)
{
continue;
}
- var rate = serie.animation.GetCurrRate();
- var dataChanging = false;
- var dataChangeDuration = serie.animation.GetUpdateAnimationDuration();
- for (int j = 0; j < serie.data.Count; j++)
+ var isHighlight = serie.highlighted || serieData.highlighted ||
+ (m_Tooltip.show && m_Tooltip.runtimeDataIndex[0] == i && m_Tooltip.runtimeDataIndex[1] == j);
+ var areaColor = SerieHelper.GetAreaColor(serie, m_ThemeInfo, serieIndex, isHighlight);
+ var areaToColor = SerieHelper.GetAreaToColor(serie, m_ThemeInfo, serieIndex, isHighlight);
+ var lineColor = SerieHelper.GetLineColor(serie, m_ThemeInfo, serieIndex, isHighlight);
+ int dataCount = radar.indicatorList.Count;
+ List pointList = radar.runtimeDataPosList[key];
+ for (int n = 0; n < dataCount; n++)
{
- var serieData = serie.data[j];
- int key = i * 100 + j;
- if (!radar.runtimeDataPosList.ContainsKey(key))
+ if (n >= serieData.data.Count) break;
+ float min = radar.GetIndicatorMin(n);
+ float max = radar.GetIndicatorMax(n);
+ float value = serieData.GetCurrData(n, dataChangeDuration);
+ if (serieData.IsDataChanged()) dataChanging = true;
+ if (max == 0)
{
- radar.runtimeDataPosList.Add(i * 100 + j, new List(serieData.data.Count));
+ serie.GetMinMaxData(n, out min, out max);
+ min = radar.GetIndicatorMin(n);
+ }
+ var radius = max < 0 ? radar.runtimeDataRadius - radar.runtimeDataRadius * value / max
+ : radar.runtimeDataRadius * value / max;
+ var currAngle = (n + (radar.positionType == Radar.PositionType.Between ? 0.5f : 0)) * angle;
+ radius *= rate;
+ if (n == 0)
+ {
+ startPoint = new Vector3(centerPos.x + radius * Mathf.Sin(currAngle),
+ centerPos.y + radius * Mathf.Cos(currAngle));
+ firstPoint = startPoint;
}
else
{
- radar.runtimeDataPosList[key].Clear();
- }
- string dataName = serieData.name;
- int serieIndex = 0;
- if (string.IsNullOrEmpty(dataName))
- {
- serieNameCount++;
- serieIndex = serieNameCount;
- }
- else if (!serieNameSet.ContainsKey(dataName))
- {
- serieNameSet.Add(dataName, serieNameCount);
- serieNameCount++;
- serieIndex = serieNameCount;
- }
- else
- {
- serieIndex = serieNameSet[dataName];
- }
- if (!serieData.show)
- {
- continue;
- }
- var isHighlight = serie.highlighted || serieData.highlighted ||
- (m_Tooltip.show && m_Tooltip.runtimeDataIndex[0] == i && m_Tooltip.runtimeDataIndex[1] == j);
- var areaColor = SerieHelper.GetAreaColor(serie, m_ThemeInfo, serieIndex, isHighlight);
- var areaToColor = SerieHelper.GetAreaToColor(serie, m_ThemeInfo, serieIndex, isHighlight);
- var lineColor = SerieHelper.GetLineColor(serie, m_ThemeInfo, serieIndex, isHighlight);
- int dataCount = radar.indicatorList.Count;
- List pointList = radar.runtimeDataPosList[key];
- for (int n = 0; n < dataCount; n++)
- {
- if (n >= serieData.data.Count) break;
- float min = radar.GetIndicatorMin(n);
- float max = radar.GetIndicatorMax(n);
- float value = serieData.GetCurrData(n, dataChangeDuration);
- if (serieData.IsDataChanged()) dataChanging = true;
- if (max == 0)
+ toPoint = new Vector3(centerPos.x + radius * Mathf.Sin(currAngle),
+ centerPos.y + radius * Mathf.Cos(currAngle));
+ if (serie.areaStyle.show)
{
- serie.GetMinMaxData(n, out min, out max);
- min = radar.GetIndicatorMin(n);
+ ChartDrawer.DrawTriangle(vh, startPoint, toPoint, centerPos, areaColor, areaColor, areaToColor);
}
- var radius = max < 0 ? radar.runtimeDataRadius - radar.runtimeDataRadius * value / max
- : radar.runtimeDataRadius * value / max;
- var currAngle = (n + (radar.positionType == Radar.PositionType.Between ? 0.5f : 0)) * angle;
- radius *= rate;
- if (n == 0)
+ if (serie.lineStyle.show)
{
- startPoint = new Vector3(p.x + radius * Mathf.Sin(currAngle),
- p.y + radius * Mathf.Cos(currAngle));
- firstPoint = startPoint;
+ DrawLineStyle(vh, serie.lineStyle, startPoint, toPoint, lineColor);
}
- else
- {
- toPoint = new Vector3(p.x + radius * Mathf.Sin(currAngle),
- p.y + radius * Mathf.Cos(currAngle));
- if (serie.areaStyle.show)
- {
- ChartDrawer.DrawTriangle(vh, startPoint, toPoint, p, areaColor, areaColor, areaToColor);
- }
- if (serie.lineStyle.show)
- {
- DrawLineStyle(vh, serie.lineStyle, startPoint, toPoint, lineColor);
- }
- startPoint = toPoint;
- }
- pointList.Add(startPoint);
+ startPoint = toPoint;
}
+ pointList.Add(startPoint);
+ }
+ if (serie.areaStyle.show)
+ {
+ ChartDrawer.DrawTriangle(vh, startPoint, firstPoint, centerPos, areaColor, areaColor, areaToColor);
+ }
+ if (serie.lineStyle.show)
+ {
+ DrawLineStyle(vh, serie.lineStyle, startPoint, firstPoint, lineColor);
+ }
+ if (serie.symbol.type != SerieSymbolType.None)
+ {
+ var symbolSize = (isHighlight ? serie.symbol.selectedSize : serie.symbol.size);
+ var symbolColor = SerieHelper.GetItemColor(serie, serieData, m_ThemeInfo, serieIndex, isHighlight);
+ var symbolToColor = SerieHelper.GetItemToColor(serie, serieData, m_ThemeInfo, serieIndex, isHighlight);
+ var symbolBorder = SerieHelper.GetSymbolBorder(serie, serieData, isHighlight);
+ foreach (var point in pointList)
+ {
+ DrawSymbol(vh, serie.symbol.type, symbolSize, symbolBorder, point, symbolColor,
+ symbolToColor, serie.symbol.gap);
+ }
+ }
+ }
+ if (!serie.animation.IsFinish())
+ {
+ serie.animation.CheckProgress(1);
+ RefreshChart();
+ }
+ if (dataChanging)
+ {
+ RefreshChart();
+ }
+ }
+
+ private void DrawSingleRadar(VertexHelper vh, Serie serie, int i)
+ {
+ var startPoint = Vector3.zero;
+ var toPoint = Vector3.zero;
+ var firstPoint = Vector3.zero;
+
+ var radar = m_Radars[serie.radarIndex];
+ var indicatorNum = radar.indicatorList.Count;
+ var angle = 2 * Mathf.PI / indicatorNum;
+ var centerPos = radar.runtimeCenterPos;
+ var serieNameCount = -1;
+ serie.animation.InitProgress(1, 0, 1);
+ if (!IsActive(i) || serie.animation.HasFadeOut())
+ {
+ return;
+ }
+ var rate = serie.animation.GetCurrRate();
+ var dataChanging = false;
+ var dataChangeDuration = serie.animation.GetUpdateAnimationDuration();
+ int key = i * 1000;
+ if (!radar.runtimeDataPosList.ContainsKey(key))
+ {
+ radar.runtimeDataPosList.Add(i * 1000, new List(serie.dataCount));
+ }
+ else
+ {
+ radar.runtimeDataPosList[key].Clear();
+ }
+ var pointList = radar.runtimeDataPosList[key];
+ var startIndex = GetStartShowIndex(serie);
+ var endIndex = GetEndShowIndex(serie);
+ for (int j = 0; j < serie.data.Count; j++)
+ {
+ var serieData = serie.data[j];
+ serieData.index = j;
+ string dataName = serieData.name;
+ int serieIndex = 0;
+ if (string.IsNullOrEmpty(dataName))
+ {
+ serieNameCount++;
+ serieIndex = serieNameCount;
+ }
+ else if (!serieNameSet.ContainsKey(dataName))
+ {
+ serieNameSet.Add(dataName, serieNameCount);
+ serieNameCount++;
+ serieIndex = serieNameCount;
+ }
+ else
+ {
+ serieIndex = serieNameSet[dataName];
+ }
+ if (!serieData.show)
+ {
+ serieData.labelPosition = Vector3.zero;
+ continue;
+ }
+ var isHighlight = serie.highlighted || serieData.highlighted ||
+ (m_Tooltip.show && m_Tooltip.runtimeDataIndex[0] == i && m_Tooltip.runtimeDataIndex[1] == j);
+ var areaColor = SerieHelper.GetAreaColor(serie, m_ThemeInfo, serieIndex, isHighlight);
+ var areaToColor = SerieHelper.GetAreaToColor(serie, m_ThemeInfo, serieIndex, isHighlight);
+ var lineColor = SerieHelper.GetLineColor(serie, m_ThemeInfo, serieIndex, isHighlight);
+ int dataCount = radar.indicatorList.Count;
+ var index = serieData.index;
+ var p = radar.runtimeCenterPos;
+ var min = radar.GetIndicatorMin(index);
+ var max = radar.GetIndicatorMax(index);
+ var value = serieData.GetCurrData(1, dataChangeDuration);
+ if (serieData.IsDataChanged()) dataChanging = true;
+ if (max == 0)
+ {
+ serie.GetMinMaxData(index, out min, out max);
+ min = radar.GetIndicatorMin(index);
+ }
+ var radius = max < 0 ? radar.runtimeDataRadius - radar.runtimeDataRadius * value / max
+ : radar.runtimeDataRadius * value / max;
+ var currAngle = (index + (radar.positionType == Radar.PositionType.Between ? 0.5f : 0)) * angle;
+ radius *= rate;
+ if (index == startIndex)
+ {
+ startPoint = new Vector3(p.x + radius * Mathf.Sin(currAngle),
+ p.y + radius * Mathf.Cos(currAngle));
+ firstPoint = startPoint;
+ }
+ else
+ {
+ toPoint = new Vector3(p.x + radius * Mathf.Sin(currAngle),
+ p.y + radius * Mathf.Cos(currAngle));
if (serie.areaStyle.show)
{
- ChartDrawer.DrawTriangle(vh, startPoint, firstPoint, p, areaColor, areaColor, areaToColor);
+ ChartDrawer.DrawTriangle(vh, startPoint, toPoint, p, areaColor, areaColor, areaToColor);
}
if (serie.lineStyle.show)
{
- DrawLineStyle(vh, serie.lineStyle, startPoint, firstPoint, lineColor);
- }
- if (serie.symbol.type != SerieSymbolType.None)
- {
- var symbolSize = (isHighlight ? serie.symbol.selectedSize : serie.symbol.size);
- var symbolColor = SerieHelper.GetItemColor(serie, serieData, m_ThemeInfo, serieIndex, isHighlight);
- var symbolToColor = SerieHelper.GetItemToColor(serie, serieData, m_ThemeInfo, serieIndex, isHighlight);
- var symbolBorder = SerieHelper.GetSymbolBorder(serie, serieData, isHighlight);
- foreach (var point in pointList)
- {
- DrawSymbol(vh, serie.symbol.type, symbolSize, symbolBorder, point, symbolColor,
- symbolToColor, serie.symbol.gap);
- }
+ DrawLineStyle(vh, serie.lineStyle, startPoint, toPoint, lineColor);
}
+ startPoint = toPoint;
}
- if (!serie.animation.IsFinish())
+ serieData.labelPosition = startPoint;
+ pointList.Add(startPoint);
+
+ if (serie.areaStyle.show && j == endIndex)
{
- serie.animation.CheckProgress(1);
- RefreshChart();
+ ChartDrawer.DrawTriangle(vh, startPoint, firstPoint, centerPos, areaColor, areaColor, areaToColor);
}
- if (dataChanging)
+ if (serie.lineStyle.show && j == endIndex)
{
- RefreshChart();
+ DrawLineStyle(vh, serie.lineStyle, startPoint, firstPoint, lineColor);
+ }
+ }
+ if (serie.symbol.type != SerieSymbolType.None)
+ {
+ for (int j = 0; j < serie.data.Count; j++)
+ {
+ var serieData = serie.data[j];
+ if (!serieData.show) continue;
+ var isHighlight = serie.highlighted || serieData.highlighted ||
+ (m_Tooltip.show && m_Tooltip.runtimeDataIndex[0] == i && m_Tooltip.runtimeDataIndex[1] == j);
+ var serieIndex = serieData.index;
+ var symbolSize = (isHighlight ? serie.symbol.selectedSize : serie.symbol.size);
+ var symbolColor = SerieHelper.GetItemColor(serie, serieData, m_ThemeInfo, serieIndex, isHighlight);
+ var symbolToColor = SerieHelper.GetItemToColor(serie, serieData, m_ThemeInfo, serieIndex, isHighlight);
+ var symbolBorder = SerieHelper.GetSymbolBorder(serie, serieData, isHighlight);
+ DrawSymbol(vh, serie.symbol.type, symbolSize, symbolBorder, serieData.labelPosition, symbolColor,
+ symbolToColor, serie.symbol.gap);
+ }
+ }
+ if (!serie.animation.IsFinish())
+ {
+ serie.animation.CheckProgress(1);
+ RefreshChart();
+ }
+ if (dataChanging)
+ {
+ RefreshChart();
+ }
+ }
+
+ private int GetStartShowIndex(Serie serie)
+ {
+ for (int i = 0; i < serie.dataCount; i++)
+ {
+ if (serie.data[i].show) return i;
+ }
+ return 0;
+ }
+ private int GetEndShowIndex(Serie serie)
+ {
+ for (int i = serie.dataCount - 1; i >= 0; i--)
+ {
+ if (serie.data[i].show) return i;
+ }
+ return 0;
+ }
+
+ private void DrawRadarSymbol(VertexHelper vh, Serie serie, SerieData serieData, int serieIndex, bool isHighlight,
+ List pointList)
+ {
+ if (serie.symbol.type != SerieSymbolType.None)
+ {
+ var symbolSize = (isHighlight ? serie.symbol.selectedSize : serie.symbol.size);
+ var symbolColor = SerieHelper.GetItemColor(serie, serieData, m_ThemeInfo, serieIndex, isHighlight);
+ var symbolToColor = SerieHelper.GetItemToColor(serie, serieData, m_ThemeInfo, serieIndex, isHighlight);
+ var symbolBorder = SerieHelper.GetSymbolBorder(serie, serieData, isHighlight);
+ foreach (var point in pointList)
+ {
+ DrawSymbol(vh, serie.symbol.type, symbolSize, symbolBorder, point, symbolColor,
+ symbolToColor, serie.symbol.gap);
}
}
}
@@ -449,15 +636,33 @@ namespace XCharts
{
continue;
}
- for (int n = 0; n < serie.data.Count; n++)
+ switch (serie.radarType)
{
- var posKey = i * 100 + n;
- if (radar.runtimeDataPosList.ContainsKey(posKey))
- {
- var posList = radar.runtimeDataPosList[posKey];
- foreach (var pos in posList)
+ case RadarType.Multiple:
+ for (int n = 0; n < serie.data.Count; n++)
{
- if (Vector2.Distance(pos, local) <= serie.symbol.size * 1.2f)
+ var posKey = i * 1000 + n;
+ if (radar.runtimeDataPosList.ContainsKey(posKey))
+ {
+ var posList = radar.runtimeDataPosList[posKey];
+ foreach (var pos in posList)
+ {
+ if (Vector2.Distance(pos, local) <= serie.symbol.size * 1.2f)
+ {
+ m_Tooltip.runtimeDataIndex[0] = i;
+ m_Tooltip.runtimeDataIndex[1] = n;
+ highlight = true;
+ break;
+ }
+ }
+ }
+ }
+ break;
+ case RadarType.Single:
+ for (int n = 0; n < serie.data.Count; n++)
+ {
+ var serieData = serie.data[n];
+ if (Vector2.Distance(serieData.labelPosition, local) <= serie.symbol.size * 1.2f)
{
m_Tooltip.runtimeDataIndex[0] = i;
m_Tooltip.runtimeDataIndex[1] = n;
@@ -465,8 +670,9 @@ namespace XCharts
break;
}
}
- }
+ break;
}
+
}
if (!highlight)
@@ -501,14 +707,30 @@ namespace XCharts
m_Tooltip.SetActive(true);
var serie = m_Series.GetSerie(serieIndex);
var radar = m_Radars[serie.radarIndex];
- var serieData = serie.GetSerieData(m_Tooltip.runtimeDataIndex[1]);
- StringBuilder sb = new StringBuilder(serieData.name);
- for (int i = 0; i < radar.indicatorList.Count; i++)
+ var dataIndex = m_Tooltip.runtimeDataIndex[1];
+ var serieData = serie.GetSerieData(dataIndex);
+ StringBuilder sb = new StringBuilder();
+ switch (serie.radarType)
{
- string key = radar.indicatorList[i].name;
- float value = serieData.GetData(i);
- if ((i == 0 && !string.IsNullOrEmpty(serieData.name)) || i > 0) sb.Append("\n");
- sb.AppendFormat("{0}: {1}", key, ChartCached.FloatToStr(value, 0, m_Tooltip.forceENotation));
+ case RadarType.Multiple:
+ sb.Append(serieData.name);
+ for (int i = 0; i < radar.indicatorList.Count; i++)
+ {
+ string key = radar.indicatorList[i].name;
+ float value = serieData.GetData(i);
+ if ((i == 0 && !string.IsNullOrEmpty(serieData.name)) || i > 0) sb.Append("\n");
+ sb.AppendFormat("{0}: {1}", key, ChartCached.FloatToStr(value, 0, m_Tooltip.forceENotation));
+ }
+ break;
+ case RadarType.Single:
+ string key2 = serieData.name;
+ float value2 = serieData.GetData(1);
+ if (string.IsNullOrEmpty(key2))
+ {
+ key2 = radar.indicatorList[dataIndex].name;
+ }
+ sb.AppendFormat("{0}: {1}", key2, ChartCached.FloatToStr(value2, 0, m_Tooltip.forceENotation));
+ break;
}
m_Tooltip.UpdateContentText(sb.ToString());
var pos = m_Tooltip.GetContentPos();
@@ -522,5 +744,42 @@ namespace XCharts
}
m_Tooltip.UpdateContentPos(pos);
}
+
+ protected override void OnRefreshLabel()
+ {
+ for (int i = 0; i < m_Series.Count; i++)
+ {
+ var serie = m_Series.GetSerie(i);
+ if (!serie.show && serie.radarType != RadarType.Single) continue;
+ var radar = m_Radars[serie.radarIndex];
+ var center = radar.runtimeCenterPos;
+ for (int n = 0; n < serie.dataCount; n++)
+ {
+ var serieData = serie.data[n];
+ var serieLabel = SerieHelper.GetSerieLabel(serie, serieData);
+ var labelPos = serieData.labelPosition;
+ if (serieLabel.margin != 0)
+ {
+ labelPos += serieLabel.margin * (labelPos - center).normalized;
+ }
+ serieData.SetGameObjectPosition(labelPos);
+ serieData.UpdateIcon();
+ if (serie.show && serieLabel.show && serieData.canShowLabel)
+ {
+ var value = serieData.GetCurrData(1);
+ var max = radar.GetIndicatorMax(n);
+ SerieLabelHelper.ResetLabel(serieData, serieLabel, themeInfo, i);
+ serieData.SetLabelActive(serieData.labelPosition != Vector3.zero);
+ serieData.SetLabelPosition(serieLabel.offset);
+ var content = serieLabel.GetFormatterContent(serie.name, serieData.name, value, max);
+ if (serieData.SetLabelText(content)) RefreshChart();
+ }
+ else
+ {
+ serieData.SetLabelActive(false);
+ }
+ }
+ }
+ }
}
}