diff --git a/Scripts/UI/Internal/CoordinateChart_DrawLine.cs b/Scripts/UI/Internal/CoordinateChart_DrawLine.cs index b70a613a..b2f68bf6 100644 --- a/Scripts/UI/Internal/CoordinateChart_DrawLine.cs +++ b/Scripts/UI/Internal/CoordinateChart_DrawLine.cs @@ -193,20 +193,10 @@ namespace XCharts areaColor, areaToColor, zeroPos); break; case LineType.Dash: - ChartDrawer.DrawDashLine(vh, lp, np, serie.lineStyle.width, lineColor); - isFinish = true; - break; case LineType.Dot: - ChartDrawer.DrawDotLine(vh, lp, np, serie.lineStyle.width, lineColor); - isFinish = true; - break; case LineType.DashDot: - ChartDrawer.DrawDashDotLine(vh, lp, np, serie.lineStyle.width, lineColor); - isFinish = true; - break; case LineType.DashDotDot: - ChartDrawer.DrawDashDotDotLine(vh, lp, np, serie.lineStyle.width, lineColor); - isFinish = true; + DrawOtherLine(vh, serie, xAxis, lp, np, i, lineColor, areaColor, areaToColor, zeroPos); break; } if (isFinish) serie.animation.SetDataFinish(i); @@ -829,6 +819,45 @@ namespace XCharts } } + private List posList = new List(); + private bool DrawOtherLine(VertexHelper vh, Serie serie, Axis axis, Vector3 lp, + Vector3 np, int dataIndex, Color lineColor, Color areaColor, + Color areaToColor, Vector3 zeroPos) + { + bool isYAxis = axis is YAxis; + var lineWidth = serie.lineStyle.width; + posList.Clear(); + switch (serie.lineType) + { + case LineType.Dash: + ChartDrawer.DrawDashLine(vh, lp, np, lineWidth, lineColor, 15, 7, posList); + break; + case LineType.Dot: + ChartDrawer.DrawDotLine(vh, lp, np, lineWidth, lineColor, 5, 5, posList); + break; + case LineType.DashDot: + ChartDrawer.DrawDashDotLine(vh, lp, np, lineWidth, lineColor, 15, 15, posList); + break; + case LineType.DashDotDot: + ChartDrawer.DrawDashDotDotLine(vh, lp, np, lineWidth, lineColor, 15, 20, posList); + break; + } + if (serie.areaStyle.show && !isYAxis && posList.Count > 0) + { + lp = posList[0]; + var value = serie.GetSerieData(dataIndex).data[1]; + for (int i = 0; i < posList.Count; i++) + { + np = posList[i]; + var start = new Vector3(lp.x, value > 0 ? (lp.y - lineWidth) : (lp.y + lineWidth)); + var end = new Vector3(np.x, value > 0 ? (np.y - lineWidth) : (np.y + lineWidth)); + DrawPolygonToZero(vh, start, end, axis, zeroPos, areaColor, areaToColor, Vector3.zero); + lp = np; + } + } + return true; + } + private List bezierPoints = new List(); private Vector3 smoothStartPosUp, smoothStartPosDn; private bool DrawSmoothLine(VertexHelper vh, Serie serie, Axis xAxis, Vector3 lp, diff --git a/Scripts/UI/Utility/ChartDrawer.cs b/Scripts/UI/Utility/ChartDrawer.cs index 6033790c..3c908bb6 100644 --- a/Scripts/UI/Utility/ChartDrawer.cs +++ b/Scripts/UI/Utility/ChartDrawer.cs @@ -42,83 +42,100 @@ namespace XCharts } public static void DrawDashLine(VertexHelper vh, Vector3 p1, Vector3 p2, float size, Color32 color, - float dashLen = 15f, float blankLen = 7f) + float dashLen = 15f, float blankLen = 7f, List posList = null) { float dist = Vector3.Distance(p1, p2); if (dist < 0.1f) return; int segment = Mathf.CeilToInt(dist / (dashLen + blankLen)); Vector3 dir = (p2 - p1).normalized; Vector3 sp = p1, np; + if (posList != null) posList.Clear(); for (int i = 1; i <= segment; i++) { + if (posList != null) posList.Add(sp); np = p1 + dir * dist * i / segment; var dashep = np - dir * blankLen; DrawLine(vh, sp, dashep, size, color); sp = np; } + if (posList != null) posList.Add(p2); DrawLine(vh, sp, p2, size, color); } public static void DrawDotLine(VertexHelper vh, Vector3 p1, Vector3 p2, float size, Color32 color, - float dotLen = 5f, float blankLen = 5f) + float dotLen = 5f, float blankLen = 5f, List posList = null) { float dist = Vector3.Distance(p1, p2); if (dist < 0.1f) return; int segment = Mathf.CeilToInt(dist / (dotLen + blankLen)); Vector3 dir = (p2 - p1).normalized; Vector3 sp = p1, np; + if (posList != null) posList.Clear(); for (int i = 1; i <= segment; i++) { + if (posList != null) posList.Add(sp); np = p1 + dir * dist * i / segment; var dashep = np - dir * blankLen; DrawLine(vh, sp, dashep, size, color); sp = np; } + if (posList != null) posList.Add(p2); DrawLine(vh, sp, p2, size, color); } public static void DrawDashDotLine(VertexHelper vh, Vector3 p1, Vector3 p2, float size, Color32 color, - float dashLen = 15f, float blankDotLen = 15f) + float dashLen = 15f, float blankDotLen = 15f, List posList = null) { float dist = Vector3.Distance(p1, p2); if (dist < 0.1f) return; int segment = Mathf.CeilToInt(dist / (dashLen + blankDotLen)); Vector3 dir = (p2 - p1).normalized; Vector3 sp = p1, np; + if (posList != null) posList.Clear(); for (int i = 1; i <= segment; i++) { + if (posList != null) posList.Add(sp); np = p1 + dir * dist * i / segment; var dashep = np - dir * blankDotLen; DrawLine(vh, sp, dashep, size, color); + if (posList != null) posList.Add(dashep); var dotsp = dashep + (blankDotLen - 2 * size) / 2 * dir; var dotep = dotsp + 2 * size * dir; DrawLine(vh, dotsp, dotep, size, color); + if (posList != null) posList.Add(dotsp); sp = np; } + if (posList != null) posList.Add(p2); DrawLine(vh, sp, p2, size, color); } public static void DrawDashDotDotLine(VertexHelper vh, Vector3 p1, Vector3 p2, float size, - Color32 color, float dashLen = 15f, float blankDotLen = 20f) + Color32 color, float dashLen = 15f, float blankDotLen = 20f, List posList = null) { float dist = Vector3.Distance(p1, p2); if (dist < 0.1f) return; int segment = Mathf.CeilToInt(dist / (dashLen + blankDotLen)); Vector3 dir = (p2 - p1).normalized; Vector3 sp = p1, np; + if (posList != null) posList.Clear(); for (int i = 1; i <= segment; i++) { + if (posList != null) posList.Add(sp); np = p1 + dir * dist * i / segment; var dashep = np - dir * blankDotLen; DrawLine(vh, sp, dashep, size, color); + if (posList != null) posList.Add(dashep); var dotsp = dashep + (blankDotLen / 2 - 2 * size) / 2 * dir; var dotep = dotsp + 2 * size * dir; DrawLine(vh, dotsp, dotep, size, color); + if (posList != null) posList.Add(dotep); var dotsp2 = dashep + blankDotLen / 2 * dir; dotsp2 = dotsp2 + (blankDotLen / 4 - 2 * size) / 2 * dir; var dotep2 = dotsp2 + 2 * size * dir; DrawLine(vh, dotsp2, dotep2, size, color); + if (posList != null) posList.Add(dotep2); sp = np; } + if (posList != null) posList.Add(p2); DrawLine(vh, sp, p2, size, color); }