From 4b8ca2e5e14b877211c071d1e7ddc449dbd3a393 Mon Sep 17 00:00:00 2001 From: monitor1394 Date: Wed, 21 Sep 2022 06:59:57 +0800 Subject: [PATCH] [improve][line] improve line in polar --- CHANGELOG.md | 1 + Runtime/Serie/Line/LineHandler.GridCoord.cs | 4 +- Runtime/Serie/Line/LineHandler.PolarCoord.cs | 136 +++++++++++++------ Runtime/Serie/Line/LineHandler.cs | 1 + 4 files changed, 100 insertions(+), 42 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 50d5b749..3c131de8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -58,6 +58,7 @@ ## master +* (2022.09.21) 优化`PolarChart`对`Line`热力图的支持 * (2022.09.20) 增加`PolarChart`对`Heatmap`热力图的支持 * (2022.09.19) 增加`PolarChart`对多柱图和堆叠柱图的支持 * (2022.09.16) 增加`PolarChart`对`Bar`柱图的支持 diff --git a/Runtime/Serie/Line/LineHandler.GridCoord.cs b/Runtime/Serie/Line/LineHandler.GridCoord.cs index 8d7f76e0..d5364dc5 100644 --- a/Runtime/Serie/Line/LineHandler.GridCoord.cs +++ b/Runtime/Serie/Line/LineHandler.GridCoord.cs @@ -185,7 +185,7 @@ namespace XCharts.Runtime float symbolBorder = 0f; float[] cornerRadius = null; Color32 symbolColor, symbolToColor, symbolEmptyColor, borderColor; - SerieHelper.GetItemColor(out symbolColor, out symbolToColor, out symbolEmptyColor, serie, serieData, theme, serie.index); + SerieHelper.GetItemColor(out symbolColor, out symbolToColor, out symbolEmptyColor, serie, serieData, theme, serie.context.colorIndex); SerieHelper.GetSymbolInfo(out borderColor, out symbolBorder, out cornerRadius, serie, null, chart.theme, state); if (isVisualMapGradient) { @@ -213,7 +213,7 @@ namespace XCharts.Runtime if (serie.context.dataPoints.Count < 2) return; - var lineColor = SerieHelper.GetLineColor(serie, null, chart.theme, serie.index); + var lineColor = SerieHelper.GetLineColor(serie, null, chart.theme, serie.context.colorIndex); var startPos = Vector3.zero; var arrowPos = Vector3.zero; var lineArrow = serie.lineArrow.arrow; diff --git a/Runtime/Serie/Line/LineHandler.PolarCoord.cs b/Runtime/Serie/Line/LineHandler.PolarCoord.cs index 3dedb776..1c34e96a 100644 --- a/Runtime/Serie/Line/LineHandler.PolarCoord.cs +++ b/Runtime/Serie/Line/LineHandler.PolarCoord.cs @@ -114,7 +114,7 @@ namespace XCharts.Runtime var firstSerieData = datas[0]; var lp = PolarHelper.UpdatePolarAngleAndPos(m_SeriePolar, m_AngleAxis, m_RadiusAxis, firstSerieData); var cp = Vector3.zero; - var lineColor = SerieHelper.GetLineColor(serie, null, chart.theme, serie.index); + var lineColor = SerieHelper.GetLineColor(serie, null, chart.theme, serie.context.colorIndex); var lineWidth = serie.lineStyle.GetWidth(chart.theme.serie.lineWidth); var currDetailProgress = 0f; var totalDetailProgress = datas.Count; @@ -130,53 +130,69 @@ namespace XCharts.Runtime var clp = Vector3.zero; var crp = Vector3.zero; bool bitp = true, bibp = true; - for (int i = 1; i < datas.Count; i++) + if (datas.Count <= 2) { - if (serie.animation.CheckDetailBreak(i)) - break; - - var serieData = datas[i]; - - cp = PolarHelper.UpdatePolarAngleAndPos(m_SeriePolar, m_AngleAxis, m_RadiusAxis, datas[i]); - var np = i == datas.Count - 1 ? cp : - PolarHelper.UpdatePolarAngleAndPos(m_SeriePolar, m_AngleAxis, m_RadiusAxis, datas[i + 1]); - - UGLHelper.GetLinePoints(lp, cp, np, lineWidth, - ref ltp, ref lbp, - ref ntp, ref nbp, - ref itp, ref ibp, - ref clp, ref crp, - ref bitp, ref bibp, i); - - if (i == 1) + for (int i = 0; i < datas.Count; i++) { - UGL.AddVertToVertexHelper(vh, ltp, lbp, lineColor, false); + var serieData = datas[i]; + cp = PolarHelper.UpdatePolarAngleAndPos(m_SeriePolar, m_AngleAxis, m_RadiusAxis, datas[i]); + serieData.context.position = cp; + serie.context.dataPoints.Add(cp); } - - if (bitp == bibp) + UGL.DrawLine(vh, serie.context.dataPoints, lineWidth, lineColor, false, false); + } + else + { + for (int i = 1; i < datas.Count; i++) { - if (bitp) - UGL.AddVertToVertexHelper(vh, itp, ibp, lineColor, true); + if (serie.animation.CheckDetailBreak(i)) + break; + + var serieData = datas[i]; + cp = PolarHelper.UpdatePolarAngleAndPos(m_SeriePolar, m_AngleAxis, m_RadiusAxis, datas[i]); + serieData.context.position = cp; + serie.context.dataPoints.Add(cp); + + var np = i == datas.Count - 1 ? cp : + PolarHelper.UpdatePolarAngleAndPos(m_SeriePolar, m_AngleAxis, m_RadiusAxis, datas[i + 1]); + + UGLHelper.GetLinePoints(lp, cp, np, lineWidth, + ref ltp, ref lbp, + ref ntp, ref nbp, + ref itp, ref ibp, + ref clp, ref crp, + ref bitp, ref bibp, i); + + if (i == 1) + { + UGL.AddVertToVertexHelper(vh, ltp, lbp, lineColor, false); + } + + if (bitp == bibp) + { + if (bitp) + UGL.AddVertToVertexHelper(vh, itp, ibp, lineColor, true); + else + { + UGL.AddVertToVertexHelper(vh, ltp, clp, lineColor, true); + UGL.AddVertToVertexHelper(vh, ltp, crp, lineColor, true); + } + } else { - UGL.AddVertToVertexHelper(vh, ltp, clp, lineColor, true); - UGL.AddVertToVertexHelper(vh, ltp, crp, lineColor, true); + if (bitp) + { + UGL.AddVertToVertexHelper(vh, itp, clp, lineColor, true); + UGL.AddVertToVertexHelper(vh, itp, crp, lineColor, true); + } + else if (bibp) + { + UGL.AddVertToVertexHelper(vh, clp, ibp, lineColor, true); + UGL.AddVertToVertexHelper(vh, crp, ibp, lineColor, true); + } } + lp = cp; } - else - { - if (bitp) - { - UGL.AddVertToVertexHelper(vh, itp, clp, lineColor, true); - UGL.AddVertToVertexHelper(vh, itp, crp, lineColor, true); - } - else if (bibp) - { - UGL.AddVertToVertexHelper(vh, clp, ibp, lineColor, true); - UGL.AddVertToVertexHelper(vh, crp, ibp, lineColor, true); - } - } - lp = cp; } if (!serie.animation.IsFinish()) @@ -187,6 +203,46 @@ namespace XCharts.Runtime } } + private void DrawPolarLineArrow(VertexHelper vh, Serie serie) + { + if (!serie.show || serie.lineArrow == null || !serie.lineArrow.show) + return; + + if (serie.context.dataPoints.Count < 2) + return; + + var lineColor = SerieHelper.GetLineColor(serie, null, chart.theme, serie.context.colorIndex); + var startPos = Vector3.zero; + var arrowPos = Vector3.zero; + var lineArrow = serie.lineArrow.arrow; + var dataPoints = serie.context.dataPoints; + switch (serie.lineArrow.position) + { + case LineArrow.Position.End: + if (dataPoints.Count < 3) + { + startPos = dataPoints[dataPoints.Count - 2]; + arrowPos = dataPoints[dataPoints.Count - 1]; + } + else + { + startPos = dataPoints[dataPoints.Count - 3]; + arrowPos = dataPoints[dataPoints.Count - 2]; + } + UGL.DrawArrow(vh, startPos, arrowPos, lineArrow.width, lineArrow.height, + lineArrow.offset, lineArrow.dent, lineArrow.GetColor(lineColor)); + + break; + + case LineArrow.Position.Start: + startPos = dataPoints[1]; + arrowPos = dataPoints[0]; + UGL.DrawArrow(vh, startPos, arrowPos, lineArrow.width, lineArrow.height, + lineArrow.offset, lineArrow.dent, lineArrow.GetColor(lineColor)); + break; + } + } + private void DrawPolarLineSymbol(VertexHelper vh) { for (int n = 0; n < chart.series.Count; n++) diff --git a/Runtime/Serie/Line/LineHandler.cs b/Runtime/Serie/Line/LineHandler.cs index 9d9efa1a..10a5c5be 100644 --- a/Runtime/Serie/Line/LineHandler.cs +++ b/Runtime/Serie/Line/LineHandler.cs @@ -35,6 +35,7 @@ namespace XCharts.Runtime { DrawPolarLine(vh, serie); DrawPolarLineSymbol(vh); + DrawPolarLineArrow(vh, serie); } else if (serie.IsUseCoord()) {