Example #1
0
        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);
            }
        }
        private void DrawDataZoom(VertexHelper vh)
        {
            if (!m_DataZoom.show)
            {
                return;
            }
            var p1 = new Vector2(coordinateX, m_DataZoom.bottom);
            var p2 = new Vector2(coordinateX, m_DataZoom.bottom + m_DataZoom.height);
            var p3 = new Vector2(coordinateX + coordinateWid, m_DataZoom.bottom + m_DataZoom.height);
            var p4 = new Vector2(coordinateX + coordinateWid, m_DataZoom.bottom);

            ChartHelper.DrawLine(vh, p1, p2, m_Coordinate.tickness, m_ThemeInfo.dataZoomLineColor);
            ChartHelper.DrawLine(vh, p2, p3, m_Coordinate.tickness, m_ThemeInfo.dataZoomLineColor);
            ChartHelper.DrawLine(vh, p3, p4, m_Coordinate.tickness, m_ThemeInfo.dataZoomLineColor);
            ChartHelper.DrawLine(vh, p4, p1, m_Coordinate.tickness, m_ThemeInfo.dataZoomLineColor);
            if (m_DataZoom.showDataShadow && m_Series.Count > 0)
            {
                Serie   serie    = m_Series.series[0];
                float   scaleWid = coordinateWid / (serie.data.Count - 1);
                Vector3 lp       = Vector3.zero;
                Vector3 np       = Vector3.zero;
                for (int i = 0; i < serie.data.Count; i++)
                {
                    float value   = serie.data[i];
                    float pX      = zeroX + i * scaleWid;
                    float dataHig = value / (maxValue - minValue) * m_DataZoom.height;
                    np = new Vector3(pX, m_DataZoom.bottom + dataHig);
                    if (i > 0)
                    {
                        Color color = m_ThemeInfo.dataZoomLineColor;
                        ChartHelper.DrawLine(vh, lp, np, m_Coordinate.tickness, color);
                        Vector3 alp       = new Vector3(lp.x, lp.y - m_Coordinate.tickness);
                        Vector3 anp       = new Vector3(np.x, np.y - m_Coordinate.tickness);
                        Color   areaColor = new Color(color.r, color.g, color.b, color.a * 0.75f);
                        Vector3 tnp       = new Vector3(np.x, m_DataZoom.bottom + m_Coordinate.tickness);
                        Vector3 tlp       = new Vector3(lp.x, m_DataZoom.bottom + m_Coordinate.tickness);
                        ChartHelper.DrawPolygon(vh, alp, anp, tnp, tlp, areaColor);
                    }
                    lp = np;
                }
            }
            switch (m_DataZoom.rangeMode)
            {
            case DataZoom.RangeMode.Percent:
                var start = coordinateX + coordinateWid * m_DataZoom.start / 100;
                var end   = coordinateX + coordinateWid * m_DataZoom.end / 100;
                p1 = new Vector2(start, m_DataZoom.bottom);
                p2 = new Vector2(start, m_DataZoom.bottom + m_DataZoom.height);
                p3 = new Vector2(end, m_DataZoom.bottom + m_DataZoom.height);
                p4 = new Vector2(end, m_DataZoom.bottom);
                ChartHelper.DrawPolygon(vh, p1, p2, p3, p4, m_ThemeInfo.dataZoomSelectedColor);
                ChartHelper.DrawLine(vh, p1, p2, m_Coordinate.tickness, m_ThemeInfo.dataZoomSelectedColor);
                ChartHelper.DrawLine(vh, p3, p4, m_Coordinate.tickness, m_ThemeInfo.dataZoomSelectedColor);
                break;
            }
        }
Example #3
0
        private void DrawRadar(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 p1, p2, p3, p4;
            Vector3 p         = radar.centerPos;
            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;
                p1            = new Vector3(p.x + insideRadius * Mathf.Sin(0), p.y + insideRadius * Mathf.Cos(0));
                p2            = new Vector3(p.x + outsideRadius * Mathf.Sin(0), p.y + outsideRadius * Mathf.Cos(0));
                for (int j = 0; j <= indicatorNum; j++)
                {
                    float currAngle = j * angle;
                    p3 = new Vector3(p.x + outsideRadius * Mathf.Sin(currAngle),
                                     p.y + outsideRadius * Mathf.Cos(currAngle));
                    p4 = new Vector3(p.x + insideRadius * Mathf.Sin(currAngle),
                                     p.y + insideRadius * Mathf.Cos(currAngle));
                    if (radar.splitArea.show)
                    {
                        ChartHelper.DrawPolygon(vh, p1, p2, p3, p4, color);
                    }
                    if (radar.lineStyle.show)
                    {
                        ChartHelper.DrawLine(vh, p2, p3, radar.lineStyle.width, lineColor);
                    }
                    p1 = p4;
                    p2 = p3;
                }
                insideRadius = outsideRadius;
            }
            for (int j = 0; j <= indicatorNum; j++)
            {
                float currAngle = j * angle;
                p3 = new Vector3(p.x + outsideRadius * Mathf.Sin(currAngle),
                                 p.y + outsideRadius * Mathf.Cos(currAngle));
                if (radar.lineStyle.show)
                {
                    ChartHelper.DrawLine(vh, p, p3, radar.lineStyle.width / 2, lineColor);
                }
            }
        }
Example #4
0
        protected void DrawLabelBackground(VertexHelper vh, Serie serie, SerieData serieData)
        {
            var labelHalfWid = serieData.GetLabelWidth() / 2;
            var labelHalfHig = serieData.GetLabelHeight() / 2;
            var centerPos    = serieData.labelPosition;
            var p1           = new Vector3(centerPos.x - labelHalfWid, centerPos.y + labelHalfHig);
            var p2           = new Vector3(centerPos.x + labelHalfWid, centerPos.y + labelHalfHig);
            var p3           = new Vector3(centerPos.x + labelHalfWid, centerPos.y - labelHalfHig);
            var p4           = new Vector3(centerPos.x - labelHalfWid, centerPos.y - labelHalfHig);

            if (serie.label.rotate > 0)
            {
                p1 = ChartHelper.RotateRound(p1, centerPos, Vector3.forward, serie.label.rotate);
                p2 = ChartHelper.RotateRound(p2, centerPos, Vector3.forward, serie.label.rotate);
                p3 = ChartHelper.RotateRound(p3, centerPos, Vector3.forward, serie.label.rotate);
                p4 = ChartHelper.RotateRound(p4, centerPos, Vector3.forward, serie.label.rotate);
            }

            ChartHelper.DrawPolygon(vh, p1, p2, p3, p4, serie.label.backgroundColor);

            if (serie.label.border)
            {
                var borderWid = serie.label.borderWidth;
                p1 = new Vector3(centerPos.x - labelHalfWid, centerPos.y + labelHalfHig + borderWid);
                p2 = new Vector3(centerPos.x + labelHalfWid + 2 * borderWid, centerPos.y + labelHalfHig + borderWid);
                p3 = new Vector3(centerPos.x + labelHalfWid + borderWid, centerPos.y + labelHalfHig);
                p4 = new Vector3(centerPos.x + labelHalfWid + borderWid, centerPos.y - labelHalfHig - 2 * borderWid);
                var p5 = new Vector3(centerPos.x + labelHalfWid, centerPos.y - labelHalfHig - borderWid);
                var p6 = new Vector3(centerPos.x - labelHalfWid - 2 * borderWid, centerPos.y - labelHalfHig - borderWid);
                var p7 = new Vector3(centerPos.x - labelHalfWid - borderWid, centerPos.y - labelHalfHig);
                var p8 = new Vector3(centerPos.x - labelHalfWid - borderWid, centerPos.y + labelHalfHig + 2 * borderWid);
                if (serie.label.rotate > 0)
                {
                    p1 = ChartHelper.RotateRound(p1, centerPos, Vector3.forward, serie.label.rotate);
                    p2 = ChartHelper.RotateRound(p2, centerPos, Vector3.forward, serie.label.rotate);
                    p3 = ChartHelper.RotateRound(p3, centerPos, Vector3.forward, serie.label.rotate);
                    p4 = ChartHelper.RotateRound(p4, centerPos, Vector3.forward, serie.label.rotate);
                    p5 = ChartHelper.RotateRound(p5, centerPos, Vector3.forward, serie.label.rotate);
                    p6 = ChartHelper.RotateRound(p6, centerPos, Vector3.forward, serie.label.rotate);
                    p7 = ChartHelper.RotateRound(p7, centerPos, Vector3.forward, serie.label.rotate);
                    p8 = ChartHelper.RotateRound(p8, centerPos, Vector3.forward, serie.label.rotate);
                }
                ChartHelper.DrawLine(vh, p1, p2, borderWid, serie.label.borderColor);
                ChartHelper.DrawLine(vh, p3, p4, borderWid, serie.label.borderColor);
                ChartHelper.DrawLine(vh, p5, p6, borderWid, serie.label.borderColor);
                ChartHelper.DrawLine(vh, p7, p8, borderWid, serie.label.borderColor);
            }
        }
Example #5
0
 private void DrawLabelLine(VertexHelper vh, Serie serie, PieTempData tempData, float outSideRadius, Vector2 center, float currAngle, Color color)
 {
     if (serie.label.show &&
         serie.label.position == SerieLabel.Position.Outside &&
         serie.label.line)
     {
         if (serie.label.color != Color.clear)
         {
             color = serie.label.color;
         }
         float   currSin = Mathf.Sin(currAngle * Mathf.Deg2Rad);
         float   currCos = Mathf.Cos(currAngle * Mathf.Deg2Rad);
         var     radius1 = outSideRadius;
         var     radius2 = tempData.outsideRadius + serie.label.lineLength1;
         var     pos1 = new Vector2(center.x + radius1 * currSin, center.y + radius1 * currCos);
         var     pos2 = new Vector2(center.x + radius2 * currSin, center.y + radius2 * currCos);
         float   tx, ty;
         Vector2 pos3;
         if (currAngle < 90)
         {
             ty   = serie.label.lineWidth * Mathf.Cos((90 - currAngle) * Mathf.Deg2Rad);
             tx   = serie.label.lineWidth * Mathf.Sin((90 - currAngle) * Mathf.Deg2Rad);
             pos3 = new Vector2(pos2.x - tx, pos2.y + ty - serie.label.lineWidth);
         }
         else if (currAngle < 180)
         {
             ty   = serie.label.lineWidth * Mathf.Sin((180 - currAngle) * Mathf.Deg2Rad);
             tx   = serie.label.lineWidth * Mathf.Cos((180 - currAngle) * Mathf.Deg2Rad);
             pos3 = new Vector2(pos2.x - tx, pos2.y - ty + serie.label.lineWidth);
         }
         else if (currAngle < 270)
         {
             ty   = serie.label.lineWidth * Mathf.Sin((180 + currAngle) * Mathf.Deg2Rad);
             tx   = serie.label.lineWidth * Mathf.Cos((180 + currAngle) * Mathf.Deg2Rad);
             pos3 = new Vector2(pos2.x + tx, pos2.y - ty + serie.label.lineWidth);
         }
         else
         {
             ty   = serie.label.lineWidth * Mathf.Cos((90 + currAngle) * Mathf.Deg2Rad);
             tx   = serie.label.lineWidth * Mathf.Sin((90 + currAngle) * Mathf.Deg2Rad);
             pos3 = new Vector2(pos2.x + tx, pos2.y + ty - serie.label.lineWidth);
         }
         var pos4 = new Vector2(currAngle > 180 ? pos3.x - serie.label.lineLength2 : pos3.x + serie.label.lineLength2, pos3.y);
         ChartHelper.DrawLine(vh, pos1, pos2, serie.label.lineWidth, color);
         ChartHelper.DrawLine(vh, pos3, pos4, serie.label.lineWidth, color);
     }
 }
Example #6
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);
                }
            }
        }
Example #7
0
        private void DrawRadar(VertexHelper vh)
        {
            float   insideRadius = 0, outsideRadius = 0;
            float   block = m_Radar.radius / m_Radar.splitNumber;
            int     indicatorNum = m_Radar.indicatorList.Count;
            Vector3 p1, p2, p3, p4;
            Vector3 p     = new Vector3(m_RadarCenterX, m_RadarCenterY);
            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;
                p1            = new Vector3(p.x + insideRadius * Mathf.Sin(0), p.y + insideRadius * Mathf.Cos(0));
                p2            = new Vector3(p.x + outsideRadius * Mathf.Sin(0), p.y + outsideRadius * Mathf.Cos(0));
                for (int j = 0; j <= indicatorNum; j++)
                {
                    float currAngle = j * angle;
                    p3 = new Vector3(p.x + outsideRadius * Mathf.Sin(currAngle),
                                     p.y + outsideRadius * Mathf.Cos(currAngle));
                    p4 = new Vector3(p.x + insideRadius * Mathf.Sin(currAngle),
                                     p.y + insideRadius * Mathf.Cos(currAngle));

                    ChartHelper.DrawPolygon(vh, p1, p2, p3, p4, color);
                    ChartHelper.DrawLine(vh, p2, p3, m_Radar.lineTickness, m_Radar.lineColor);
                    p1 = p4;
                    p2 = p3;
                }
                insideRadius = outsideRadius;
            }
            for (int j = 0; j <= indicatorNum; j++)
            {
                float currAngle = j * angle;
                p3 = new Vector3(p.x + outsideRadius * Mathf.Sin(currAngle),
                                 p.y + outsideRadius * Mathf.Cos(currAngle));
                ChartHelper.DrawLine(vh, p, p3, m_Radar.lineTickness / 2, m_Radar.lineColor);
            }
        }
Example #8
0
        private void DrawSplitLine(VertexHelper vh, bool isYAxis, Axis.SplitLineType type, Vector3 startPos,
                                   Vector3 endPos)
        {
            switch (type)
            {
            case Axis.SplitLineType.Dashed:
            case Axis.SplitLineType.Dotted:
                var startX  = startPos.x;
                var startY  = startPos.y;
                var dashLen = type == Axis.SplitLineType.Dashed ? 6 : 2.5f;
                var count   = isYAxis ? (endPos.x - startPos.x) / (dashLen * 2) :
                              (endPos.y - startPos.y) / (dashLen * 2);
                for (int i = 0; i < count; i++)
                {
                    if (isYAxis)
                    {
                        var toX = startX + dashLen;
                        ChartHelper.DrawLine(vh, new Vector3(startX, startY), new Vector3(toX, startY),
                                             m_Coordinate.tickness, m_ThemeInfo.axisSplitLineColor);
                        startX += dashLen * 2;
                    }
                    else
                    {
                        var toY = startY + dashLen;
                        ChartHelper.DrawLine(vh, new Vector3(startX, startY), new Vector3(startX, toY),
                                             m_Coordinate.tickness, m_ThemeInfo.axisSplitLineColor);
                        startY += dashLen * 2;
                    }
                }
                break;

            case Axis.SplitLineType.Solid:
                ChartHelper.DrawLine(vh, startPos, endPos, m_Coordinate.tickness,
                                     m_ThemeInfo.axisSplitLineColor);
                break;
            }
        }
 private void DrawXAxisLine(VertexHelper vh)
 {
     if (m_XAxis.show && m_XAxis.axisLine.show)
     {
         var lineY = zeroY;
         if (m_XAxis.type == Axis.AxisType.Value)
         {
             lineY = coordinateY;
         }
         var top = new Vector3(coordinateX + coordinateWid + m_Coordinate.tickness, lineY);
         ChartHelper.DrawLine(vh, new Vector3(coordinateX - m_Coordinate.tickness, lineY),
             top, m_Coordinate.tickness, m_ThemeInfo.axisLineColor);
         if (m_XAxis.axisLine.symbol)
         {
             var axisLine = m_XAxis.axisLine;
             top.x += m_XAxis.axisLine.symbolOffset;
             var middle = new Vector3(top.x - axisLine.symbolHeight + axisLine.symbolDent, lineY);
             var left = new Vector3(top.x - axisLine.symbolHeight, lineY - axisLine.symbolWidth / 2);
             var right = new Vector3(top.x - axisLine.symbolHeight, lineY + axisLine.symbolWidth / 2);
             ChartHelper.DrawTriangle(vh, middle, top, left, m_ThemeInfo.axisLineColor);
             ChartHelper.DrawTriangle(vh, middle, top, right, m_ThemeInfo.axisLineColor);
         }
     }
 }
 private void DrawYAxisLine(VertexHelper vh)
 {
     if (m_YAxis.show && m_YAxis.axisLine.show)
     {
         var lineX = zeroX;
         if (m_YAxis.type == Axis.AxisType.Value)
         {
             lineX = coordinateX;
         }
         var top = new Vector3(lineX, coordinateY + coordinateHig + m_Coordinate.tickness);
         ChartHelper.DrawLine(vh, new Vector3(lineX, coordinateY - m_Coordinate.tickness),
             top, m_Coordinate.tickness, m_ThemeInfo.axisLineColor);
         if (m_YAxis.axisLine.symbol)
         {
             var axisLine = m_YAxis.axisLine;
             top.y += m_YAxis.axisLine.symbolOffset;
             var middle = new Vector3(lineX, top.y - axisLine.symbolHeight + axisLine.symbolDent);
             var left = new Vector3(lineX - axisLine.symbolWidth / 2, top.y - axisLine.symbolHeight);
             var right = new Vector3(lineX + axisLine.symbolWidth / 2, top.y - axisLine.symbolHeight);
             ChartHelper.DrawTriangle(vh, middle, top, left, m_ThemeInfo.axisLineColor);
             ChartHelper.DrawTriangle(vh, middle, top, right, m_ThemeInfo.axisLineColor);
         }
     }
 }
Example #11
0
        private void DrawYLineSerie(VertexHelper vh, int serieIndex, Serie serie, ref int dataCount,
                                    ref List <Vector3> points, ref List <Color> colors, ref Dictionary <int, float> seriesHig)
        {
            if (!IsActive(serie.name))
            {
                return;
            }
            List <Vector3> lastPoints       = new List <Vector3>();
            List <Vector3> lastSmoothPoints = new List <Vector3>();
            List <Vector3> smoothPoints     = new List <Vector3>();

            Color   color = m_ThemeInfo.GetColor(serieIndex);
            Vector3 lp    = Vector3.zero;
            Vector3 np    = Vector3.zero;
            var     xAxis = m_XAxises[serie.axisIndex];
            var     yAxis = m_YAxises[serie.axisIndex];

            if (!yAxis.show)
            {
                yAxis = m_YAxises[(serie.axisIndex + 1) % m_YAxises.Count];
            }
            float scaleWid = yAxis.GetDataWidth(coordinateHig, m_DataZoom);
            float startY   = coordinateY + (yAxis.boundaryGap ? scaleWid / 2 : 0);
            int   maxCount = maxShowDataNumber > 0 ?
                             (maxShowDataNumber > serie.yData.Count ? serie.yData.Count : maxShowDataNumber)
                : serie.yData.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 (!seriesHig.ContainsKey(i))
                {
                    seriesHig[i] = 0;
                }
                float value   = serie.yData[i];
                float pY      = startY + i * scaleWid;
                float pX      = seriesHig[i] + coordinateX + m_Coordinate.tickness;
                float dataHig = (value - xAxis.minValue) / (xAxis.maxValue - xAxis.minValue) * coordinateWid;
                np = new Vector3(pX + dataHig, pY);

                if (i > 0)
                {
                    if (m_Line.step)
                    {
                        Vector2 middle1, middle2;
                        switch (m_Line.stepTpe)
                        {
                        case Line.StepType.Start:
                            middle1 = new Vector2(np.x, lp.y);
                            middle2 = new Vector2(np.x, lp.y - m_Line.tickness);
                            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(coordinateX, middle1.y), middle1, np,
                                                        new Vector2(coordinateX, np.y), areaColor);
                            }
                            break;

                        case Line.StepType.Middle:
                            middle1 = new Vector2(lp.x, (lp.y + np.y) / 2 + m_Line.tickness);
                            middle2 = new Vector2(np.x, (lp.y + np.y) / 2 - m_Line.tickness);
                            ChartHelper.DrawLine(vh, lp, middle1, m_Line.tickness, color);
                            ChartHelper.DrawLine(vh, new Vector2(middle1.x, middle1.y - m_Line.tickness),
                                                 new Vector2(middle2.x, middle2.y + m_Line.tickness), 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(coordinateX, lp.y), lp, middle1,
                                                        new Vector2(coordinateX, middle1.y), areaColor);
                                ChartHelper.DrawPolygon(vh, new Vector2(coordinateX, middle2.y + 2 * m_Line.tickness),
                                                        new Vector2(middle2.x, middle2.y + 2 * m_Line.tickness), np,
                                                        new Vector2(coordinateX, np.y), areaColor);
                            }
                            break;

                        case Line.StepType.End:
                            middle1 = new Vector2(np.x, lp.y);
                            middle2 = new Vector2(np.x, lp.y - m_Line.tickness);
                            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(coordinateX, lp.y), middle1,
                                                        new Vector2(np.x, np.y),
                                                        new Vector2(coordinateX, np.y), areaColor);
                            }
                            break;
                        }
                    }
                    else if (m_Line.smooth)
                    {
                        var     list = ChartHelper.GetBezierListVertical(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 = serieIndex > 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(coordinateX + m_Coordinate.tickness, to.y);
                                Vector3 tlp = serieIndex > 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(coordinateX + m_Coordinate.tickness, start.y);
                                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(coordinateX, coordinateY),
                                                                            new Vector3(coordinateX, coordinateY + coordinateHig));
                            if (cross == Vector3.zero)
                            {
                                Vector3 tnp = serieIndex > 0 ?
                                              new Vector3(lastPoints[i].x, lastPoints[i].y + m_Line.tickness) :
                                              new Vector3(coordinateX + m_Coordinate.tickness, np.y);
                                Vector3 tlp = serieIndex > 0 ?
                                              new Vector3(lastPoints[i - 1].x, lastPoints[i - 1].y + m_Line.tickness) :
                                              new Vector3(coordinateX + m_Coordinate.tickness, lp.y);
                                ChartHelper.DrawPolygon(vh, alp, anp, tnp, tlp, areaColor);
                            }
                            else
                            {
                                Vector3 cross1 = new Vector3(cross.x + (alp.x > coordinateX ? m_Coordinate.tickness : -m_Coordinate.tickness), cross.y);
                                Vector3 cross2 = new Vector3(cross.x + (anp.x > coordinateX ? m_Coordinate.tickness : -m_Coordinate.tickness), cross.y);
                                Vector3 xp1    = new Vector3(coordinateX + (alp.x > coordinateX ? m_Coordinate.tickness : -m_Coordinate.tickness), alp.y);
                                Vector3 xp2    = new Vector3(coordinateX + (anp.x > coordinateX ? m_Coordinate.tickness : -m_Coordinate.tickness), anp.y);
                                ChartHelper.DrawTriangle(vh, alp, cross1, xp1, areaColor);
                                ChartHelper.DrawTriangle(vh, anp, cross2, xp2, areaColor);
                            }
                        }
                    }
                }
                if (m_Line.point)
                {
                    points.Add(np);
                    colors.Add(color);
                }
                seriesHig[i] += dataHig;
                lp            = np;
            }
        }
Example #12
0
        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.series[i];
                var     radar        = m_Radars[serie.radarIndex];
                int     indicatorNum = radar.indicatorList.Count;
                var     angle        = 2 * Mathf.PI / indicatorNum;
                Vector3 p            = radar.centerPos;
                if (!IsActive(i))
                {
                    continue;
                }
                for (int j = 0; j < serie.data.Count; j++)
                {
                    var serieData = serie.data[j];
                    int key       = i * 100 + j;
                    if (!radar.dataPosList.ContainsKey(key))
                    {
                        radar.dataPosList.Add(i * 100 + j, new List <Vector3>(serieData.data.Count));
                    }
                    else
                    {
                        radar.dataPosList[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.dataIndex[0] == i && m_Tooltip.dataIndex[1] == j);
                    var            areaColor = serie.GetAreaColor(m_ThemeInfo, serieIndex, isHighlight);
                    var            lineColor = serie.GetLineColor(m_ThemeInfo, serieIndex, isHighlight);
                    int            dataCount = radar.indicatorList.Count;
                    List <Vector3> pointList = radar.dataPosList[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.data[n];
                        if (max == 0)
                        {
                            serie.GetMinMaxData(n, out min, out max);
                            min = radar.GetIndicatorMin(n);
                        }
                        var radius = max < 0 ? radar.actualRadius - radar.actualRadius * value / max
                        : radar.actualRadius * value / max;
                        var currAngle = n * angle;
                        if (n == 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 (serie.areaStyle.show)
                            {
                                ChartHelper.DrawTriangle(vh, p, startPoint, toPoint, areaColor);
                            }
                            if (serie.lineStyle.show)
                            {
                                ChartHelper.DrawLine(vh, startPoint, toPoint, serie.lineStyle.width, lineColor);
                            }
                            startPoint = toPoint;
                        }
                        pointList.Add(startPoint);
                    }
                    if (serie.areaStyle.show)
                    {
                        ChartHelper.DrawTriangle(vh, p, startPoint, firstPoint, areaColor);
                    }
                    if (serie.lineStyle.show)
                    {
                        ChartHelper.DrawLine(vh, startPoint, firstPoint, serie.lineStyle.width, lineColor);
                    }
                    if (serie.symbol.type != SerieSymbolType.None)
                    {
                        var   symbolSize   = (isHighlight ? serie.symbol.selectedSize : serie.symbol.size);
                        float symbolRadius = symbolSize - serie.lineStyle.width * 2;
                        var   symbolColor  = serie.symbol.color != Color.clear ? serie.symbol.color : lineColor;
                        symbolColor.a *= serie.symbol.opacity;
                        foreach (var point in pointList)
                        {
                            DrawSymbol(vh, serie.symbol.type, symbolSize, serie.lineStyle.width, point, symbolColor);
                        }
                    }
                }
            }
        }
        private void DrawCoordinate(VertexHelper vh)
        {
            #region draw tick and splitline
            if (m_YAxis.show)
            {
                var scaleWidth = m_YAxis.GetScaleWidth(coordinateHig, m_DataZoom);
                var size = m_YAxis.GetScaleNumber(m_DataZoom);
                for (int i = 0; i < size; i++)
                {
                    float pX = 0;
                    float pY = coordinateY + i * scaleWidth;
                    if (m_YAxis.boundaryGap && m_YAxis.axisTick.alignWithLabel)
                    {
                        pY -= scaleWidth / 2;
                    }
                    if (m_YAxis.splitArea.show && i < size - 1)
                    {
                        ChartHelper.DrawPolygon(vh, new Vector2(coordinateX, pY),
                            new Vector2(coordinateX + coordinateWid, pY),
                            new Vector2(coordinateX + coordinateWid, pY + scaleWidth),
                            new Vector2(coordinateX, pY + scaleWidth),
                            m_YAxis.splitArea.getColor(i));
                    }
                    if (m_YAxis.axisTick.show)
                    {
                        pX += zeroX - (m_YAxis.axisTick.inside ? -m_YAxis.axisTick.length :
                            m_YAxis.axisTick.length);
                        ChartHelper.DrawLine(vh, new Vector3(zeroX, pY), new Vector3(pX, pY),
                            m_Coordinate.tickness, m_ThemeInfo.axisLineColor);
                    }
                    if (m_YAxis.showSplitLine)
                    {
                        DrawSplitLine(vh, true, m_YAxis.splitLineType, new Vector3(coordinateX, pY),
                            new Vector3(coordinateX + coordinateWid, pY), m_ThemeInfo.axisSplitLineColor);
                    }
                }
            }
            if (m_XAxis.show)
            {
                var scaleWidth = m_XAxis.GetScaleWidth(coordinateWid, m_DataZoom);
                var size = m_XAxis.GetScaleNumber(m_DataZoom);
                for (int i = 0; i < size; i++)
                {
                    float pX = coordinateX + i * scaleWidth;
                    float pY = 0;
                    if (m_XAxis.boundaryGap && m_XAxis.axisTick.alignWithLabel)
                    {
                        pX -= scaleWidth / 2;
                    }
                    if (m_XAxis.splitArea.show && i < size - 1)
                    {
                        ChartHelper.DrawPolygon(vh, new Vector2(pX, coordinateY),
                            new Vector2(pX, coordinateY + coordinateHig),
                            new Vector2(pX + scaleWidth, coordinateY + coordinateHig),
                            new Vector2(pX + scaleWidth, coordinateY),
                            m_XAxis.splitArea.getColor(i));
                    }
                    if (m_XAxis.axisTick.show)
                    {
                        pY += zeroY + (m_XAxis.axisTick.inside ? m_XAxis.axisTick.length :
                            -m_XAxis.axisTick.length);
                        ChartHelper.DrawLine(vh, new Vector3(pX, zeroY), new Vector3(pX, pY),
                            m_Coordinate.tickness, m_ThemeInfo.axisLineColor);
                    }
                    if (m_XAxis.showSplitLine)
                    {
                        DrawSplitLine(vh, false, m_XAxis.splitLineType, new Vector3(pX, coordinateY),
                            new Vector3(pX, coordinateY + coordinateHig), m_ThemeInfo.axisSplitLineColor);
                    }
                }
            }
            #endregion

            DrawXAxisLine(vh);
            DrawYAxisLine(vh);
        }
Example #14
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);
                }
            }
        }
Example #15
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);
            }
        }
Example #16
0
        private void DrawXLineSerie(VertexHelper vh, int serieIndex, Color color, Serie serie, ref int dataCount,
                                    ref List <Vector3> points, ref List <int> pointSerieIndexs, ref List <float> seriesHig)
        {
            if (!IsActive(serie.index))
            {
                return;
            }
            lastPoints.Clear();
            lastSmoothPoints.Clear();
            smoothPoints.Clear();
            List <float> yData = serie.GetYDataList(m_DataZoom);
            List <float> xData = serie.GetXDataList(m_DataZoom);

            Vector3 lp    = Vector3.zero;
            Vector3 np    = Vector3.zero;
            var     yAxis = m_YAxises[serie.axisIndex];
            var     xAxis = m_XAxises[serie.axisIndex];

            if (!xAxis.show)
            {
                xAxis = m_XAxises[(serie.axisIndex + 1) % m_XAxises.Count];
            }
            float scaleWid = xAxis.GetDataWidth(coordinateWid, m_DataZoom);
            float startX   = coordinateX + (xAxis.boundaryGap ? scaleWid / 2 : 0);
            int   maxCount = maxShowDataNumber > 0 ?
                             (maxShowDataNumber > yData.Count ? yData.Count : maxShowDataNumber)
                : yData.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;

            if (seriesHig.Count < minShowDataNumber)
            {
                for (int i = 0; i < minShowDataNumber; i++)
                {
                    seriesHig.Add(0);
                }
            }
            for (int i = minShowDataNumber; i < maxCount; i++)
            {
                if (i >= seriesHig.Count)
                {
                    seriesHig.Add(0);
                }
                float yValue = yData[i];
                float yDataHig;
                if (xAxis.IsValue())
                {
                    float xValue   = i > xData.Count - 1 ? 0 : xData[i];
                    float pX       = coordinateX + m_Coordinate.tickness;
                    float pY       = seriesHig[i] + coordinateY + m_Coordinate.tickness;
                    float xDataHig = (xValue - xAxis.minValue) / (xAxis.maxValue - xAxis.minValue) * coordinateWid;
                    yDataHig = (yValue - yAxis.minValue) / (yAxis.maxValue - yAxis.minValue) * coordinateHig;
                    np       = new Vector3(pX + xDataHig, pY + yDataHig);
                }
                else
                {
                    float pX = startX + i * scaleWid;
                    float pY = seriesHig[i] + coordinateY + m_Coordinate.tickness;
                    yDataHig = (yValue - yAxis.minValue) / (yAxis.maxValue - yAxis.minValue) * coordinateHig;
                    np       = new Vector3(pX, pY + yDataHig);
                }

                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, coordinateY), middle1, np,
                                                        new Vector2(np.x, coordinateY), 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, coordinateY), lp, middle1,
                                                        new Vector2(middle1.x, coordinateY), areaColor);
                                ChartHelper.DrawPolygon(vh, new Vector2(middle2.x + 2 * m_Line.tickness, coordinateY),
                                                        new Vector2(middle2.x + 2 * m_Line.tickness, middle2.y), np,
                                                        new Vector2(np.x, coordinateY), 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, coordinateY), lp,
                                                        new Vector2(middle1.x - m_Line.tickness, middle1.y),
                                                        new Vector2(middle1.x - m_Line.tickness, coordinateY), areaColor);
                            }
                            break;
                        }
                    }
                    else if (m_Line.smooth)
                    {
                        if (xAxis.IsValue())
                        {
                            ChartHelper.GetBezierListVertical(ref smoothSegmentPoints, lp, np, m_Line.smoothStyle);
                        }
                        else
                        {
                            ChartHelper.GetBezierList(ref smoothSegmentPoints, lp, np, m_Line.smoothStyle);
                        }
                        Vector3 start, to;
                        start = smoothSegmentPoints[0];
                        for (int k = 1; k < smoothSegmentPoints.Count; k++)
                        {
                            smoothPoints.Add(smoothSegmentPoints[k]);
                            to = smoothSegmentPoints[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 = serieIndex > 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, coordinateY + m_Coordinate.tickness);
                                Vector3 tlp = serieIndex > 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, coordinateY + 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(coordinateX, coordinateY),
                                                                            new Vector3(coordinateX + coordinateWid, coordinateY));
                            if (cross == Vector3.zero)
                            {
                                Vector3 tnp = serieIndex > 0 ?
                                              new Vector3(lastPoints[i].x, lastPoints[i].y + m_Line.tickness) :
                                              new Vector3(np.x, coordinateY + m_Coordinate.tickness);
                                Vector3 tlp = serieIndex > 0 ?
                                              new Vector3(lastPoints[i - 1].x, lastPoints[i - 1].y + m_Line.tickness) :
                                              new Vector3(lp.x, coordinateY + m_Coordinate.tickness);
                                ChartHelper.DrawPolygon(vh, alp, anp, tnp, tlp, areaColor);
                            }
                            else
                            {
                                Vector3 cross1 = new Vector3(cross.x, cross.y + (alp.y > coordinateY ? m_Coordinate.tickness : -m_Coordinate.tickness));
                                Vector3 cross2 = new Vector3(cross.x, cross.y + (anp.y > coordinateY ? m_Coordinate.tickness : -m_Coordinate.tickness));
                                Vector3 xp1    = new Vector3(alp.x, coordinateY + (alp.y > coordinateY ? m_Coordinate.tickness : -m_Coordinate.tickness));
                                Vector3 xp2    = new Vector3(anp.x, coordinateY + (anp.y > coordinateY ? m_Coordinate.tickness : -m_Coordinate.tickness));
                                ChartHelper.DrawTriangle(vh, alp, cross1, xp1, areaColor);
                                ChartHelper.DrawTriangle(vh, anp, cross2, xp2, areaColor);
                            }
                        }
                    }
                }
                if (serie.symbol.type != SerieSymbolType.None || m_Line.area)
                {
                    points.Add(np);
                    pointSerieIndexs.Add(serie.index);
                }
                seriesHig[i] += yDataHig;
                lp            = np;
            }
        }
        private void DrawCoordinate(VertexHelper vh)
        {
            #region draw tick and splitline
            if (m_YAxis.show)
            {
                for (int i = 0; i < m_YAxis.GetScaleNumber(); i++)
                {
                    float pX = 0;
                    float pY = coordinateY + i * m_YAxis.GetScaleWidth(coordinateHig);
                    if (m_YAxis.boundaryGap && m_YAxis.axisTick.alignWithLabel)
                    {
                        pY -= m_YAxis.GetScaleWidth(coordinateHig) / 2;
                    }

                    if (m_YAxis.axisTick.show)
                    {
                        pX += zeroX - m_YAxis.axisTick.length - 2;
                        ChartHelper.DrawLine(vh, new Vector3(zeroX, pY), new Vector3(pX, pY),
                                             m_Coordinate.tickness, m_ThemeInfo.axisLineColor);
                    }
                    if (m_YAxis.showSplitLine)
                    {
                        DrawSplitLine(vh, true, m_YAxis.splitLineType, new Vector3(coordinateX, pY),
                                      new Vector3(coordinateX + coordinateWid, pY), m_ThemeInfo.axisSplitLineColor);
                    }
                }
            }
            if (m_XAxis.show)
            {
                for (int i = 0; i < m_XAxis.GetScaleNumber(); i++)
                {
                    float pX = coordinateX + i * m_XAxis.GetScaleWidth(coordinateWid);
                    float pY = 0;
                    if (m_XAxis.boundaryGap && m_XAxis.axisTick.alignWithLabel)
                    {
                        pX -= m_XAxis.GetScaleWidth(coordinateWid) / 2;
                    }
                    if (m_XAxis.axisTick.show)
                    {
                        pY += zeroY - m_XAxis.axisTick.length - 2;
                        ChartHelper.DrawLine(vh, new Vector3(pX, zeroY), new Vector3(pX, pY),
                                             m_Coordinate.tickness, m_ThemeInfo.axisLineColor);
                    }
                    if (m_XAxis.showSplitLine)
                    {
                        DrawSplitLine(vh, false, m_XAxis.splitLineType, new Vector3(pX, coordinateY),
                                      new Vector3(pX, coordinateY + coordinateHig), m_ThemeInfo.axisSplitLineColor);
                    }
                }
            }
            #endregion

            #region draw x,y axis
            if (m_YAxis.show)
            {
                if (m_YAxis.type == Axis.AxisType.Value)
                {
                    ChartHelper.DrawLine(vh, new Vector3(coordinateX, coordinateY - m_Coordinate.tickness),
                                         new Vector3(coordinateX, coordinateY + coordinateHig + m_Coordinate.tickness),
                                         m_Coordinate.tickness, m_ThemeInfo.axisLineColor);
                }
                else
                {
                    ChartHelper.DrawLine(vh, new Vector3(zeroX, coordinateY - m_Coordinate.tickness),
                                         new Vector3(zeroX, coordinateY + coordinateHig + m_Coordinate.tickness),
                                         m_Coordinate.tickness, m_ThemeInfo.axisLineColor);
                }
            }
            if (m_XAxis.show)
            {
                if (m_XAxis.type == Axis.AxisType.Value)
                {
                    ChartHelper.DrawLine(vh, new Vector3(coordinateX - m_Coordinate.tickness, coordinateY),
                                         new Vector3(coordinateX + coordinateWid + m_Coordinate.tickness, coordinateY),
                                         m_Coordinate.tickness, m_ThemeInfo.axisLineColor);
                }
                else
                {
                    ChartHelper.DrawLine(vh, new Vector3(coordinateX - m_Coordinate.tickness, zeroY),
                                         new Vector3(coordinateX + coordinateWid + m_Coordinate.tickness, zeroY),
                                         m_Coordinate.tickness, m_ThemeInfo.axisLineColor);
                }
            }
            #endregion
        }
Example #18
0
        private void DrawYLineSerie(VertexHelper vh, int serieIndex, Color lineColor, Serie serie, ref List <float> seriesHig)
        {
            if (!IsActive(serie.index))
            {
                return;
            }
            var     showData  = serie.GetDataList(m_DataZoom);
            Vector3 lp        = Vector3.zero;
            Vector3 np        = Vector3.zero;
            Color   areaColor = new Color(lineColor.r, lineColor.g, lineColor.b, lineColor.a * 0.75f);
            var     xAxis     = m_XAxises[serie.axisIndex];
            var     yAxis     = m_YAxises[serie.axisIndex];
            var     lastSerie = m_Series.GetSerie(serieIndex - 1);
            var     isStack   = m_Series.IsStack(serie.stack);

            if (!yAxis.show)
            {
                yAxis = m_YAxises[(serie.axisIndex + 1) % m_YAxises.Count];
            }
            float scaleWid = yAxis.GetDataWidth(coordinateHig, m_DataZoom);
            float startY   = coordinateY + (yAxis.boundaryGap ? scaleWid / 2 : 0);
            int   maxCount = maxShowDataNumber > 0 ?
                             (maxShowDataNumber > showData.Count ? showData.Count : maxShowDataNumber)
                : showData.Count;

            if (seriesHig.Count < minShowDataNumber)
            {
                for (int i = 0; i < minShowDataNumber; i++)
                {
                    seriesHig.Add(0);
                }
            }
            for (int i = minShowDataNumber; i < maxCount; i++)
            {
                if (i >= seriesHig.Count)
                {
                    seriesHig.Add(0);
                }
                float value   = showData[i].data[1];
                float pY      = startY + i * scaleWid;
                float pX      = seriesHig[i] + coordinateX + yAxis.axisLine.width;
                float dataHig = (value - xAxis.minValue) / (xAxis.maxValue - xAxis.minValue) * coordinateWid;
                np = new Vector3(pX + dataHig, pY);
                if (i > 0)
                {
                    if (m_Line.step)
                    {
                        Vector2 middle1, middle2;
                        switch (m_Line.stepTpe)
                        {
                        case Line.StepType.Start:
                            middle1 = new Vector2(np.x, lp.y);
                            middle2 = new Vector2(np.x, lp.y - m_Line.tickness);
                            ChartHelper.DrawLine(vh, lp, middle1, m_Line.tickness, lineColor);
                            ChartHelper.DrawLine(vh, middle2, np, m_Line.tickness, lineColor);
                            if (m_Line.area)
                            {
                                ChartHelper.DrawPolygon(vh, new Vector2(coordinateX, middle1.y), middle1, np,
                                                        new Vector2(coordinateX, np.y), areaColor);
                            }
                            break;

                        case Line.StepType.Middle:
                            middle1 = new Vector2(lp.x, (lp.y + np.y) / 2 + m_Line.tickness);
                            middle2 = new Vector2(np.x, (lp.y + np.y) / 2 - m_Line.tickness);
                            ChartHelper.DrawLine(vh, lp, middle1, m_Line.tickness, lineColor);
                            ChartHelper.DrawLine(vh, new Vector2(middle1.x, middle1.y - m_Line.tickness),
                                                 new Vector2(middle2.x, middle2.y + m_Line.tickness), m_Line.tickness, lineColor);
                            ChartHelper.DrawLine(vh, middle2, np, m_Line.tickness, lineColor);
                            if (m_Line.area)
                            {
                                ChartHelper.DrawPolygon(vh, new Vector2(coordinateX, lp.y), lp, middle1,
                                                        new Vector2(coordinateX, middle1.y), areaColor);
                                ChartHelper.DrawPolygon(vh, new Vector2(coordinateX, middle2.y + 2 * m_Line.tickness),
                                                        new Vector2(middle2.x, middle2.y + 2 * m_Line.tickness), np,
                                                        new Vector2(coordinateX, np.y), areaColor);
                            }
                            break;

                        case Line.StepType.End:
                            middle1 = new Vector2(np.x, lp.y);
                            middle2 = new Vector2(np.x, lp.y - m_Line.tickness);
                            ChartHelper.DrawLine(vh, lp, middle1, m_Line.tickness, lineColor);
                            ChartHelper.DrawLine(vh, middle2, np, m_Line.tickness, lineColor);
                            if (m_Line.area)
                            {
                                ChartHelper.DrawPolygon(vh, new Vector2(coordinateX, lp.y), middle1,
                                                        new Vector2(np.x, np.y),
                                                        new Vector2(coordinateX, np.y), areaColor);
                            }
                            break;
                        }
                    }
                    else if (m_Line.smooth)
                    {
                        DrawSmoothAreaPoints(vh, serieIndex, serie, yAxis, lp, np, i, lineColor, areaColor, isStack);
                    }
                    else
                    {
                        ChartHelper.DrawLine(vh, lp, np, m_Line.tickness, lineColor);
                        if (m_Line.area)
                        {
                            Vector3 alp   = new Vector3(lp.x, lp.y);
                            Vector3 anp   = new Vector3(np.x, np.y);
                            var     cross = ChartHelper.GetIntersection(lp, np, new Vector3(coordinateX, coordinateY),
                                                                        new Vector3(coordinateX, coordinateY + coordinateHig));
                            if (cross == Vector3.zero)
                            {
                                Vector3 tnp = serieIndex > 0 ?
                                              new Vector3(lastSerie.dataPoints[i].x + yAxis.axisLine.width, lastSerie.dataPoints[i].y) :
                                              new Vector3(coordinateX + yAxis.axisLine.width, np.y);
                                Vector3 tlp = serieIndex > 0 ?
                                              new Vector3(lastSerie.dataPoints[i - 1].x + yAxis.axisLine.width, lastSerie.dataPoints[i - 1].y) :
                                              new Vector3(coordinateX + yAxis.axisLine.width, lp.y);
                                ChartHelper.DrawPolygon(vh, alp, anp, tnp, tlp, areaColor);
                            }
                            else
                            {
                                Vector3 cross1 = new Vector3(cross.x + (alp.x > coordinateX ? yAxis.axisLine.width : -yAxis.axisLine.width), cross.y);
                                Vector3 cross2 = new Vector3(cross.x + (anp.x > coordinateX ? yAxis.axisLine.width : -yAxis.axisLine.width), cross.y);
                                Vector3 xp1    = new Vector3(coordinateX + (alp.x > coordinateX ? yAxis.axisLine.width : -yAxis.axisLine.width), alp.y);
                                Vector3 xp2    = new Vector3(coordinateX + (anp.x > coordinateX ? yAxis.axisLine.width : -yAxis.axisLine.width), anp.y);
                                ChartHelper.DrawTriangle(vh, alp, cross1, xp1, areaColor);
                                ChartHelper.DrawTriangle(vh, anp, cross2, xp2, areaColor);
                            }
                        }
                    }
                }
                serie.dataPoints.Add(np);
                seriesHig[i] += dataHig;
                lp            = np;
            }
        }
Example #19
0
        private void DrawSmoothAreaPoints(VertexHelper vh, int serieIndex, Serie serie, Axis xAxis, Vector3 lp,
                                          Vector3 np, int dataIndex, Color lineColor, Color areaColor, bool isStack)
        {
            bool isYAxis = xAxis is YAxis;

            if (isYAxis)
            {
                ChartHelper.GetBezierListVertical(ref smoothSegmentPoints, lp, np, m_Line.smoothStyle);
            }
            else
            {
                ChartHelper.GetBezierList(ref smoothSegmentPoints, lp, np, m_Line.smoothStyle);
            }
            Vector3 start, to;

            start = smoothSegmentPoints[0];

            var smoothPoints = serie.GetSmoothList(dataIndex, smoothSegmentPoints.Count);

            smoothPoints.Clear();
            var lastSerie        = m_Series.GetSerie(serie.index - 1);
            var lastSmoothPoints = lastSerie != null?lastSerie.GetSmoothList(dataIndex, smoothSegmentPoints.Count) : new List <Vector3>();

            smoothPoints.Add(start);
            var lastCount = 1;

            for (int k = 1; k < smoothSegmentPoints.Count; k++)
            {
                smoothPoints.Add(smoothSegmentPoints[k]);
                to = smoothSegmentPoints[k];
                ChartHelper.DrawLine(vh, start, to, m_Line.tickness, lineColor);
                if (m_Line.area)
                {
                    Vector3 alp, anp, tnp, tlp;
                    if (isYAxis)
                    {
                        alp = new Vector3(start.x - m_Line.tickness, start.y);
                        anp = new Vector3(to.x - m_Line.tickness, to.y);
                    }
                    else
                    {
                        alp = new Vector3(start.x, start.y - m_Line.tickness);
                        anp = new Vector3(to.x, to.y - m_Line.tickness);
                    }
                    if (serieIndex > 0 && isStack)
                    {
                        if (k == smoothSegmentPoints.Count - 1)
                        {
                            if (k < lastSmoothPoints.Count - 1)
                            {
                                tnp = lastSmoothPoints[lastCount - 1];
                                if (isYAxis)
                                {
                                    tnp.x += m_Line.tickness;
                                }
                                else
                                {
                                    tnp.y += m_Line.tickness;
                                }
                                ChartHelper.DrawTriangle(vh, alp, anp, tnp, areaColor);
                                while (lastCount < lastSmoothPoints.Count)
                                {
                                    tlp = lastSmoothPoints[lastCount];
                                    if (isYAxis)
                                    {
                                        tlp.x += m_Line.tickness;
                                    }
                                    else
                                    {
                                        tlp.y += m_Line.tickness;
                                    }
                                    ChartHelper.DrawTriangle(vh, tnp, anp, tlp, areaColor);
                                    lastCount++;
                                    tnp = tlp;
                                }
                                start = to;
                                continue;
                            }
                        }
                        if (lastCount >= lastSmoothPoints.Count)
                        {
                            tlp = lastSmoothPoints[lastSmoothPoints.Count - 1];
                            if (isYAxis)
                            {
                                tlp.x += m_Line.tickness;
                            }
                            else
                            {
                                tlp.y += m_Line.tickness;
                            }
                            ChartHelper.DrawTriangle(vh, anp, alp, tlp, areaColor);
                            start = to;
                            continue;
                        }
                        if (isYAxis)
                        {
                            tnp = new Vector3(lastSmoothPoints[lastCount].x + m_Line.tickness, lastSmoothPoints[lastCount].y);
                        }
                        else
                        {
                            tnp = new Vector3(lastSmoothPoints[lastCount].x, lastSmoothPoints[lastCount].y + m_Line.tickness);
                        }

                        var diff = isYAxis ? tnp.y - to.y : tnp.x - to.x;
                        if (Math.Abs(diff) < 1)
                        {
                            if (isYAxis)
                            {
                                tlp = new Vector3(lastSmoothPoints[lastCount - 1].x + m_Line.tickness, lastSmoothPoints[lastCount - 1].y);
                            }
                            else
                            {
                                tlp = new Vector3(lastSmoothPoints[lastCount - 1].x, lastSmoothPoints[lastCount - 1].y + m_Line.tickness);
                            }
                            ChartHelper.DrawPolygon(vh, alp, anp, tnp, tlp, areaColor);
                            lastCount++;
                        }
                        else
                        {
                            if (diff < 0)
                            {
                                if (isYAxis)
                                {
                                    tnp = new Vector3(lastSmoothPoints[lastCount - 1].x + m_Line.tickness, lastSmoothPoints[lastCount - 1].y);
                                }
                                else
                                {
                                    tnp = new Vector3(lastSmoothPoints[lastCount - 1].x, lastSmoothPoints[lastCount - 1].y + m_Line.tickness);
                                }
                                ChartHelper.DrawTriangle(vh, alp, anp, tnp, areaColor);
                                while (diff < 0 && lastCount < lastSmoothPoints.Count)
                                {
                                    if (isYAxis)
                                    {
                                        tlp = new Vector3(lastSmoothPoints[lastCount].x + m_Line.tickness, lastSmoothPoints[lastCount].y);
                                    }
                                    else
                                    {
                                        tlp = new Vector3(lastSmoothPoints[lastCount].x, lastSmoothPoints[lastCount].y + m_Line.tickness);
                                    }
                                    ChartHelper.DrawTriangle(vh, tnp, anp, tlp, areaColor);
                                    lastCount++;
                                    diff = isYAxis ? tlp.y - to.y : tlp.x - to.x;
                                    tnp  = tlp;
                                }
                            }
                            else
                            {
                                if (isYAxis)
                                {
                                    tlp = new Vector3(lastSmoothPoints[lastCount - 1].x + m_Line.tickness, lastSmoothPoints[lastCount - 1].y);
                                }
                                else
                                {
                                    tlp = new Vector3(lastSmoothPoints[lastCount - 1].x, lastSmoothPoints[lastCount - 1].y + m_Line.tickness);
                                }
                                ChartHelper.DrawTriangle(vh, alp, anp, tlp, areaColor);
                            }
                        }
                    }
                    else
                    {
                        if (isYAxis)
                        {
                            tnp = new Vector3(coordinateX + xAxis.axisLine.width, to.y);
                            tlp = new Vector3(coordinateX + xAxis.axisLine.width, start.y);
                        }
                        else
                        {
                            tnp = new Vector3(to.x, coordinateY + xAxis.axisLine.width);
                            tlp = new Vector3(start.x, coordinateY + xAxis.axisLine.width);
                        }
                        ChartHelper.DrawPolygon(vh, alp, anp, tnp, tlp, areaColor);
                    }
                }
                start = to;
            }
        }
Example #20
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);
                    }
                }
            }
        }
Example #21
0
        private void DrawStepLine(VertexHelper vh, int serieIndex, Serie serie, Axis axis, Vector3 lp,
                                  Vector3 np, int dataIndex, Color lineColor, Color areaColor, Vector3 zeroPos)
        {
            bool    isYAxis = axis is YAxis;
            float   lineWidth = serie.lineStyle.width;
            Vector2 middle1, middle2, p1, p2, p4;

            switch (serie.lineType)
            {
            case LineType.StepStart:
                middle1 = isYAxis ? new Vector2(np.x, lp.y) : new Vector2(lp.x, np.y + lineWidth);
                middle2 = isYAxis ? new Vector2(np.x, lp.y - lineWidth) : new Vector2(lp.x - lineWidth, np.y);
                ChartHelper.DrawLine(vh, lp, middle1, lineWidth, lineColor);
                ChartHelper.DrawLine(vh, middle2, np, lineWidth, lineColor);
                if (serie.areaStyle.show)
                {
                    p1 = isYAxis ? new Vector2(zeroPos.x, middle1.y) : new Vector2(middle1.x, zeroPos.y);
                    p4 = isYAxis ? new Vector2(zeroPos.x, np.y) : new Vector2(np.x, zeroPos.y);
                    ChartHelper.DrawPolygon(vh, p1, middle1, np, p4, areaColor);
                }
                break;

            case LineType.StepMiddle:
                middle1 = isYAxis ? new Vector2(lp.x, (lp.y + np.y) / 2 + lineWidth) : new Vector2((lp.x + np.x) / 2 + lineWidth, lp.y);
                middle2 = isYAxis ? new Vector2(np.x, (lp.y + np.y) / 2 - lineWidth) : new Vector2((lp.x + np.x) / 2 - lineWidth, np.y);
                p1      = isYAxis ? new Vector2(middle1.x, middle1.y - lineWidth) : new Vector2(middle1.x - lineWidth, middle1.y);
                p2      = isYAxis ? new Vector2(middle2.x, middle2.y + lineWidth) : new Vector2(middle2.x + lineWidth, middle2.y);
                ChartHelper.DrawLine(vh, lp, middle1, lineWidth, lineColor);
                ChartHelper.DrawLine(vh, p1, p2, lineWidth, lineColor);
                ChartHelper.DrawLine(vh, middle2, np, lineWidth, lineColor);
                if (serie.areaStyle.show)
                {
                    if (isYAxis)
                    {
                        ChartHelper.DrawPolygon(vh, new Vector2(zeroPos.x, lp.y), lp, middle1,
                                                new Vector2(zeroPos.x, middle1.y), areaColor);
                        ChartHelper.DrawPolygon(vh, new Vector2(zeroPos.x, middle2.y + 2 * lineWidth),
                                                new Vector2(middle2.x, middle2.y + 2 * lineWidth), np,
                                                new Vector2(zeroPos.x, np.y), areaColor);
                    }
                    else
                    {
                        ChartHelper.DrawPolygon(vh, new Vector2(lp.x, zeroPos.y), lp, middle1,
                                                new Vector2(middle1.x, zeroPos.y), areaColor);
                        ChartHelper.DrawPolygon(vh, new Vector2(middle2.x + 2 * lineWidth, zeroPos.y),
                                                new Vector2(middle2.x + 2 * lineWidth, middle2.y), np,
                                                new Vector2(np.x, zeroPos.y), areaColor);
                    }
                }
                break;

            case LineType.StepEnd:
                middle1 = isYAxis ? new Vector2(np.x, lp.y) : new Vector2(np.x + lineWidth, lp.y);
                middle2 = isYAxis ? new Vector2(np.x, lp.y - serie.lineStyle.width) : new Vector2(np.x, lp.y);
                ChartHelper.DrawLine(vh, lp, middle1, lineWidth, lineColor);
                ChartHelper.DrawLine(vh, middle2, np, lineWidth, lineColor);
                if (serie.areaStyle.show)
                {
                    if (isYAxis)
                    {
                        ChartHelper.DrawPolygon(vh, new Vector2(zeroPos.x, lp.y), middle1,
                                                new Vector2(np.x, np.y),
                                                new Vector2(zeroPos.x, np.y), areaColor);
                    }
                    else
                    {
                        ChartHelper.DrawPolygon(vh, new Vector2(lp.x, zeroPos.y), lp,
                                                new Vector2(middle1.x - lineWidth, middle1.y),
                                                new Vector2(middle1.x - lineWidth, zeroPos.y), areaColor);
                    }
                }
                break;
            }
        }
Example #22
0
        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);
                }
            }
        }