Line支持Clip

This commit is contained in:
monitor1394
2023-05-08 23:24:50 +08:00
parent 93abffaaaa
commit 5c231514a5
7 changed files with 85 additions and 15 deletions

View File

@@ -22,7 +22,7 @@ namespace XCharts.Editor
{ {
PropertyField("m_SmoothLimit"); PropertyField("m_SmoothLimit");
} }
//PropertyField("m_Clip"); PropertyField("m_Clip");
PropertyFiledMore(() => PropertyFiledMore(() =>
{ {
PropertyFieldLimitMin("m_MinShow", 0); PropertyFieldLimitMin("m_MinShow", 0);

View File

@@ -151,10 +151,15 @@ namespace XCharts.Runtime
public bool BoundaryPoint(Vector3 sp, Vector3 ep, ref Vector3 point) public bool BoundaryPoint(Vector3 sp, Vector3 ep, ref Vector3 point)
{ {
if (Contains(sp) && Contains(ep)) if (Contains(sp) && Contains(ep))
{
point = ep;
return false; 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 lb = new Vector3(context.x, context.y);
var lt = new Vector3(context.x, context.y + context.height); var lt = new Vector3(context.x, context.y + context.height);
var rt = new Vector3(context.x + context.width, context.y + context.height); var rt = new Vector3(context.x + context.width, context.y + context.height);

View File

@@ -276,11 +276,13 @@ namespace XCharts.Runtime
return; return;
var axisLength = isY ? m_SerieGrid.context.height : m_SerieGrid.context.width; 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 ? int maxCount = serie.maxShow > 0 ?
(serie.maxShow > showData.Count ? showData.Count : serie.maxShow) : (serie.maxShow > showData.Count ? showData.Count : serie.maxShow) :
showData.Count; showData.Count;
maxCount -= serie.context.dataZoomStartIndexOffset;
var scaleWid = AxisHelper.GetDataWidth(axis, axisLength, maxCount, dataZoom);
int rate = LineHelper.GetDataAverageRate(serie, m_SerieGrid, maxCount, false); int rate = LineHelper.GetDataAverageRate(serie, m_SerieGrid, maxCount, false);
var totalAverage = serie.sampleAverage > 0 ? var totalAverage = serie.sampleAverage > 0 ?
serie.sampleAverage : serie.sampleAverage :
@@ -304,9 +306,10 @@ namespace XCharts.Runtime
SeriesHelper.UpdateStackDataList(chart.series, serie, dataZoom, m_StackSerieData); SeriesHelper.UpdateStackDataList(chart.series, serie, dataZoom, m_StackSerieData);
} }
var lp = Vector3.zero; 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 serieData = showData[i];
var realIndex = i - serie.context.dataZoomStartIndexOffset;
var isIgnore = serie.IsIgnoreValue(serieData); var isIgnore = serie.IsIgnoreValue(serieData);
if (isIgnore) if (isIgnore)
{ {
@@ -320,7 +323,7 @@ namespace XCharts.Runtime
else else
{ {
var np = Vector3.zero; 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, var relativedValue = DataHelper.SampleValue(ref showData, serie.sampleType, rate, serie.minShow,
maxCount, totalAverage, i, dataChangeDuration, ref dataChanging, relativedAxis, unscaledTime); maxCount, totalAverage, i, dataChangeDuration, ref dataChanging, relativedAxis, unscaledTime);
@@ -329,7 +332,7 @@ namespace XCharts.Runtime
serieData.context.isClip = false; serieData.context.isClip = false;
if (serie.clip && !m_SerieGrid.Contains(np)) 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; serieData.context.isClip = true;
} }

View File

@@ -15,7 +15,7 @@ namespace XCharts.Runtime
var rate = 0; var rate = 0;
var width = isYAxis ? grid.context.height : grid.context.width; var width = isYAxis ? grid.context.height : grid.context.width;
if (sampleDist > 0) if (sampleDist > 0)
rate = (int) ((maxCount - serie.minShow) / (width / sampleDist)); rate = (int)((maxCount - serie.minShow) / (width / sampleDist));
if (rate < 1) if (rate < 1)
rate = 1; rate = 1;
return rate; return rate;
@@ -281,6 +281,7 @@ namespace XCharts.Runtime
var lastDataIsIgnore = datas[0].isIgnoreBreak; var lastDataIsIgnore = datas[0].isIgnoreBreak;
var smooth = serie.lineType == LineType.Smooth; var smooth = serie.lineType == LineType.Smooth;
var firstInGridPointIndex = smooth && serie.clip ? -1 : 1;
for (int i = 1; i < dataCount; i++) for (int i = 1; i < dataCount; i++)
{ {
var cdata = datas[i]; var cdata = datas[i];
@@ -299,8 +300,37 @@ namespace XCharts.Runtime
} }
serie.context.lineEndPostion = cp; serie.context.lineEndPostion = cp;
serie.context.lineEndValue = AxisHelper.GetAxisPositionValue(grid, relativedAxis, cp); serie.context.lineEndValue = AxisHelper.GetAxisPositionValue(grid, relativedAxis, cp);
var handled = false; 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) if (!smooth)
{ {
switch (serie.lineStyle.type) switch (serie.lineStyle.type)
@@ -473,7 +503,7 @@ namespace XCharts.Runtime
var dir = (ep - sp).normalized; var dir = (ep - sp).normalized;
var dist = Vector3.Distance(sp, ep); 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)); serie.context.drawPoints.Add(new PointInfo(sp, ignore));
for (int j = 1; j < segment; j++) for (int j = 1; j < segment; j++)
{ {

View File

@@ -35,6 +35,7 @@ namespace XCharts.Runtime
public List<int> pointerAxisDataIndexs = new List<int>(); public List<int> pointerAxisDataIndexs = new List<int>();
public bool isTriggerByAxis = false; public bool isTriggerByAxis = false;
public int dataZoomStartIndex = 0; public int dataZoomStartIndex = 0;
public int dataZoomStartIndexOffset = 0;
/// <summary> /// <summary>
/// 中心点 /// 中心点

View File

@@ -766,7 +766,13 @@ namespace XCharts.Runtime
/// <param name="dataZoom"></param> /// <param name="dataZoom"></param>
public static void UpdateFilterData(Serie serie, DataZoom dataZoom) 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.IsContainsXAxis(serie.xAxisIndex))
{ {
if (dataZoom.IsXAxisIndexValue(serie.xAxisIndex)) if (dataZoom.IsXAxisIndexValue(serie.xAxisIndex))
@@ -865,23 +871,50 @@ namespace XCharts.Runtime
if (start >= 0) if (start >= 0)
{ {
serie.context.dataZoomStartIndex = start; serie.context.dataZoomStartIndex = start;
serie.context.dataZoomStartIndexOffset = 0;
serie.m_FilterData = data.GetRange(start, range); 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 else
{ {
serie.context.dataZoomStartIndex = 0; serie.context.dataZoomStartIndex = 0;
serie.context.dataZoomStartIndexOffset = 0;
serie.m_FilterData = data; serie.m_FilterData = data;
} }
} }
else else
{ {
serie.context.dataZoomStartIndex = 0; serie.context.dataZoomStartIndex = 0;
serie.context.dataZoomStartIndexOffset = 0;
serie.m_FilterData = data; serie.m_FilterData = data;
} }
} }
else if (end == 0) else if (end == 0)
{ {
serie.context.dataZoomStartIndex = 0; serie.context.dataZoomStartIndex = 0;
serie.context.dataZoomStartIndexOffset = 0;
if (serie.m_FilterData == null) if (serie.m_FilterData == null)
serie.m_FilterData = new List<SerieData>(); serie.m_FilterData = new List<SerieData>();
else if (serie.m_FilterData.Count > 0) else if (serie.m_FilterData.Count > 0)

View File

@@ -255,12 +255,10 @@ namespace XUGL
/// <param name="p2">线段1终点</param> /// <param name="p2">线段1终点</param>
/// <param name="p3">线段2起点</param> /// <param name="p3">线段2起点</param>
/// <param name="p4">线段2终点</param> /// <param name="p4">线段2终点</param>
/// <param name="intersection">相交点。当不交时默认为 Vector3.zero </param> /// <param name="intersection">相交点。当不交时为初始值</param>
/// <returns>相交则返回 true, 否则返回 false</returns> /// <returns>相交则返回 true, 否则返回 false</returns>
public static bool GetIntersection(Vector3 p1, Vector3 p2, Vector3 p3, Vector3 p4, ref Vector3 intersection) 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); var d = (p2.x - p1.x) * (p4.y - p3.y) - (p2.y - p1.y) * (p4.x - p3.x);
if (d == 0) if (d == 0)
return false; return false;