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; } }
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); } } }
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(); var showData = serie.GetDataList(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 > showData.Count ? showData.Count : maxShowDataNumber) : showData.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 = showData[i].data[1]; float yDataHig; if (xAxis.IsValue()) { float xValue = i > showData.Count - 1 ? 0 : showData[i].data[0]; float pX = coordinateX + xAxis.axisLine.width; float pY = seriesHig[i] + coordinateY + xAxis.axisLine.width; 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 + yAxis.axisLine.width; 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 + xAxis.axisLine.width); 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 + xAxis.axisLine.width); 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 + xAxis.axisLine.width); Vector3 tlp = serieIndex > 0 ? new Vector3(lastPoints[i - 1].x, lastPoints[i - 1].y + m_Line.tickness) : new Vector3(lp.x, coordinateY + xAxis.axisLine.width); ChartHelper.DrawPolygon(vh, alp, anp, tnp, tlp, areaColor); } else { Vector3 cross1 = new Vector3(cross.x, cross.y + (alp.y > coordinateY ? xAxis.axisLine.width : -xAxis.axisLine.width)); Vector3 cross2 = new Vector3(cross.x, cross.y + (anp.y > coordinateY ? xAxis.axisLine.width : -xAxis.axisLine.width)); Vector3 xp1 = new Vector3(alp.x, coordinateY + (alp.y > coordinateY ? xAxis.axisLine.width : -xAxis.axisLine.width)); Vector3 xp2 = new Vector3(anp.x, coordinateY + (anp.y > coordinateY ? xAxis.axisLine.width : -xAxis.axisLine.width)); 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 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; } }
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); } }
private void DrawSmoothLine(VertexHelper vh, int serieIndex, Serie serie, Axis xAxis, Vector3 lp, Vector3 np, int dataIndex, Color lineColor, Color areaColor, Color areaToColor, bool isStack, Vector3 zeroPos) { bool isYAxis = xAxis is YAxis; var lineWidth = serie.lineStyle.width; var smoothPoints = serie.GetUpSmoothList(dataIndex); var smoothDownPoints = serie.GetDownSmoothList(dataIndex); var fine = isStack && m_Series.IsAnyGradientSerie(serie.stack); if (isYAxis) { ChartHelper.GetBezierListVertical(ref bezierPoints, lp, np, fine, lineSmoothStyle); } else { ChartHelper.GetBezierList(ref bezierPoints, lp, np, fine, lineSmoothStyle); } Vector3 start, to; start = bezierPoints[0]; var dir = bezierPoints[1] - start; var dir1v = Vector3.Cross(dir, Vector3.forward).normalized; var startUp = start + (isYAxis ? Vector3.right : Vector3.up) * lineWidth; var startDn = start - (isYAxis ? Vector3.right : Vector3.up) * lineWidth; Vector3 toUp, toDn, tnp, tlp; smoothPoints.Add(startUp); smoothDownPoints.Add(startDn); for (int k = 1; k < bezierPoints.Count; k++) { to = bezierPoints[k]; dir = to - start; if (k < bezierPoints.Count - 1) { dir1v = Vector3.Cross(dir, Vector3.forward).normalized *(isYAxis ? -1 : 1); var diff = dir1v * lineWidth; toUp = to - diff; toDn = to + diff; if (isYAxis) { ChartHelper.DrawPolygon(vh, startDn, toDn, toUp, startUp, lineColor); } else { ChartHelper.DrawPolygon(vh, startUp, toUp, toDn, startDn, lineColor); } } else { toUp = to + (isYAxis ? Vector3.right : Vector3.up) * lineWidth; toDn = to - (isYAxis ? Vector3.right : Vector3.up) * lineWidth; if (isYAxis) { ChartHelper.DrawPolygon(vh, toDn, toUp, startUp, startDn, lineColor); } else { ChartHelper.DrawPolygon(vh, startUp, toUp, toDn, startDn, lineColor); } } smoothPoints.Add(toUp); smoothDownPoints.Add(toDn); if (serie.areaStyle.show && (serieIndex == 0 || !isStack)) { if (isYAxis) { if (start.x > zeroPos.x && to.x > zeroPos.x) { tnp = new Vector3(zeroPos.x + xAxis.axisLine.width, toDn.y); tlp = new Vector3(zeroPos.x + xAxis.axisLine.width, startDn.y); ChartHelper.DrawPolygon(vh, startDn, toDn, tnp, tlp, areaColor, areaToColor); } else if (start.x < zeroPos.x && to.x < zeroPos.x) { tnp = new Vector3(zeroPos.x - xAxis.axisLine.width, toUp.y); tlp = new Vector3(zeroPos.x - xAxis.axisLine.width, startUp.y); ChartHelper.DrawPolygon(vh, tnp, tlp, startUp, toUp, areaToColor, areaColor); } } else { if (start.y > zeroPos.y && to.y > zeroPos.y) { tnp = new Vector3(toDn.x, zeroPos.y + xAxis.axisLine.width); tlp = new Vector3(startDn.x, zeroPos.y + xAxis.axisLine.width); ChartHelper.DrawPolygon(vh, startDn, toDn, tnp, tlp, areaColor, areaToColor); } else if (start.y < zeroPos.y && to.y < zeroPos.y) { tnp = new Vector3(toUp.x, zeroPos.y - xAxis.axisLine.width); tlp = new Vector3(startUp.x, zeroPos.y - xAxis.axisLine.width); ChartHelper.DrawPolygon(vh, tlp, tnp, toUp, startUp, areaToColor, areaColor); } } } start = to; startUp = toUp; startDn = toDn; } if (serie.areaStyle.show) { var lastSerie = m_Series.GetLastStackSerie(serie); if (lastSerie != null) { var lastSmoothPoints = lastSerie.GetUpSmoothList(dataIndex); DrawStackArea(vh, serie, xAxis, smoothDownPoints, lastSmoothPoints, lineColor, areaColor, areaToColor); } } }