| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283 | using UnityEngine;using UnityEngine.UI;using XUGL;namespace XCharts.Runtime{    /// <summary>    /// For polar coord    /// </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);                    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;            lineWidth = serie.lineStyle.GetWidth(chart.theme.serie.lineWidth);            var needInteract = false;            if (m_LegendEnter)            {                serie.context.pointerEnter = true;                serie.interact.SetValue(ref needInteract, serie.animation.interaction.GetWidth(lineWidth));                for (int i = 0; i < serie.dataCount; i++)                {                    var serieData = serie.data[i];                    var size = SerieHelper.GetSysmbolSize(serie, serieData, themeSymbolSize, SerieState.Emphasis);                    serieData.context.highlight = true;                    serieData.interact.SetValue(ref needInteract, size);                }            }            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;            m_SeriePolar = chart.GetChartComponent<PolarCoord>(serie.polarIndex);            if (m_SeriePolar == null)                return;            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 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.context.colorIndex);            var lineWidth = serie.lineStyle.GetWidth(chart.theme.serie.lineWidth);            var currDetailProgress = 0f;            var totalDetailProgress = datas.Count;            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;            if (datas.Count <= 2)            {                for (int i = 0; i < datas.Count; i++)                {                    var serieData = datas[i];                    cp = PolarHelper.UpdatePolarAngleAndPos(m_SeriePolar, m_AngleAxis, m_RadiusAxis, datas[i]);                    serieData.context.position = cp;                    serie.context.dataPoints.Add(cp);                }                UGL.DrawLine(vh, serie.context.dataPoints, lineWidth, lineColor, false, false);            }            else            {                for (int i = 1; i < datas.Count; i++)                {                    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                    {                        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())            {                serie.animation.CheckProgress(totalDetailProgress);                serie.animation.CheckSymbol(serie.symbol.GetSize(null, chart.theme.serie.lineSymbolSize));                chart.RefreshChart();            }        }        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++)            {                var serie = chart.series[n];                if (!serie.show)                    continue;                if (!(serie is Line))                    continue;                var count = serie.dataCount;                float symbolBorder = 0f;                float[] cornerRadius = null;                Color32 symbolColor, symbolToColor, symbolEmptyColor, borderColor;                for (int i = 0; i < count; i++)                {                    var serieData = serie.GetSerieData(i);                    var state = SerieHelper.GetSerieState(serie, serieData, true);                    var symbol = SerieHelper.GetSerieSymbol(serie, serieData, state);                    if (ChartHelper.IsIngore(serieData.context.position))                        continue;                    if (!symbol.show || !symbol.ShowSymbol(i, count))                        continue;                    var symbolSize = SerieHelper.GetSysmbolSize(serie, serieData, chart.theme.serie.lineSymbolSize, state);                    SerieHelper.GetItemColor(out symbolColor, out symbolToColor, out symbolEmptyColor, serie, serieData, chart.theme, n);                    SerieHelper.GetSymbolInfo(out borderColor, out symbolBorder, out cornerRadius, serie, null, chart.theme, state);                    symbolSize = serie.animation.GetSysmbolSize(symbolSize);                    chart.DrawSymbol(vh, symbol.type, symbolSize, symbolBorder, serieData.context.position,                        symbolColor, symbolToColor, symbolEmptyColor, borderColor, symbol.gap, cornerRadius);                }            }        }    }}
 |