From 5c231514a5f82b990cde113d46304061e62b32f0 Mon Sep 17 00:00:00 2001 From: monitor1394 Date: Mon, 8 May 2023 23:24:50 +0800 Subject: [PATCH] =?UTF-8?q?Line=E6=94=AF=E6=8C=81Clip?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Editor/Series/LineEditor.cs | 2 +- Runtime/Coord/Grid/GridCoord.cs | 11 +++++-- Runtime/Serie/Line/LineHandler.GridCoord.cs | 11 ++++--- Runtime/Serie/Line/LineHelper.cs | 36 +++++++++++++++++++-- Runtime/Serie/SerieContext.cs | 1 + Runtime/Serie/SerieHelper.cs | 35 +++++++++++++++++++- Runtime/XUGL/UGLHelper.cs | 4 +-- 7 files changed, 85 insertions(+), 15 deletions(-) diff --git a/Editor/Series/LineEditor.cs b/Editor/Series/LineEditor.cs index 95b2e67c..a68b6f4f 100644 --- a/Editor/Series/LineEditor.cs +++ b/Editor/Series/LineEditor.cs @@ -22,7 +22,7 @@ namespace XCharts.Editor { PropertyField("m_SmoothLimit"); } - //PropertyField("m_Clip"); + PropertyField("m_Clip"); PropertyFiledMore(() => { PropertyFieldLimitMin("m_MinShow", 0); diff --git a/Runtime/Coord/Grid/GridCoord.cs b/Runtime/Coord/Grid/GridCoord.cs index f279faa9..f716f09b 100644 --- a/Runtime/Coord/Grid/GridCoord.cs +++ b/Runtime/Coord/Grid/GridCoord.cs @@ -151,10 +151,15 @@ namespace XCharts.Runtime public bool BoundaryPoint(Vector3 sp, Vector3 ep, ref Vector3 point) { if (Contains(sp) && Contains(ep)) - { - point = ep; return false; - } + if (sp.x < context.x && ep.x < context.x) + return false; + if (sp.x > context.x + context.width && ep.x > context.x + context.width) + return false; + if (sp.y < context.y && ep.y < context.y) + return false; + if (sp.y > context.y + context.height && ep.y > context.y + context.height) + return false; var lb = new Vector3(context.x, context.y); var lt = new Vector3(context.x, context.y + context.height); var rt = new Vector3(context.x + context.width, context.y + context.height); diff --git a/Runtime/Serie/Line/LineHandler.GridCoord.cs b/Runtime/Serie/Line/LineHandler.GridCoord.cs index d5699de2..07b56738 100644 --- a/Runtime/Serie/Line/LineHandler.GridCoord.cs +++ b/Runtime/Serie/Line/LineHandler.GridCoord.cs @@ -276,11 +276,13 @@ namespace XCharts.Runtime return; var axisLength = isY ? m_SerieGrid.context.height : m_SerieGrid.context.width; - var scaleWid = AxisHelper.GetDataWidth(axis, axisLength, showData.Count, dataZoom); + int maxCount = serie.maxShow > 0 ? (serie.maxShow > showData.Count ? showData.Count : serie.maxShow) : showData.Count; + maxCount -= serie.context.dataZoomStartIndexOffset; + var scaleWid = AxisHelper.GetDataWidth(axis, axisLength, maxCount, dataZoom); int rate = LineHelper.GetDataAverageRate(serie, m_SerieGrid, maxCount, false); var totalAverage = serie.sampleAverage > 0 ? serie.sampleAverage : @@ -304,9 +306,10 @@ namespace XCharts.Runtime SeriesHelper.UpdateStackDataList(chart.series, serie, dataZoom, m_StackSerieData); } var lp = Vector3.zero; - for (int i = serie.minShow; i < maxCount; i += rate) + for (int i = serie.minShow; i < showData.Count; i += rate) { var serieData = showData[i]; + var realIndex = i - serie.context.dataZoomStartIndexOffset; var isIgnore = serie.IsIgnoreValue(serieData); if (isIgnore) { @@ -320,7 +323,7 @@ namespace XCharts.Runtime else { var np = Vector3.zero; - var xValue = axis.IsCategory() ? i : serieData.GetData(0, axis.inverse); + var xValue = axis.IsCategory() ? realIndex : serieData.GetData(0, axis.inverse); var relativedValue = DataHelper.SampleValue(ref showData, serie.sampleType, rate, serie.minShow, maxCount, totalAverage, i, dataChangeDuration, ref dataChanging, relativedAxis, unscaledTime); @@ -329,7 +332,7 @@ namespace XCharts.Runtime serieData.context.isClip = false; if (serie.clip && !m_SerieGrid.Contains(np)) { - if (m_SerieGrid.BoundaryPoint(lp, np, ref np)) + //if (m_SerieGrid.BoundaryPoint(lp, np, ref np)) { serieData.context.isClip = true; } diff --git a/Runtime/Serie/Line/LineHelper.cs b/Runtime/Serie/Line/LineHelper.cs index 45871a0e..1dc5fa96 100644 --- a/Runtime/Serie/Line/LineHelper.cs +++ b/Runtime/Serie/Line/LineHelper.cs @@ -15,7 +15,7 @@ namespace XCharts.Runtime var rate = 0; var width = isYAxis ? grid.context.height : grid.context.width; if (sampleDist > 0) - rate = (int) ((maxCount - serie.minShow) / (width / sampleDist)); + rate = (int)((maxCount - serie.minShow) / (width / sampleDist)); if (rate < 1) rate = 1; return rate; @@ -281,6 +281,7 @@ namespace XCharts.Runtime var lastDataIsIgnore = datas[0].isIgnoreBreak; var smooth = serie.lineType == LineType.Smooth; + var firstInGridPointIndex = smooth && serie.clip ? -1 : 1; for (int i = 1; i < dataCount; i++) { var cdata = datas[i]; @@ -299,8 +300,37 @@ namespace XCharts.Runtime } serie.context.lineEndPostion = cp; serie.context.lineEndValue = AxisHelper.GetAxisPositionValue(grid, relativedAxis, cp); - var handled = false; + var isClip = false; + if (serie.clip) + { + if (smooth) + { + if (!grid.Contains(cp)) + isClip = true; + else if (firstInGridPointIndex <= 0) + firstInGridPointIndex = i; + if (firstInGridPointIndex > 0 && !grid.Contains(np)) + isClip = true; + } + else if (i == 1 || i == dataCount - 1) + { + var isLpInGrid = grid.Contains(lp); + var isCpInGrid = grid.Contains(cp); + if (i == 1 && !isLpInGrid) + { + grid.BoundaryPoint(lp, cp, ref lp); + } + if (i == dataCount -1 && !isCpInGrid) + { + if (grid.BoundaryPoint(lp, cp, ref cp)) + { + np = cp; + } + } + } + if (isClip) isIgnore = true; + } if (!smooth) { switch (serie.lineStyle.type) @@ -473,7 +503,7 @@ namespace XCharts.Runtime var dir = (ep - sp).normalized; var dist = Vector3.Distance(sp, ep); - var segment = (int) (dist / setting.lineSegmentDistance); + var segment = (int)(dist / setting.lineSegmentDistance); serie.context.drawPoints.Add(new PointInfo(sp, ignore)); for (int j = 1; j < segment; j++) { diff --git a/Runtime/Serie/SerieContext.cs b/Runtime/Serie/SerieContext.cs index 12b98f0d..1f7c2348 100644 --- a/Runtime/Serie/SerieContext.cs +++ b/Runtime/Serie/SerieContext.cs @@ -35,6 +35,7 @@ namespace XCharts.Runtime public List pointerAxisDataIndexs = new List(); public bool isTriggerByAxis = false; public int dataZoomStartIndex = 0; + public int dataZoomStartIndexOffset = 0; /// /// 中心点 diff --git a/Runtime/Serie/SerieHelper.cs b/Runtime/Serie/SerieHelper.cs index 73f18197..b8bb2f9d 100644 --- a/Runtime/Serie/SerieHelper.cs +++ b/Runtime/Serie/SerieHelper.cs @@ -766,7 +766,13 @@ namespace XCharts.Runtime /// public static void UpdateFilterData(Serie serie, DataZoom dataZoom) { - if (dataZoom == null || !dataZoom.enable) return; + if (dataZoom == null || !dataZoom.enable) + { + serie.m_NeedUpdateFilterData = true; + serie.context.dataZoomStartIndex = 0; + serie.context.dataZoomStartIndexOffset = 0; + return; + } if (dataZoom.IsContainsXAxis(serie.xAxisIndex)) { if (dataZoom.IsXAxisIndexValue(serie.xAxisIndex)) @@ -865,23 +871,50 @@ namespace XCharts.Runtime if (start >= 0) { serie.context.dataZoomStartIndex = start; + serie.context.dataZoomStartIndexOffset = 0; serie.m_FilterData = data.GetRange(start, range); + var nowCount = serie.m_FilterData.Count; + if (nowCount > 0) + { + if (serie.IsIgnoreValue(serie.m_FilterData[nowCount - 1])) + { + for (int i = start + range; i < data.Count; i++) + { + serie.m_FilterData.Add(data[i]); + if (!serie.IsIgnoreValue(data[i])) + break; + } + } + if (serie.IsIgnoreValue(serie.m_FilterData[0])) + { + for (int i = start - 1; i >= 0; i--) + { + serie.m_FilterData.Insert(0, data[i]); + serie.context.dataZoomStartIndexOffset++; + if (!serie.IsIgnoreValue(data[i])) + break; + } + } + } } else { serie.context.dataZoomStartIndex = 0; + serie.context.dataZoomStartIndexOffset = 0; serie.m_FilterData = data; } } else { serie.context.dataZoomStartIndex = 0; + serie.context.dataZoomStartIndexOffset = 0; serie.m_FilterData = data; } } else if (end == 0) { serie.context.dataZoomStartIndex = 0; + serie.context.dataZoomStartIndexOffset = 0; if (serie.m_FilterData == null) serie.m_FilterData = new List(); else if (serie.m_FilterData.Count > 0) diff --git a/Runtime/XUGL/UGLHelper.cs b/Runtime/XUGL/UGLHelper.cs index a16c831e..d394d2e0 100644 --- a/Runtime/XUGL/UGLHelper.cs +++ b/Runtime/XUGL/UGLHelper.cs @@ -255,12 +255,10 @@ namespace XUGL /// 线段1终点 /// 线段2起点 /// 线段2终点 - /// 相交点。当不想交时默认为 Vector3.zero + /// 相交点。当不相交时为初始值 /// 相交则返回 true, 否则返回 false public static bool GetIntersection(Vector3 p1, Vector3 p2, Vector3 p3, Vector3 p4, ref Vector3 intersection) { - intersection = Vector3.zero; - var d = (p2.x - p1.x) * (p4.y - p3.y) - (p2.y - p1.y) * (p4.x - p3.x); if (d == 0) return false;