3.0 - polar chart

This commit is contained in:
monitor1394
2022-01-26 20:47:14 +08:00
parent a32f5f5bcf
commit cc4ee3735c
41 changed files with 566 additions and 165 deletions

View File

@@ -19,13 +19,14 @@ namespace XCharts
public int containerIndex { get; internal set; }
public int containterInstanceId { get; internal set; }
public static void AddDefaultSerie(BaseChart chart, string serieName)
public static Serie AddDefaultSerie(BaseChart chart, string serieName)
{
var serie = chart.AddSerie<Bar>(serieName);
for (int i = 0; i < 5; i++)
{
chart.AddData(serie.index, UnityEngine.Random.Range(10, 90));
}
return serie;
}
public static Bar CovertSerie(Serie serie)

View File

@@ -228,7 +228,10 @@ namespace XCharts
serieData.context.stackHeight = barHig;
serieData.context.position = top;
serieData.context.rect = Rect.MinMaxRect(plb.x, plb.y, prb.x, prt.y);
serie.context.dataPoints.Add(top);
if (!serie.clip || (serie.clip && m_SerieGrid.Contains(top)))
serie.context.dataPoints.Add(top);
else
continue;
if (serie.show && currHig != 0 && !serie.placeHolder)
{
switch (serie.barType)

View File

@@ -15,7 +15,7 @@ namespace XCharts
public int containerIndex { get; internal set; }
public int containterInstanceId { get; internal set; }
public static void AddDefaultSerie(BaseChart chart, string serieName)
public static Serie AddDefaultSerie(BaseChart chart, string serieName)
{
var serie = chart.AddSerie<SimplifiedBar>(serieName);
serie.symbol.show = false;
@@ -28,6 +28,7 @@ namespace XCharts
lastValue += UnityEngine.Random.Range(-3, 5);
chart.AddData(serie.index, lastValue);
}
return serie;
}
public static SimplifiedBar CovertSerie(Serie serie)

View File

@@ -11,7 +11,7 @@ namespace XCharts
{
public int containerIndex { get; internal set; }
public int containterInstanceId { get; internal set; }
public static void AddDefaultSerie(BaseChart chart, string serieName)
public static Serie AddDefaultSerie(BaseChart chart, string serieName)
{
var serie = chart.AddSerie<Candlestick>(serieName);
var defaultDataCount = 5;
@@ -23,6 +23,7 @@ namespace XCharts
var heighest = Random.Range(50, 100);
chart.AddData(serie.index, open, close, lowest, heighest);
}
return serie;
}
}
}

View File

@@ -12,7 +12,7 @@ namespace XCharts
public int containerIndex { get; internal set; }
public int containterInstanceId { get; internal set; }
public static void AddDefaultSerie(BaseChart chart, string serieName)
public static Serie AddDefaultSerie(BaseChart chart, string serieName)
{
var serie = chart.AddSerie<SimplifiedCandlestick>(serieName);
@@ -26,6 +26,7 @@ namespace XCharts
var heighest = lastValue + Random.Range(10, 20);
chart.AddData(serie.index, open, close, lowest, heighest);
}
return serie;
}
public static SimplifiedCandlestick CovertSerie(Serie serie)

View File

@@ -11,7 +11,7 @@ namespace XCharts
{
public int containerIndex { get; internal set; }
public int containterInstanceId { get; internal set; }
public static void AddDefaultSerie(BaseChart chart, string serieName)
public static Serie AddDefaultSerie(BaseChart chart, string serieName)
{
var serie = chart.AddSerie<Heatmap>(serieName);
serie.itemStyle.show = true;
@@ -23,6 +23,7 @@ namespace XCharts
emphasis.itemStyle.show = true;
emphasis.itemStyle.borderWidth = 1;
emphasis.itemStyle.borderColor = Color.black;
return serie;
}
}
}

View File

@@ -20,7 +20,7 @@ namespace XCharts
{
public int containerIndex { get; internal set; }
public int containterInstanceId { get; internal set; }
public static void AddDefaultSerie(BaseChart chart, string serieName)
public static Serie AddDefaultSerie(BaseChart chart, string serieName)
{
var serie = chart.AddSerie<Line>(serieName);
serie.symbol.show = true;
@@ -28,6 +28,7 @@ namespace XCharts
{
chart.AddData(serie.index, UnityEngine.Random.Range(10, 90));
}
return serie;
}
public static Line CovertSerie(Serie serie)

View File

@@ -10,58 +10,12 @@ namespace XCharts
/// <summary>
/// For grid coord
/// </summary>
[UnityEngine.Scripting.Preserve]
internal sealed partial class LineHandler : SerieHandler<Line>
{
List<List<SerieData>> m_StackSerieData = new List<List<SerieData>>();
private GridCoord m_SerieGrid;
public override void Update()
{
base.Update();
UpdateSerieContext();
}
public override void UpdateTooltipSerieParams(int dataIndex, bool showCategory, string category,
string marker, string itemFormatter, string numericFormatter,
ref List<SerieParams> paramList, ref string title)
{
UpdateCoordSerieParams(ref paramList, ref title, dataIndex, showCategory, category,
marker, itemFormatter, numericFormatter);
}
public override void DrawSerie(VertexHelper vh)
{
if (serie.IsUseCoord<PolarCoord>())
{
DrawPolarLine(vh, serie);
DrawPolarLineSymbol(vh);
}
else if (serie.IsUseCoord<GridCoord>())
{
DrawLineSerie(vh, serie);
if (!SeriesHelper.IsStack(chart.series))
{
DrawLinePoint(vh, serie);
DrawLineArrow(vh, serie);
}
}
}
public override void DrawTop(VertexHelper vh)
{
if (serie.IsUseCoord<GridCoord>())
{
if (SeriesHelper.IsStack(chart.series))
{
DrawLinePoint(vh, serie);
DrawLineArrow(vh, serie);
}
}
}
private void UpdateSerieContext()
private void UpdateSerieGridContext()
{
if (m_SerieGrid == null)
return;
@@ -185,13 +139,13 @@ namespace XCharts
var theme = chart.theme;
var interacting = false;
var lineArrow = serie.lineArrow;
//var isY = ComponentHelper.IsAnyCategoryOfYAxis(chart.components);
for (int i = 0; i < count; i++)
{
var serieData = serie.GetSerieData(i);
if (serieData == null)
continue;
if (serieData.context.isClip)
continue;
var symbol = SerieHelper.GetSerieSymbol(serie, serieData);
@@ -199,10 +153,6 @@ namespace XCharts
continue;
var pos = serie.context.dataPoints[i];
// if (serie.animation.CheckDetailBreak(pos, isY))
// {
// continue;
// }
if (lineArrow != null && lineArrow.show)
{
if (lineArrow.position == LineArrow.Position.Start && i == 0)
@@ -308,12 +258,13 @@ namespace XCharts
axis = chart.GetChartComponent<XAxis>(serie.xAxisIndex);
relativedAxis = chart.GetChartComponent<YAxis>(serie.yAxisIndex);
}
m_SerieGrid = chart.GetChartComponent<GridCoord>(axis.gridIndex);
if (axis == null)
return;
if (relativedAxis == null)
return;
m_SerieGrid = chart.GetChartComponent<GridCoord>(axis.gridIndex);
if (m_SerieGrid == null)
return;
@@ -351,7 +302,7 @@ namespace XCharts
lastSerie = SeriesHelper.GetLastStackSerie(chart.series, serie);
SeriesHelper.UpdateStackDataList(chart.series, serie, dataZoom, m_StackSerieData);
}
var lp = Vector3.zero;
for (int i = serie.minShow; i < maxCount; i += rate)
{
var serieData = showData[i];
@@ -374,11 +325,18 @@ namespace XCharts
serieData.context.stackHeight = GetDataPoint(isY, axis, relativedAxis, m_SerieGrid, xValue, relativedValue,
i, scaleWid, isStack, ref np);
serieData.context.position = np;
serie.context.dataPoints.Add(np);
serieData.context.isClip = false;
if (serie.clip && !m_SerieGrid.Contains(np))
{
if (m_SerieGrid.BoundaryPoint(lp, np, ref np))
{
serieData.context.isClip = true;
}
}
serie.context.dataIgnores.Add(false);
serieData.context.position = np;
serie.context.dataPoints.Add(np);
lp = np;
}
}

View File

@@ -10,29 +10,117 @@ namespace XCharts
/// </summary>
internal sealed partial class LineHandler
{
private PolarCoord m_SeriePolar;
private void UpdateSeriePolarContext()
{
if (m_SeriePolar == null)
return;
var needCheck = (chart.isPointerInChart && m_SeriePolar.IsPointerEnter()) || m_LegendEnter;
var lineWidth = 0f;
if (!needCheck)
{
if (m_LastCheckContextFlag != needCheck)
{
var needAnimation1 = false;
lineWidth = serie.lineStyle.GetWidth(chart.theme.serie.lineWidth);
m_LastCheckContextFlag = needCheck;
serie.context.pointerItemDataIndex = -1;
serie.context.pointerEnter = false;
serie.interact.SetValue(ref needAnimation1, lineWidth, false);
foreach (var serieData in serie.data)
{
var symbol = SerieHelper.GetSerieSymbol(serie, serieData);
var symbolSize = symbol.GetSize(serieData.data, chart.theme.serie.lineSymbolSize);
serieData.context.highlight = false;
serieData.interact.SetValue(ref needAnimation1, symbolSize);
}
if (needAnimation1)
{
if (SeriesHelper.IsStack(chart.series))
chart.RefreshTopPainter();
else
chart.RefreshPainter(serie);
}
}
return;
}
m_LastCheckContextFlag = needCheck;
var themeSymbolSize = chart.theme.serie.lineSymbolSize;
var themeSymbolSelectedSize = chart.theme.serie.lineSymbolSelectedSize;
lineWidth = serie.lineStyle.GetWidth(chart.theme.serie.lineWidth);
var needInteract = false;
if (m_LegendEnter)
{
serie.interact.SetValue(ref needInteract, lineWidth, true, chart.theme.serie.selectedRate);
for (int i = 0; i < serie.dataCount; i++)
{
var serieData = serie.data[i];
var symbol = SerieHelper.GetSerieSymbol(serie, serieData);
var symbolSelectedSize = symbol.GetSelectedSize(serieData.data, themeSymbolSelectedSize);
serieData.context.highlight = true;
serieData.interact.SetValue(ref needInteract, symbolSelectedSize);
}
}
else
{
serie.context.pointerItemDataIndex = -1;
serie.context.pointerEnter = false;
var dir = chart.pointerPos - new Vector2(m_SeriePolar.context.center.x, m_SeriePolar.context.center.y);
var pointerAngle = ChartHelper.GetAngle360(Vector2.up, dir);
for (int i = 0; i < serie.dataCount; i++)
{
var serieData = serie.data[i];
var angle0 = serieData.context.angle;
var angle1 = i >= serie.dataCount - 1 ? angle0 : serie.data[i + 1].context.angle;
if (pointerAngle >= angle0 && pointerAngle < angle1)
{
serie.context.pointerItemDataIndex = i;
serie.context.pointerEnter = true;
serieData.context.highlight = true;
}
else
{
serieData.context.highlight = false;
}
}
}
if (needInteract)
{
if (SeriesHelper.IsStack(chart.series))
chart.RefreshTopPainter();
else
chart.RefreshPainter(serie);
}
}
private void DrawPolarLine(VertexHelper vh, Serie serie)
{
var datas = serie.data;
if (datas.Count <= 0)
return;
var m_Polar = chart.GetChartComponent<PolarCoord>(serie.polarIndex);
if (m_Polar == null)
m_SeriePolar = chart.GetChartComponent<PolarCoord>(serie.polarIndex);
if (m_SeriePolar == null)
return;
var m_AngleAxis = ComponentHelper.GetAngleAxis(chart.components, m_Polar.index);
var m_RadiusAxis = ComponentHelper.GetRadiusAxis(chart.components, m_Polar.index);
var m_AngleAxis = ComponentHelper.GetAngleAxis(chart.components, m_SeriePolar.index);
var m_RadiusAxis = ComponentHelper.GetRadiusAxis(chart.components, m_SeriePolar.index);
if (m_AngleAxis == null || m_RadiusAxis == null)
return;
var startAngle = m_AngleAxis.startAngle;
var radius = m_Polar.context.radius;
var radius = m_SeriePolar.context.radius;
var min = m_RadiusAxis.context.minValue;
var max = m_RadiusAxis.context.maxValue;
var firstSerieData = datas[0];
var startPos = GetPolarPos(m_Polar, m_AngleAxis, firstSerieData, min, max, radius);
var nextPos = Vector3.zero;
var lp = GetPolarPos(m_SeriePolar, m_AngleAxis, firstSerieData, min, max, radius);
var cp = Vector3.zero;
var lineColor = SerieHelper.GetLineColor(serie, null, chart.theme, serie.index, serie.highlight);
var lineWidth = serie.lineStyle.GetWidth(chart.theme.serie.lineWidth);
var currDetailProgress = 0f;
@@ -40,15 +128,62 @@ namespace XCharts
serie.animation.InitProgress(currDetailProgress, totalDetailProgress);
var ltp = Vector3.zero;
var lbp = Vector3.zero;
var ntp = Vector3.zero;
var nbp = Vector3.zero;
var itp = Vector3.zero;
var ibp = Vector3.zero;
var clp = Vector3.zero;
var crp = Vector3.zero;
bool bitp = true, bibp = true;
for (int i = 1; i < datas.Count; i++)
{
if (serie.animation.CheckDetailBreak(i))
break;
var serieData = datas[i];
nextPos = GetPolarPos(m_Polar, m_AngleAxis, datas[i], min, max, radius);
UGL.DrawLine(vh, startPos, nextPos, lineWidth, lineColor);
startPos = nextPos;
cp = GetPolarPos(m_SeriePolar, m_AngleAxis, datas[i], min, max, radius);
var np = i == datas.Count - 1 ? cp :
GetPolarPos(m_SeriePolar, m_AngleAxis, datas[i + 1], min, max, radius);
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
{
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())
@@ -108,11 +243,11 @@ namespace XCharts
if (!m_AngleAxis.clockwise)
{
angle = m_AngleAxis.startAngle - (float)serieData.GetData(1);
angle = m_AngleAxis.GetValueAngle((float)serieData.GetData(1));
}
else
{
angle = m_AngleAxis.startAngle + (float)serieData.GetData(1);
angle = m_AngleAxis.GetValueAngle((float)serieData.GetData(1));
}
var value = serieData.GetData(0);

View File

@@ -0,0 +1,64 @@
using System.Collections.Generic;
using System.Text;
using UnityEngine;
using UnityEngine.UI;
using XUGL;
namespace XCharts
{
/// <summary>
/// For grid coord
/// </summary>
[UnityEngine.Scripting.Preserve]
internal sealed partial class LineHandler : SerieHandler<Line>
{
public override void Update()
{
base.Update();
if (serie.IsUseCoord<GridCoord>())
UpdateSerieGridContext();
else if (serie.IsUseCoord<PolarCoord>())
UpdateSeriePolarContext();
}
public override void UpdateTooltipSerieParams(int dataIndex, bool showCategory, string category,
string marker, string itemFormatter, string numericFormatter,
ref List<SerieParams> paramList, ref string title)
{
UpdateCoordSerieParams(ref paramList, ref title, dataIndex, showCategory, category,
marker, itemFormatter, numericFormatter);
}
public override void DrawSerie(VertexHelper vh)
{
if (serie.IsUseCoord<PolarCoord>())
{
DrawPolarLine(vh, serie);
DrawPolarLineSymbol(vh);
}
else if (serie.IsUseCoord<GridCoord>())
{
DrawLineSerie(vh, serie);
if (!SeriesHelper.IsStack(chart.series))
{
DrawLinePoint(vh, serie);
DrawLineArrow(vh, serie);
}
}
}
public override void DrawTop(VertexHelper vh)
{
if (serie.IsUseCoord<GridCoord>())
{
if (SeriesHelper.IsStack(chart.series))
{
DrawLinePoint(vh, serie);
DrawLineArrow(vh, serie);
}
}
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 6e3a076ca3ee241c3b8b1088d4519dfa
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -15,7 +15,7 @@ namespace XCharts
public int containerIndex { get; internal set; }
public int containterInstanceId { get; internal set; }
public static void AddDefaultSerie(BaseChart chart, string serieName)
public static Serie AddDefaultSerie(BaseChart chart, string serieName)
{
var serie = chart.AddSerie<SimplifiedLine>(serieName);
serie.symbol.show = false;
@@ -28,6 +28,7 @@ namespace XCharts
lastValue += UnityEngine.Random.Range(-3, 5);
chart.AddData(serie.index, lastValue);
}
return serie;
}
public static SimplifiedLine CovertSerie(Serie serie)

View File

@@ -50,7 +50,7 @@ namespace XCharts
public int containerIndex { get { return vesselIndex; } }
public int containterInstanceId { get; internal set; }
public static void AddDefaultSerie(BaseChart chart, string serieName)
public static Serie AddDefaultSerie(BaseChart chart, string serieName)
{
chart.AddChartComponentWhenNoExist<Vessel>();
var serie = chart.AddSerie<Liquid>(serieName);
@@ -62,6 +62,7 @@ namespace XCharts
serie.label.formatter = "{d}%";
serie.label.textStyle.color = new Color32(70, 70, 240, 255);
chart.AddData(serie.index, UnityEngine.Random.Range(0, 100));
return serie;
}
}
}

View File

@@ -11,7 +11,7 @@ namespace XCharts
{
public int containerIndex { get; internal set; }
public int containterInstanceId { get; internal set; }
public static void AddDefaultSerie(BaseChart chart, string serieName)
public static Serie AddDefaultSerie(BaseChart chart, string serieName)
{
var serie = chart.AddSerie<Parallel>(serieName);
serie.lineStyle.width = 0.8f;
@@ -28,6 +28,7 @@ namespace XCharts
serie.AddData(data, "data" + i);
}
chart.RefreshChart();
return serie;
}
}
}

View File

@@ -10,12 +10,13 @@ namespace XCharts
{
public override bool useDataNameForColor { get { return true; } }
public static void AddDefaultSerie(BaseChart chart, string serieName)
public static Serie AddDefaultSerie(BaseChart chart, string serieName)
{
var serie = chart.AddSerie<Pie>(serieName);
chart.AddData(serie.index, 70, "pie1");
chart.AddData(serie.index, 20, "pie2");
chart.AddData(serie.index, 10, "pie3");
return serie;
}
public static Pie CovertSerie(Serie serie)

View File

@@ -14,7 +14,7 @@ namespace XCharts
public int containterInstanceId { get; internal set; }
public override bool useDataNameForColor { get { return true; } }
public static void AddDefaultSerie(BaseChart chart, string serieName)
public static Serie AddDefaultSerie(BaseChart chart, string serieName)
{
chart.AddChartComponentWhenNoExist<RadarCoord>();
var serie = chart.AddSerie<Radar>(serieName);
@@ -27,6 +27,7 @@ namespace XCharts
data.Add(Random.Range(20, 90));
}
chart.AddData(serie.index, data, "legendName");
return serie;
}
}
}

View File

@@ -9,7 +9,7 @@ namespace XCharts
public class Ring : Serie
{
public override bool useDataNameForColor { get { return true; } }
public static void AddDefaultSerie(BaseChart chart, string serieName)
public static Serie AddDefaultSerie(BaseChart chart, string serieName)
{
var serie = chart.AddSerie<Ring>(serieName);
serie.roundCap = true;
@@ -24,6 +24,7 @@ namespace XCharts
var value = Random.Range(30, 90);
var max = 100;
chart.AddData(serie.index, value, max, "data1");
return serie;
}
}
}

View File

@@ -9,7 +9,7 @@ namespace XCharts
[SerieExtraComponent(typeof(LabelStyle), typeof(Emphasis))]
public class EffectScatter : BaseScatter
{
public static void AddDefaultSerie(BaseChart chart, string serieName)
public static Serie AddDefaultSerie(BaseChart chart, string serieName)
{
var serie = chart.AddSerie<EffectScatter>(serieName);
serie.symbol.show = true;
@@ -20,6 +20,7 @@ namespace XCharts
{
chart.AddData(serie.index, Random.Range(10, 100), Random.Range(10, 100));
}
return serie;
}
}
}

View File

@@ -11,7 +11,7 @@ namespace XCharts
[SerieExtraComponent(typeof(LabelStyle), typeof(Emphasis))]
public class Scatter : BaseScatter
{
public static void AddDefaultSerie(BaseChart chart, string serieName)
public static Serie AddDefaultSerie(BaseChart chart, string serieName)
{
var serie = chart.AddSerie<Scatter>(serieName);
serie.symbol.show = true;
@@ -22,6 +22,7 @@ namespace XCharts
{
chart.AddData(serie.index, Random.Range(10, 100), Random.Range(10, 100));
}
return serie;
}
}
}

View File

@@ -47,6 +47,7 @@ namespace XCharts
public float angle { get; set; }
public Vector3 offsetCenter { get; set; }
public float stackHeight { get; set; }
public bool isClip { get; set; }
public bool canShowLabel = true;
public Image symbol { get; set; }