diff --git a/Runtime/Coord/Grid/GridCoord.cs b/Runtime/Coord/Grid/GridCoord.cs index 52982881..9d4fe754 100644 --- a/Runtime/Coord/Grid/GridCoord.cs +++ b/Runtime/Coord/Grid/GridCoord.cs @@ -133,14 +133,48 @@ namespace XCharts.Runtime return Contains(pos.x, pos.y); } + [Since("v3.7.0")] + public bool Contains(Vector3 pos, bool isYAxis) + { + return isYAxis ? ContainsY(pos.y) : ContainsX(pos.x); + } + public bool Contains(float x, float y) { - if (x < context.x - 1 || x > context.x + context.width + 1 || - y < context.y - 1 || y > context.y + context.height + 1) - { - return false; - } - return true; + return ContainsX(x) && ContainsY(y); + } + + [Since("v3.7.0")] + public bool ContainsX(float x) + { + return x >= context.x && x <= context.x + context.width; + } + + [Since("v3.7.0")] + public bool ContainsY(float y) + { + return y >= context.y && y <= context.y + context.height; + } + + [Since("v3.7.0")] + public void Clamp(ref Vector3 pos) + { + ClampX(ref pos); + ClampY(ref pos); + } + + [Since("v3.7.0")] + public void ClampX(ref Vector3 pos) + { + if (pos.x < context.x) pos.x = context.x; + else if (pos.x > context.x + context.width) pos.x = context.x + context.width; + } + + [Since("v3.7.0")] + public void ClampY(ref Vector3 pos) + { + if (pos.y < context.y) pos.y = context.y; + else if (pos.y > context.y + context.height) pos.y = context.y + context.height; } /// diff --git a/Runtime/Serie/Line/LineHelper.cs b/Runtime/Serie/Line/LineHelper.cs index dcbe6957..2d796b41 100644 --- a/Runtime/Serie/Line/LineHelper.cs +++ b/Runtime/Serie/Line/LineHelper.cs @@ -86,8 +86,13 @@ namespace XCharts.Runtime var lastDataIsIgnore = false; for (int i = 0; i < points.Count; i++) { - var tp = points[i].position; - var isIgnore = points[i].isIgnoreBreak; + var pdata = points[i]; + var tp = pdata.position; + if (serie.clip) + { + grid.Clamp(ref tp); + } + var isIgnore = pdata.isIgnoreBreak; var color = areaColor; var toColor = areaToColor; var lerp = areaLerp; @@ -282,7 +287,7 @@ namespace XCharts.Runtime var lastDataIsIgnore = datas[0].isIgnoreBreak; var smooth = serie.lineType == LineType.Smooth; var firstInGridPointIndex = smooth && serie.clip ? -1 : 1; - var interactPoints = new List(); + // var interactPoints = new List(); for (int i = 1; i < dataCount; i++) { var cdata = datas[i]; @@ -305,7 +310,7 @@ namespace XCharts.Runtime var isClip = false; if (serie.clip) { - if (smooth) + //if (smooth) { if (!grid.Contains(cp)) isClip = true; @@ -314,29 +319,29 @@ namespace XCharts.Runtime if (firstInGridPointIndex > 0 && !grid.Contains(np)) isClip = true; } - else - { - var isLpInGrid = grid.Contains(lp); - var isCpInGrid = grid.Contains(cp); - if (!isLpInGrid || !isCpInGrid) - { - interactPoints.Clear(); - if (grid.BoundaryPoint(lp, cp, ref interactPoints)) - { - if (interactPoints.Count >= 2) - { - lp = interactPoints[0]; - cp = interactPoints[1]; - } - else if (isLpInGrid) - cp = interactPoints[0]; - else - lp = interactPoints[0]; - if (i == dataCount - 1) - np = cp; - } - } - } + // else + // { + // var isLpInGrid = grid.Contains(lp); + // var isCpInGrid = grid.Contains(cp); + // if (!isLpInGrid || !isCpInGrid) + // { + // interactPoints.Clear(); + // if (grid.BoundaryPoint(lp, cp, ref interactPoints)) + // { + // if (interactPoints.Count >= 2) + // { + // lp = interactPoints[0]; + // cp = interactPoints[1]; + // } + // else if (isLpInGrid) + // cp = interactPoints[0]; + // else + // lp = interactPoints[0]; + // if (i == dataCount - 1) + // np = cp; + // } + // } + // } if (isClip) isIgnore = true; } if (!smooth) @@ -379,7 +384,7 @@ namespace XCharts.Runtime ref itp, ref ibp, ref clp, ref crp, ref bitp, ref bibp, i); - if (i == 1) + if (i == firstInGridPointIndex) { AddLineVertToVertexHelper(vh, ltp, lbp, lineColor, isVisualMapGradient, isLineStyleGradient, visualMap, serie.lineStyle, grid, axis, relativedAxis, false, lastDataIsIgnore, isIgnore); @@ -498,7 +503,7 @@ namespace XCharts.Runtime private static void UpdateNormalLineDrawPoints(Serie serie, Settings setting, VisualMap visualMap) { var isVisualMapGradient = VisualMapHelper.IsNeedGradient(visualMap); - if (isVisualMapGradient) + if (isVisualMapGradient || serie.clip) { var dataPoints = serie.context.dataPoints; if (dataPoints.Count > 1)