コード例 #1
0
ファイル: RadarChart.cs プロジェクト: zqbb/unity-ugui-XCharts
        private void DrawCricleRadar(VertexHelper vh)
        {
            float   insideRadius = 0, outsideRadius = 0;
            float   block        = m_Radar.radius / m_Radar.splitNumber;
            int     indicatorNum = m_Radar.indicatorList.Count;
            Vector3 p            = new Vector3(m_RadarCenterX, m_RadarCenterY);
            Vector3 p1;
            float   angle = 2 * Mathf.PI / indicatorNum;

            for (int i = 0; i < m_Radar.splitNumber; i++)
            {
                Color color = m_Radar.backgroundColorList[i % m_Radar.backgroundColorList.Count];
                outsideRadius = insideRadius + block;
                ChartHelper.DrawDoughnut(vh, p, insideRadius, outsideRadius, 0, 360, color);
                ChartHelper.DrawCicleNotFill(vh, p, outsideRadius, m_Radar.lineTickness,
                                             m_Radar.lineColor);
                insideRadius = outsideRadius;
            }
            for (int j = 0; j <= indicatorNum; j++)
            {
                float currAngle = j * angle;
                p1 = new Vector3(p.x + outsideRadius * Mathf.Sin(currAngle),
                                 p.y + outsideRadius * Mathf.Cos(currAngle));
                ChartHelper.DrawLine(vh, p, p1, m_Radar.lineTickness / 2, m_Radar.lineColor);
            }
        }
コード例 #2
0
        protected override void DrawChart(VertexHelper vh)
        {
            base.DrawChart(vh);
            UpdatePieCenter();
            float totalDegree = 360;
            float startDegree = 0;
            float dataTotal   = GetDataTotal();
            float dataMax     = GetDataMax();

            m_AngleList.Clear();
            for (int i = 0; i < m_Series.Count; i++)
            {
                if (!IsActive(i))
                {
                    m_AngleList.Add(0);
                    continue;
                }
                float value    = m_Series.series[i].data[0];
                float degree   = totalDegree * value / dataTotal;
                float toDegree = startDegree + degree;

                float outSideRadius = m_Pie.rose ?
                                      m_Pie.insideRadius + (m_PieRadius - m_Pie.insideRadius) * value / dataMax :
                                      m_PieRadius;
                if (m_Tooltip.show && m_Tooltip.dataIndex == i + 1)
                {
                    outSideRadius += m_Pie.tooltipExtraRadius;
                }
                ChartHelper.DrawDoughnut(vh, m_PieCenter, m_Pie.insideRadius,
                                         outSideRadius, startDegree, toDegree, m_ThemeInfo.GetColor(i));
                m_AngleList.Add(toDegree);
                startDegree = toDegree;
            }
        }
コード例 #3
0
        protected override void DrawChart(VertexHelper vh)
        {
            base.DrawChart(vh);
            UpdatePieCenter();
            float totalDegree = 360;
            float startDegree = 0;
            float dataTotal   = GetDataTotal();
            float dataMax     = GetDataMax();

            m_AngleList.Clear();
            for (int i = 0; i < m_Series.Count; i++)
            {
                if (!IsActive(i))
                {
                    m_AngleList.Add(0);
                    continue;
                }
                var data = m_Series.series[i].data;
                if (data.Count <= 0)
                {
                    m_AngleList.Add(0);
                    continue;
                }
                float value    = data[0];
                float degree   = totalDegree * value / dataTotal;
                float toDegree = startDegree + degree;

                float outSideRadius = m_Pie.rose ?
                                      m_Pie.insideRadius + (m_PieRadius - m_Pie.insideRadius) * value / dataMax :
                                      m_PieRadius;
                if (m_Tooltip.show && m_Tooltip.dataIndex == i + 1)
                {
                    outSideRadius += m_Pie.tooltipExtraRadius;
                }
                var offset = m_Pie.space;
                if (m_Pie.selected && m_Pie.selectedIndex == i + 1)
                {
                    offset += m_Pie.selectedOffset;
                }
                if (offset > 0)
                {
                    float currAngle    = (startDegree + (toDegree - startDegree) / 2) * Mathf.Deg2Rad;
                    var   offestCenter = new Vector3(m_PieCenter.x + offset * Mathf.Sin(currAngle),
                                                     m_PieCenter.y + offset * Mathf.Cos(currAngle));
                    ChartHelper.DrawDoughnut(vh, offestCenter, m_Pie.insideRadius, outSideRadius,
                                             startDegree, toDegree, m_ThemeInfo.GetColor(i));
                }
                else
                {
                    ChartHelper.DrawDoughnut(vh, m_PieCenter, m_Pie.insideRadius, outSideRadius,
                                             startDegree, toDegree, m_ThemeInfo.GetColor(i));
                }
                m_AngleList.Add(toDegree);
                startDegree = toDegree;
            }
        }
コード例 #4
0
ファイル: BaseChart.cs プロジェクト: footman136/dino-park
        protected void DrawSymbol(VertexHelper vh, SerieSymbolType type, float symbolSize,
                                  float tickness, Vector3 pos, Color color)
        {
            switch (type)
            {
            case SerieSymbolType.None:
                break;

            case SerieSymbolType.Circle:
                ChartHelper.DrawCricle(vh, pos, symbolSize, color, GetSymbolCricleSegment(symbolSize));
                break;

            case SerieSymbolType.EmptyCircle:
                int segment = GetSymbolCricleSegment(symbolSize);
                ChartHelper.DrawCricle(vh, pos, symbolSize, m_ThemeInfo.backgroundColor, segment);
                ChartHelper.DrawDoughnut(vh, pos, symbolSize - tickness, symbolSize, 0, 360, color, segment);
                break;

            case SerieSymbolType.Rect:
                ChartHelper.DrawPolygon(vh, pos, symbolSize, color);
                break;

            case SerieSymbolType.Triangle:
                var x  = symbolSize * Mathf.Cos(30 * Mathf.PI / 180);
                var y  = symbolSize * Mathf.Sin(30 * Mathf.PI / 180);
                var p1 = new Vector2(pos.x - x, pos.y - y);
                var p2 = new Vector2(pos.x, pos.y + symbolSize);
                var p3 = new Vector2(pos.x + x, pos.y - y);
                ChartHelper.DrawTriangle(vh, p1, p2, p3, color);
                break;

            case SerieSymbolType.Diamond:
                p1 = new Vector2(pos.x - symbolSize, pos.y);
                p2 = new Vector2(pos.x, pos.y + symbolSize);
                p3 = new Vector2(pos.x + symbolSize, pos.y);
                var p4 = new Vector2(pos.x, pos.y - symbolSize);
                ChartHelper.DrawPolygon(vh, p1, p2, p3, p4, color);
                break;
            }
        }
コード例 #5
0
        private void DrawCricleRadar(VertexHelper vh, Radar radar)
        {
            if (!radar.lineStyle.show && !radar.splitArea.show)
            {
                return;
            }
            float   insideRadius = 0, outsideRadius = 0;
            float   block        = radar.actualRadius / radar.splitNumber;
            int     indicatorNum = radar.indicatorList.Count;
            Vector3 p            = radar.centerPos;
            Vector3 p1;
            float   angle     = 2 * Mathf.PI / indicatorNum;
            var     lineColor = GetLineColor(radar);

            for (int i = 0; i < radar.splitNumber; i++)
            {
                Color color = radar.splitArea.color[i % radar.splitArea.color.Count];
                outsideRadius = insideRadius + block;
                if (radar.splitArea.show)
                {
                    ChartHelper.DrawDoughnut(vh, p, insideRadius, outsideRadius, 0, 360, color);
                }
                if (radar.lineStyle.show)
                {
                    ChartHelper.DrawCicleNotFill(vh, p, outsideRadius, radar.lineStyle.width, lineColor);
                }
                insideRadius = outsideRadius;
            }
            for (int j = 0; j <= indicatorNum; j++)
            {
                float currAngle = j * angle;
                p1 = new Vector3(p.x + outsideRadius * Mathf.Sin(currAngle),
                                 p.y + outsideRadius * Mathf.Cos(currAngle));
                if (radar.lineStyle.show)
                {
                    ChartHelper.DrawLine(vh, p, p1, radar.lineStyle.width / 2, lineColor);
                }
            }
        }
コード例 #6
0
        private void DrawXCategory(VertexHelper vh)
        {
            var stackSeries = m_Series.GetStackSeries();
            int seriesCount = stackSeries.Count;

            int            serieCount = 0;
            List <Vector3> points     = new List <Vector3>();
            List <Color>   colorList  = new List <Color>();
            int            dataCount  = 0;

            for (int j = 0; j < seriesCount; j++)
            {
                var seriesCurrHig = new Dictionary <int, float>();
                var serieList     = stackSeries[j];

                for (int n = 0; n < serieList.Count; n++)
                {
                    Serie serie = serieList[n];
                    DrawXLineSerie(vh, serieCount, serie, ref dataCount, ref points, ref colorList, ref seriesCurrHig);
                    if (serie.show)
                    {
                        serieCount++;
                    }
                }
                // draw point
                if (m_Line.point)
                {
                    for (int i = 0; i < points.Count; i++)
                    {
                        Vector3 p        = points[i];
                        float   pointWid = m_Line.pointWidth;
                        if (m_Tooltip.show && i % dataCount == m_Tooltip.dataIndex - 1)
                        {
                            pointWid = pointWid * 1.8f;
                        }
                        if (m_Theme == Theme.Dark)
                        {
                            ChartHelper.DrawCricle(vh, p, pointWid, colorList[i],
                                                   (int)m_Line.pointWidth * 5);
                        }
                        else
                        {
                            ChartHelper.DrawCricle(vh, p, pointWid, Color.white);
                            ChartHelper.DrawDoughnut(vh, p, pointWid - m_Line.tickness,
                                                     pointWid, 0, 360, colorList[i]);
                        }
                    }
                }
            }

            //draw tooltip line
            if (m_Tooltip.show && m_Tooltip.dataIndex > 0)
            {
                for (int i = 0; i < m_XAxises.Count; i++)
                {
                    var axis = m_XAxises[i];
                    if (!axis.show)
                    {
                        continue;
                    }
                    float splitWidth = axis.GetSplitWidth(coordinateWid, m_DataZoom);
                    float px         = coordinateX + (m_Tooltip.xValues[i] - 1) * splitWidth
                                       + (axis.boundaryGap ? splitWidth / 2 : 0);
                    Vector2 sp = new Vector2(px, coordinateY);
                    Vector2 ep = new Vector2(px, coordinateY + coordinateHig);
                    ChartHelper.DrawLine(vh, sp, ep, m_Coordinate.tickness, m_ThemeInfo.tooltipLineColor);
                    if (m_Tooltip.crossLabel)
                    {
                        sp = new Vector2(coordinateX, m_Tooltip.pointerPos.y);
                        ep = new Vector2(coordinateX + coordinateWid, m_Tooltip.pointerPos.y);
                        DrawSplitLine(vh, true, Axis.SplitLineType.Dashed, sp, ep, m_ThemeInfo.tooltipLineColor);
                    }
                }
            }
        }
コード例 #7
0
ファイル: RadarChart.cs プロジェクト: zqbb/unity-ugui-XCharts
        private void DrawData(VertexHelper vh)
        {
            int     indicatorNum = m_Radar.indicatorList.Count;
            var     angle        = 2 * Mathf.PI / indicatorNum;
            var     p            = new Vector3(m_RadarCenterX, m_RadarCenterY);
            Vector3 startPoint   = Vector3.zero;
            Vector3 toPoint      = Vector3.zero;
            Vector3 firstPoint   = Vector3.zero;

            dataPosList.Clear();
            dataPosList.Capacity = m_Series.Count;
            for (int i = 0; i < m_Series.Count; i++)
            {
                if (!IsActive(i))
                {
                    dataPosList.Add(new List <Vector3>());
                    continue;
                }
                var dataList  = m_Series.series[i].yData;
                var color     = m_ThemeInfo.GetColor(i);
                var areaColor = color;
                areaColor.a = (byte)m_Radar.areaAipha;

                List <Vector3> pointList = new List <Vector3>(dataList.Count);
                dataPosList.Add(pointList);
                for (int j = 0; j < dataList.Count; j++)
                {
                    var max = m_Radar.GetIndicatorMax(j) > 0 ?
                              m_Radar.GetIndicatorMax(j) :
                              GetMaxValue(j);
                    var radius = max < 0 ? m_Radar.radius - m_Radar.radius * dataList[j] / max
                        : m_Radar.radius * dataList[j] / max;
                    var currAngle = j * angle;
                    if (j == 0)
                    {
                        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 (m_Radar.area)
                        {
                            ChartHelper.DrawTriangle(vh, p, startPoint, toPoint, areaColor);
                        }
                        ChartHelper.DrawLine(vh, startPoint, toPoint, m_Radar.lineTickness, color);
                        startPoint = toPoint;
                    }
                    pointList.Add(startPoint);
                }
                if (m_Radar.area)
                {
                    ChartHelper.DrawTriangle(vh, p, startPoint, firstPoint, areaColor);
                }
                ChartHelper.DrawLine(vh, startPoint, firstPoint, m_Radar.lineTickness, color);
                foreach (var point in pointList)
                {
                    float radius = m_Radar.linePointSize - m_Radar.lineTickness * 2;

                    ChartHelper.DrawCricle(vh, point, radius, Color.white);
                    ChartHelper.DrawDoughnut(vh, point, radius, m_Radar.linePointSize, 0, 360, color);
                }
            }
        }
コード例 #8
0
        private void DrawXCategory(VertexHelper vh)
        {
            var            stackSeries  = m_Series.GetStackSeries();
            int            seriesCount  = stackSeries.Count;
            float          scaleWid     = m_XAxis.GetDataWidth(coordinateWid, m_DataZoom);
            int            serieCount   = 0;
            List <Vector3> points       = new List <Vector3>();
            List <Vector3> smoothPoints = new List <Vector3>();
            List <Color>   colorList    = new List <Color>();
            int            dataCount    = 0;

            for (int j = 0; j < seriesCount; j++)
            {
                var seriesCurrHig = new Dictionary <int, float>();
                var serieList     = stackSeries[j];

                for (int n = 0; n < serieList.Count; n++)
                {
                    Serie serie = serieList[n];
                    if (!IsActive(serie.name))
                    {
                        continue;
                    }
                    List <Vector3> lastPoints       = new List <Vector3>();
                    List <Vector3> lastSmoothPoints = new List <Vector3>();
                    List <float>   serieData        = serie.GetData(m_DataZoom);

                    Color   color    = m_ThemeInfo.GetColor(serieCount);
                    Vector3 lp       = Vector3.zero;
                    Vector3 np       = Vector3.zero;
                    float   startX   = zeroX + (m_XAxis.boundaryGap ? scaleWid / 2 : 0);
                    int     maxCount = maxShowDataNumber > 0 ?
                                       (maxShowDataNumber > serieData.Count ? serieData.Count : maxShowDataNumber)
                        : serieData.Count;
                    dataCount = (maxCount - minShowDataNumber);
                    if (m_Line.area && points.Count > 0)
                    {
                        if (!m_Line.smooth && points.Count > 0)
                        {
                            for (int m = points.Count - dataCount; m < points.Count; m++)
                            {
                                lastPoints.Add(points[m]);
                            }
                        }
                        else if (m_Line.smooth && smoothPoints.Count > 0)
                        {
                            for (int m = 0; m < smoothPoints.Count; m++)
                            {
                                lastSmoothPoints.Add(smoothPoints[m]);
                            }
                            smoothPoints.Clear();
                        }
                    }
                    int smoothPointCount = 1;
                    for (int i = minShowDataNumber; i < maxCount; i++)
                    {
                        if (!seriesCurrHig.ContainsKey(i))
                        {
                            seriesCurrHig[i] = 0;
                        }
                        float value   = serieData[i];
                        float pX      = startX + i * scaleWid;
                        float pY      = seriesCurrHig[i] + zeroY + m_Coordinate.tickness;
                        float dataHig = value / (maxValue - minValue) * coordinateHig;

                        np = new Vector3(pX, pY + dataHig);

                        if (i > 0)
                        {
                            if (m_Line.step)
                            {
                                Vector2 middle1, middle2;
                                switch (m_Line.stepTpe)
                                {
                                case Line.StepType.Start:
                                    middle1 = new Vector2(lp.x, np.y + m_Line.tickness);
                                    middle2 = new Vector2(lp.x - m_Line.tickness, np.y);
                                    ChartHelper.DrawLine(vh, lp, middle1, m_Line.tickness, color);
                                    ChartHelper.DrawLine(vh, middle2, np, m_Line.tickness, color);
                                    if (m_Line.area)
                                    {
                                        Color areaColor = new Color(color.r, color.g, color.b, color.a * 0.75f);
                                        ChartHelper.DrawPolygon(vh, new Vector2(middle1.x, zeroY), middle1, np,
                                                                new Vector2(np.x, zeroY), areaColor);
                                    }
                                    break;

                                case Line.StepType.Middle:
                                    middle1 = new Vector2((lp.x + np.x) / 2 + m_Line.tickness, lp.y);
                                    middle2 = new Vector2((lp.x + np.x) / 2 - m_Line.tickness, np.y);
                                    ChartHelper.DrawLine(vh, lp, middle1, m_Line.tickness, color);
                                    ChartHelper.DrawLine(vh, new Vector2(middle1.x - m_Line.tickness, middle1.y),
                                                         new Vector2(middle2.x + m_Line.tickness, middle2.y), m_Line.tickness, color);
                                    ChartHelper.DrawLine(vh, middle2, np, m_Line.tickness, color);
                                    if (m_Line.area)
                                    {
                                        Color areaColor = new Color(color.r, color.g, color.b, color.a * 0.75f);
                                        ChartHelper.DrawPolygon(vh, new Vector2(lp.x, zeroY), lp, middle1,
                                                                new Vector2(middle1.x, zeroY), areaColor);
                                        ChartHelper.DrawPolygon(vh, new Vector2(middle2.x + 2 * m_Line.tickness, zeroY),
                                                                new Vector2(middle2.x + 2 * m_Line.tickness, middle2.y), np,
                                                                new Vector2(np.x, zeroY), areaColor);
                                    }
                                    break;

                                case Line.StepType.End:
                                    middle1 = new Vector2(np.x + m_Line.tickness, lp.y);
                                    middle2 = new Vector2(np.x, lp.y);
                                    ChartHelper.DrawLine(vh, lp, middle1, m_Line.tickness, color);
                                    ChartHelper.DrawLine(vh, middle2, np, m_Line.tickness, color);
                                    if (m_Line.area)
                                    {
                                        Color areaColor = new Color(color.r, color.g, color.b, color.a * 0.75f);
                                        ChartHelper.DrawPolygon(vh, new Vector2(lp.x, zeroY), lp,
                                                                new Vector2(middle1.x - m_Line.tickness, middle1.y),
                                                                new Vector2(middle1.x - m_Line.tickness, zeroY), areaColor);
                                    }
                                    break;
                                }
                            }
                            else if (m_Line.smooth)
                            {
                                var     list = ChartHelper.GetBezierList(lp, np, m_Line.smoothStyle);
                                Vector3 start, to;
                                start = list[0];
                                for (int k = 1; k < list.Length; k++)
                                {
                                    smoothPoints.Add(list[k]);
                                    to = list[k];
                                    ChartHelper.DrawLine(vh, start, to, m_Line.tickness, color);

                                    if (m_Line.area)
                                    {
                                        Vector3 alp = new Vector3(start.x, start.y - m_Line.tickness);
                                        Vector3 anp = new Vector3(to.x, to.y - m_Line.tickness);
                                        Vector3 tnp = serieCount > 0 ?
                                                      (smoothPointCount > lastSmoothPoints.Count - 1 ?
                                                       new Vector3(lastSmoothPoints[lastSmoothPoints.Count - 1].x,
                                                                   lastSmoothPoints[lastSmoothPoints.Count - 1].y + m_Line.tickness) :
                                                       new Vector3(lastSmoothPoints[smoothPointCount].x,
                                                                   lastSmoothPoints[smoothPointCount].y + m_Line.tickness)) :
                                                      new Vector3(to.x, zeroY + m_Coordinate.tickness);
                                        Vector3 tlp = serieCount > 0 ?
                                                      (smoothPointCount > lastSmoothPoints.Count - 1 ?
                                                       new Vector3(lastSmoothPoints[lastSmoothPoints.Count - 2].x,
                                                                   lastSmoothPoints[lastSmoothPoints.Count - 2].y + m_Line.tickness) :
                                                       new Vector3(lastSmoothPoints[smoothPointCount - 1].x,
                                                                   lastSmoothPoints[smoothPointCount - 1].y + m_Line.tickness)) :
                                                      new Vector3(start.x, zeroY + m_Coordinate.tickness);
                                        Color areaColor = new Color(color.r, color.g, color.b, color.a * 0.75f);
                                        ChartHelper.DrawPolygon(vh, alp, anp, tnp, tlp, areaColor);
                                    }
                                    smoothPointCount++;
                                    start = to;
                                }
                            }
                            else
                            {
                                ChartHelper.DrawLine(vh, lp, np, m_Line.tickness, color);
                                if (m_Line.area)
                                {
                                    Vector3 alp       = new Vector3(lp.x, lp.y - m_Line.tickness);
                                    Vector3 anp       = new Vector3(np.x, np.y - m_Line.tickness);
                                    Color   areaColor = new Color(color.r, color.g, color.b, color.a * 0.75f);
                                    var     cross     = ChartHelper.GetIntersection(lp, np, new Vector3(zeroX, zeroY),
                                                                                    new Vector3(zeroX + coordinateWid, zeroY));
                                    if (cross == Vector3.zero)
                                    {
                                        Vector3 tnp = serieCount > 0 ?
                                                      new Vector3(lastPoints[i].x, lastPoints[i].y + m_Line.tickness) :
                                                      new Vector3(np.x, zeroY + m_Coordinate.tickness);
                                        Vector3 tlp = serieCount > 0 ?
                                                      new Vector3(lastPoints[i - 1].x, lastPoints[i - 1].y + m_Line.tickness) :
                                                      new Vector3(lp.x, zeroY + m_Coordinate.tickness);
                                        ChartHelper.DrawPolygon(vh, alp, anp, tnp, tlp, areaColor);
                                    }
                                    else
                                    {
                                        Vector3 cross1 = new Vector3(cross.x, cross.y + (alp.y > zeroY ? m_Coordinate.tickness : -m_Coordinate.tickness));
                                        Vector3 cross2 = new Vector3(cross.x, cross.y + (anp.y > zeroY ? m_Coordinate.tickness : -m_Coordinate.tickness));
                                        Vector3 xp1    = new Vector3(alp.x, zeroY + (alp.y > zeroY ? m_Coordinate.tickness : -m_Coordinate.tickness));
                                        Vector3 xp2    = new Vector3(anp.x, zeroY + (anp.y > zeroY ? m_Coordinate.tickness : -m_Coordinate.tickness));
                                        ChartHelper.DrawTriangle(vh, alp, cross1, xp1, areaColor);
                                        ChartHelper.DrawTriangle(vh, anp, cross2, xp2, areaColor);
                                    }
                                }
                            }
                        }
                        if (m_Line.point)
                        {
                            points.Add(np);
                            colorList.Add(color);
                        }
                        seriesCurrHig[i] += dataHig;
                        lp = np;
                    }
                    if (serie.show)
                    {
                        serieCount++;
                    }
                }
                // draw point
                if (m_Line.point)
                {
                    for (int i = 0; i < points.Count; i++)
                    {
                        Vector3 p        = points[i];
                        float   pointWid = m_Line.pointWidth;
                        if (m_Tooltip.show && i % dataCount == m_Tooltip.dataIndex - 1)
                        {
                            pointWid = pointWid * 1.8f;
                        }
                        if (m_Theme == Theme.Dark)
                        {
                            ChartHelper.DrawCricle(vh, p, pointWid, colorList[i],
                                                   (int)m_Line.pointWidth * 5);
                        }
                        else
                        {
                            ChartHelper.DrawCricle(vh, p, pointWid, Color.white);
                            ChartHelper.DrawDoughnut(vh, p, pointWid - m_Line.tickness,
                                                     pointWid, 0, 360, colorList[i]);
                        }
                    }
                }
            }

            //draw tooltip line
            if (m_Tooltip.show && m_Tooltip.dataIndex > 0)
            {
                float splitWidth = m_XAxis.GetSplitWidth(coordinateWid, m_DataZoom);
                float px         = zeroX + (m_Tooltip.dataIndex - 1) * splitWidth
                                   + (m_XAxis.boundaryGap ? splitWidth / 2 : 0);
                Vector2 sp = new Vector2(px, coordinateY);
                Vector2 ep = new Vector2(px, coordinateY + coordinateHig);
                ChartHelper.DrawLine(vh, sp, ep, m_Coordinate.tickness, m_ThemeInfo.tooltipLineColor);
                if (m_Tooltip.crossLabel)
                {
                    sp = new Vector2(zeroX, m_Tooltip.pointerPos.y);
                    ep = new Vector2(zeroX + coordinateWid, m_Tooltip.pointerPos.y);
                    DrawSplitLine(vh, true, Axis.SplitLineType.Dashed, sp, ep, m_ThemeInfo.tooltipLineColor);
                }
            }
        }
コード例 #9
0
        protected override void DrawChart(VertexHelper vh)
        {
            base.DrawChart(vh);
            serieNameSet.Clear();
            int  serieNameCount  = -1;
            bool isClickOffset   = false;
            bool isDataHighlight = false;

            for (int i = 0; i < m_Series.Count; i++)
            {
                var serie = m_Series.series[i];
                serie.index = i;
                var data = serie.data;
                serie.animation.InitProgress(data.Count, 0, 360);
                if (!serie.show)
                {
                    continue;
                }
                if (!serie.animation.NeedAnimation(i))
                {
                    break;
                }
                bool isFinish = true;
                if (serie.pieClickOffset)
                {
                    isClickOffset = true;
                }
                PieTempData tempData;
                if (i < m_PieTempDataList.Count)
                {
                    tempData = m_PieTempDataList[i];
                    tempData.angleList.Clear();
                }
                else
                {
                    tempData = new PieTempData();
                    m_PieTempDataList.Add(tempData);
                }
                tempData.angleList.Clear();
                tempData.dataMax   = serie.yMax;
                tempData.dataTotal = serie.yTotal;
                UpdatePieCenter(serie);

                float totalDegree   = 360;
                float startDegree   = 0;
                int   showdataCount = 0;

                foreach (var sd in serie.data)
                {
                    if (sd.show && serie.pieRoseType == RoseType.Area)
                    {
                        showdataCount++;
                    }
                    sd.canShowLabel = false;
                }

                for (int n = 0; n < data.Count; n++)
                {
                    var    serieData = data[n];
                    float  value     = serieData.data[1];
                    string dataName  = serieData.name;
                    Color  color;
                    if (string.IsNullOrEmpty(dataName))
                    {
                        serieNameCount++;
                        color = m_ThemeInfo.GetColor(serieNameCount);
                    }
                    else if (!serieNameSet.ContainsKey(dataName))
                    {
                        serieNameSet.Add(dataName, serieNameCount);
                        serieNameCount++;
                        color = m_ThemeInfo.GetColor(serieNameCount);
                    }
                    else
                    {
                        color = m_ThemeInfo.GetColor(serieNameSet[dataName]);
                    }
                    if (!serieData.show)
                    {
                        tempData.angleList.Add(0);
                        continue;
                    }
                    float degree   = serie.pieRoseType == RoseType.Area ? (totalDegree / showdataCount) : (totalDegree * value / tempData.dataTotal);
                    float toDegree = startDegree + degree;

                    float outSideRadius = serie.pieRoseType > 0 ?
                                          tempData.insideRadius + (tempData.outsideRadius - tempData.insideRadius) * value / tempData.dataMax :
                                          tempData.outsideRadius;
                    if (serieData.highlighted)
                    {
                        isDataHighlight = true;
                        color          *= 1.2f;
                        outSideRadius  += m_Pie.tooltipExtraRadius;
                    }
                    var offset = serie.pieSpace;
                    if (serie.pieClickOffset && serieData.selected)
                    {
                        offset += m_Pie.selectedOffset;
                    }
                    var   halfDegree = (toDegree - startDegree) / 2;
                    float currAngle  = startDegree + halfDegree;
                    float currRad    = currAngle * Mathf.Deg2Rad;
                    float currSin    = Mathf.Sin(currRad);
                    float currCos    = Mathf.Cos(currRad);
                    var   center     = tempData.center;

                    var currDegree = toDegree;
                    if (serie.animation.CheckDetailBreak(n, toDegree))
                    {
                        isFinish   = false;
                        currDegree = serie.animation.GetCurrDetail();
                    }
                    if (offset > 0)
                    {
                        float offsetRadius  = serie.pieSpace / Mathf.Sin(halfDegree * Mathf.Deg2Rad);
                        var   insideRadius  = tempData.insideRadius - offsetRadius;
                        var   outsideRadius = outSideRadius - offsetRadius;
                        if (serie.pieClickOffset && serieData.selected)
                        {
                            offsetRadius += m_Pie.selectedOffset;
                            if (insideRadius > 0)
                            {
                                insideRadius += m_Pie.selectedOffset;
                            }
                            outsideRadius += m_Pie.selectedOffset;
                        }

                        var offestCenter = new Vector3(center.x + offsetRadius * currSin,
                                                       center.y + offsetRadius * currCos);

                        ChartHelper.DrawDoughnut(vh, offestCenter, insideRadius, outsideRadius,
                                                 startDegree, currDegree, color);
                    }
                    else
                    {
                        ChartHelper.DrawDoughnut(vh, center, tempData.insideRadius, outSideRadius,
                                                 startDegree, currDegree, color);
                    }
                    serieData.canShowLabel = currDegree >= currAngle;
                    if (currDegree >= currAngle)
                    {
                        DrawLabelLine(vh, serie, tempData, outSideRadius, center, currAngle, color);
                    }
                    isDrawPie = true;
                    tempData.angleList.Add(toDegree);
                    startDegree = toDegree;
                    if (isFinish)
                    {
                        serie.animation.SetDataFinish(n);
                    }
                    else
                    {
                        break;
                    }
                }
                if (!serie.animation.IsFinish())
                {
                    float duration    = serie.animation.duration > 0 ? (float)serie.animation.duration / 1000 : 1;
                    float speed       = 360 / duration;
                    float symbolSpeed = serie.symbol.size / duration;
                    serie.animation.CheckProgress(Time.deltaTime * speed);
                    serie.animation.CheckSymbol(Time.deltaTime * symbolSpeed, serie.symbol.size);
                    RefreshChart();
                }
            }
            DrawLabelBackground(vh);
            raycastTarget = isClickOffset && isDataHighlight;
        }
コード例 #10
0
ファイル: PieChart.cs プロジェクト: degyss/unity-ugui-XCharts
        protected override void DrawChart(VertexHelper vh)
        {
            base.DrawChart(vh);
            serieNameSet.Clear();
            int  serieNameCount  = -1;
            bool isClickOffset   = false;
            bool isDataHighlight = false;

            for (int i = 0; i < m_Series.Count; i++)
            {
                var serie = m_Series.series[i];
                serie.index = i;

                if (!serie.show)
                {
                    continue;
                }
                if (serie.clickOffset)
                {
                    isClickOffset = true;
                }
                PieTempData tempData;
                if (i < m_PieTempDataList.Count)
                {
                    tempData = m_PieTempDataList[i];
                    tempData.angleList.Clear();
                }
                else
                {
                    tempData = new PieTempData();
                    m_PieTempDataList.Add(tempData);
                }
                tempData.angleList.Clear();
                tempData.dataMax   = serie.yMax;
                tempData.dataTotal = serie.yTotal;
                UpdatePieCenter(serie);
                var data = serie.data;

                float totalDegree   = 360;
                float startDegree   = 0;
                int   showdataCount = 0;
                if (serie.roseType == RoseType.Area)
                {
                    foreach (var sd in serie.data)
                    {
                        if (sd.show)
                        {
                            showdataCount++;
                        }
                    }
                }
                for (int n = 0; n < data.Count; n++)
                {
                    var    serieData = data[n];
                    float  value     = serieData.data[1];
                    string dataName  = serieData.name;
                    Color  color;
                    if (string.IsNullOrEmpty(dataName))
                    {
                        serieNameCount++;
                        color = m_ThemeInfo.GetColor(serieNameCount);
                    }
                    else if (!serieNameSet.ContainsKey(dataName))
                    {
                        serieNameSet.Add(dataName, serieNameCount);
                        serieNameCount++;
                        color = m_ThemeInfo.GetColor(serieNameCount);
                    }
                    else
                    {
                        color = m_ThemeInfo.GetColor(serieNameSet[dataName]);
                    }
                    if (!serieData.show)
                    {
                        tempData.angleList.Add(0);
                        continue;
                    }
                    float degree   = serie.roseType == RoseType.Area ? (totalDegree / showdataCount) : (totalDegree * value / tempData.dataTotal);
                    float toDegree = startDegree + degree;

                    float outSideRadius = serie.roseType > 0 ?
                                          tempData.insideRadius + (tempData.outsideRadius - tempData.insideRadius) * value / tempData.dataMax :
                                          tempData.outsideRadius;
                    if (serieData.highlighted)
                    {
                        isDataHighlight = true;
                        color          *= 1.2f;
                        outSideRadius  += m_Pie.tooltipExtraRadius;
                    }
                    var offset = serie.space;
                    if (serie.clickOffset && serieData.selected)
                    {
                        offset += m_Pie.selectedOffset;
                    }
                    var   halfDegree = (toDegree - startDegree) / 2;
                    float currAngle  = startDegree + halfDegree;
                    float currRad    = currAngle * Mathf.Deg2Rad;
                    float currSin    = Mathf.Sin(currRad);
                    float currCos    = Mathf.Cos(currRad);
                    var   center     = tempData.center;
                    if (offset > 0)
                    {
                        float offsetRadius  = serie.space / Mathf.Sin(halfDegree * Mathf.Deg2Rad);
                        var   insideRadius  = tempData.insideRadius - offsetRadius;
                        var   outsideRadius = outSideRadius - offsetRadius;
                        if (serie.clickOffset && serieData.selected)
                        {
                            offsetRadius += m_Pie.selectedOffset;
                            if (insideRadius > 0)
                            {
                                insideRadius += m_Pie.selectedOffset;
                            }
                            outsideRadius += m_Pie.selectedOffset;
                        }

                        var offestCenter = new Vector3(center.x + offsetRadius * currSin,
                                                       center.y + offsetRadius * currCos);

                        ChartHelper.DrawDoughnut(vh, offestCenter, insideRadius, outsideRadius,
                                                 startDegree, toDegree, color);
                    }
                    else
                    {
                        ChartHelper.DrawDoughnut(vh, center, tempData.insideRadius, outSideRadius,
                                                 startDegree, toDegree, color);
                    }
                    DrawLabelLine(vh, serie, tempData, outSideRadius, center, currAngle, color);
                    isDrawPie = true;
                    tempData.angleList.Add(toDegree);
                    startDegree = toDegree;
                }
            }
            raycastTarget = isClickOffset && isDataHighlight;
        }
コード例 #11
0
        protected override void DrawChart(VertexHelper vh)
        {
            base.DrawChart(vh);
            UpdatePieCenter();
            float totalDegree = 360;
            float startDegree = 0;
            float dataTotal   = GetDataTotal();
            float dataMax     = GetDataMax();

            m_AngleList.Clear();
            serieNameSet.Clear();
            int serieNameCount = -1;

            for (int i = 0; i < m_Series.Count; i++)
            {
                var serie = m_Series.series[i];
                serie.index = i;
                var data = serie.yData;
                if (string.IsNullOrEmpty(serie.name))
                {
                    serieNameCount++;
                }
                else if (!serieNameSet.Contains(serie.name))
                {
                    serieNameSet.Add(serie.name);
                    serieNameCount++;
                }
                if (data.Count <= 0 || !serie.show)
                {
                    m_AngleList.Add(i > 0 ? m_AngleList[i - 1] : 0);
                    continue;
                }
                float value    = data[0];
                float degree   = totalDegree * value / dataTotal;
                float toDegree = startDegree + degree;

                float outSideRadius = m_Pie.rose ?
                                      m_Pie.insideRadius + (m_PieRadius - m_Pie.insideRadius) * value / dataMax :
                                      m_PieRadius;
                if (m_Tooltip.show && m_Tooltip.dataIndex[0] == i)
                {
                    outSideRadius += m_Pie.tooltipExtraRadius;
                }
                var offset = m_Pie.space;
                if (m_Pie.selected && m_Pie.selectedIndex == i)
                {
                    offset += m_Pie.selectedOffset;
                }
                if (offset > 0)
                {
                    float currAngle    = (startDegree + (toDegree - startDegree) / 2) * Mathf.Deg2Rad;
                    var   offestCenter = new Vector3(m_PieCenter.x + offset * Mathf.Sin(currAngle),
                                                     m_PieCenter.y + offset * Mathf.Cos(currAngle));
                    ChartHelper.DrawDoughnut(vh, offestCenter, m_Pie.insideRadius, outSideRadius,
                                             startDegree, toDegree, m_ThemeInfo.GetColor(serieNameCount));
                }
                else
                {
                    ChartHelper.DrawDoughnut(vh, m_PieCenter, m_Pie.insideRadius, outSideRadius,
                                             startDegree, toDegree, m_ThemeInfo.GetColor(serieNameCount));
                }
                m_AngleList.Add(toDegree);
                startDegree = toDegree;
            }
        }
コード例 #12
0
        private void DrawXCategory(VertexHelper vh)
        {
            int seriesCount = m_Series.Count;
            float scaleWid = m_XAxis.GetDataWidth(coordinateWid);
            for (int j = 0; j < seriesCount; j++)
            {
                if (!IsActive(j)) continue;
                Serie serie = m_Series.series[j];
                Color32 color = m_ThemeInfo.GetColor(j);
                Vector3 lp = Vector3.zero;
                Vector3 np = Vector3.zero;
                float startX = zeroX + (m_XAxis.boundaryGap ? scaleWid / 2 : 0);

                int maxCount = maxShowDataNumber > 0 ?
                            (maxShowDataNumber > serie.data.Count ? serie.data.Count : maxShowDataNumber)
                            : serie.data.Count;

                for (int i = minShowDataNumber; i < maxCount; i++)
                {
                    float value = serie.data[i];
                    float dataHig = coordinateY + (value - minValue) / (maxValue - minValue) * coordinateHig;
                    np = new Vector3(startX + i * scaleWid, dataHig);
                    if (i > 0)
                    {
                        if (m_Line.smooth)
                        {
                            var list = ChartHelper.GetBezierList(lp, np, m_Line.smoothStyle);
                            Vector3 start, to;
                            start = list[0];
                            for (int k = 1; k < list.Length; k++)
                            {
                                to = list[k];
                                ChartHelper.DrawLine(vh, start, to, m_Line.tickness, color);
                                start = to;
                            }
                        }
                        else
                        {
                            ChartHelper.DrawLine(vh, lp, np, m_Line.tickness, color);
                            if (m_Line.area)
                            {
                                ChartHelper.DrawPolygon(vh, lp, np, new Vector3(np.x, zeroY),
                                    new Vector3(lp.x, zeroY), color);
                            }
                        }

                    }
                    lp = np;
                }
                // draw point
                if (m_Line.point)
                {
                    for (int i = 0; i < serie.data.Count; i++)
                    {
                        float value = serie.data[i];
                        float dataHig = coordinateY + (value - minValue) / (maxValue - minValue) * coordinateHig;
                        Vector3 p = new Vector3(startX + i * scaleWid, dataHig);
                        float pointWid = m_Line.pointWidth;
                        if (m_Tooltip.show && i == m_Tooltip.dataIndex - 1)
                        {
                            pointWid = pointWid * 1.8f;
                        }
                        if (m_Theme == Theme.Dark)
                        {

                            ChartHelper.DrawCricle(vh, p, pointWid, color,
                                (int)m_Line.pointWidth * 5);
                        }
                        else
                        {
                            ChartHelper.DrawCricle(vh, p, pointWid, Color.white);
                            ChartHelper.DrawDoughnut(vh, p, pointWid - m_Line.tickness,
                                pointWid, 0, 360, color);
                        }
                    }
                }
            }
            //draw tooltip line
            if (m_Tooltip.show && m_Tooltip.dataIndex > 0)
            {
                float splitWidth = m_XAxis.GetSplitWidth(coordinateWid);
                float px = zeroX + (m_Tooltip.dataIndex - 1) * splitWidth + (m_XAxis.boundaryGap ? splitWidth / 2 : 0);
                Vector2 sp = new Vector2(px, coordinateY);
                Vector2 ep = new Vector2(px, coordinateY + coordinateHig);
                ChartHelper.DrawLine(vh, sp, ep, m_Coordinate.tickness, m_ThemeInfo.tooltipFlagAreaColor);
            }
        }