Exemple #1
0
        private void DrawXBarSerie(VertexHelper vh, int serieIndex, int stackCount,
                                   Serie serie, Color color, ref List <float> seriesHig)
        {
            if (!IsActive(serie.name))
            {
                return;
            }
            List <float> showData = serie.GetYDataList(m_DataZoom);
            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 barWid   = m_Bar.barWidth > 1 ? m_Bar.barWidth : scaleWid * m_Bar.barWidth;
            float offset   = m_Bar.inSameBar ?
                             (scaleWid - barWid - m_Bar.space * (stackCount - 1)) / 2 :
                             (scaleWid - barWid * stackCount - m_Bar.space * (stackCount - 1)) / 2;
            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];
                float pX    = coordinateX + i * scaleWid;
                float zeroY = coordinateY + yAxis.zeroYOffset;
                if (!xAxis.boundaryGap)
                {
                    pX -= scaleWid / 2;
                }
                float pY     = seriesHig[i] + zeroY + m_Coordinate.tickness;
                float barHig = (yAxis.minValue > 0 ? value - yAxis.minValue : value)
                               / (yAxis.maxValue - yAxis.minValue) * coordinateHig;
                seriesHig[i] += barHig;
                float space = m_Bar.inSameBar ? offset :
                              offset + serieIndex * (barWid + m_Bar.space);
                Vector3 p1 = new Vector3(pX + space, pY);
                Vector3 p2 = new Vector3(pX + space, pY + barHig);
                Vector3 p3 = new Vector3(pX + space + barWid, pY + barHig);
                Vector3 p4 = new Vector3(pX + space + barWid, pY);
                if (serie.show)
                {
                    ChartHelper.DrawPolygon(vh, p1, p2, p3, p4, color);
                }
            }
        }
Exemple #2
0
        private void DrawXLineSerie(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>();
            List <float>   yData            = serie.GetYDataList(m_DataZoom);
            List <float>   xData            = serie.GetXDataList(m_DataZoom);

            Color   color = m_ThemeInfo.GetColor(serieIndex);
            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;

            for (int i = minShowDataNumber; i < maxCount; i++)
            {
                if (!seriesHig.ContainsKey(i))
                {
                    seriesHig[i] = 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)
                    {
                        Vector3[] list;
                        if (xAxis.IsValue())
                        {
                            list = ChartHelper.GetBezierListVertical(lp, np, m_Line.smoothStyle);
                        }
                        else
                        {
                            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 = 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 (m_Line.point)
                {
                    points.Add(np);
                    colors.Add(color);
                }
                seriesHig[i] += yDataHig;
                lp            = np;
            }
        }