修复LineChart开启ingore时部分数据可能绘制异常的问题

This commit is contained in:
monitor1394
2020-03-14 11:52:22 +08:00
parent 78c76878d3
commit 2db035a9e1
2 changed files with 115 additions and 59 deletions

View File

@@ -1,6 +1,7 @@
# 更新日志 # 更新日志
* (2020.03.14) 修复`LineChart`开启`ingore`时部分数据可能绘制异常的问题
* (2020.03.13) 修复`LineChart``label`偏移显示异常的问题 * (2020.03.13) 修复`LineChart``label`偏移显示异常的问题
* (2020.03.11) 发布`v1.3.0`版本 * (2020.03.11) 发布`v1.3.0`版本
* (2020.03.11) 优化`LineChart``label`偏移显示 * (2020.03.11) 优化`LineChart``label`偏移显示

View File

@@ -161,11 +161,18 @@ namespace XCharts
{ {
return; return;
} }
lp = serie.dataPoints[0]; var startIndex = 0;
int dataCount = serie.dataPoints.Count; var endIndex = serie.dataPoints.Count;
var startPos = GetStartPos(serie.dataPoints, ref startIndex);
var endPos = GetEndPos(serie.dataPoints, ref endIndex);
lp = startPos;
stPos1 = stPos2 = lastDir = lastDnPos = Vector3.zero;
smoothStartPosUp = smoothStartPosDn = Vector3.zero;
int dataCount = endIndex - startIndex;
float currDetailProgress = lp.x; float currDetailProgress = lp.x;
float totalDetailProgress = serie.dataPoints[dataCount - 1].x; float totalDetailProgress = endPos.x;
serie.animation.InitProgress(dataCount, currDetailProgress, totalDetailProgress); serie.animation.InitProgress(serie.dataPoints.Count, currDetailProgress, totalDetailProgress);
serie.animation.SetDataFinish(startIndex);
Vector3 firstLastPos = Vector3.zero, lastNextPos = Vector3.zero; Vector3 firstLastPos = Vector3.zero, lastNextPos = Vector3.zero;
if (serie.minShow > 0 && serie.minShow < showData.Count) if (serie.minShow > 0 && serie.minShow < showData.Count)
@@ -200,14 +207,18 @@ namespace XCharts
} }
else else
{ {
lastNextPos = serie.dataPoints[serie.dataPoints.Count - 1]; lastNextPos = endPos;
} }
for (i = 1; i < serie.dataPoints.Count; i++) for (i = startIndex + 1; i < serie.dataPoints.Count; i++)
{ {
np = serie.dataPoints[i]; np = serie.dataPoints[i];
serie.ClearSmoothList(i); serie.ClearSmoothList(i);
//if(np == Vector3.zero) continue; if (np == Vector3.zero)
//if (!serie.animation.NeedAnimation(i)) break; {
serie.animation.SetDataFinish(i);
continue;
}
if (!serie.animation.NeedAnimation(i)) break;
bool isFinish = true; bool isFinish = true;
if (serie.areaStyle.tooltipHighlight && m_Tooltip.show && i <= m_Tooltip.runtimeDataIndex[0]) if (serie.areaStyle.tooltipHighlight && m_Tooltip.show && i <= m_Tooltip.runtimeDataIndex[0])
{ {
@@ -222,9 +233,10 @@ namespace XCharts
switch (serie.lineType) switch (serie.lineType)
{ {
case LineType.Normal: case LineType.Normal:
lp = GetLastPos(serie.dataPoints, i, np);
nnp = GetNNPos(serie.dataPoints, i, np); nnp = GetNNPos(serie.dataPoints, i, np);
isFinish = DrawNormalLine(vh, serie, xAxis, lp, np, nnp, i, lineColor, isFinish = DrawNormalLine(vh, serie, xAxis, lp, np, nnp, i, lineColor,
areaColor, areaToColor, zeroPos); areaColor, areaToColor, zeroPos, startIndex);
break; break;
case LineType.Smooth: case LineType.Smooth:
case LineType.SmoothDash: case LineType.SmoothDash:
@@ -233,7 +245,7 @@ namespace XCharts
llp = GetLLPos(serie.dataPoints, i, firstLastPos); llp = GetLLPos(serie.dataPoints, i, firstLastPos);
nnp = GetNNPos(serie.dataPoints, i, lastNextPos); nnp = GetNNPos(serie.dataPoints, i, lastNextPos);
isFinish = DrawSmoothLine(vh, serie, xAxis, lp, np, llp, nnp, i, isFinish = DrawSmoothLine(vh, serie, xAxis, lp, np, llp, nnp, i,
lineColor, areaColor, areaToColor, isStack, zeroPos); lineColor, areaColor, areaToColor, isStack, zeroPos, startIndex);
break; break;
case LineType.StepStart: case LineType.StepStart:
case LineType.StepMiddle: case LineType.StepMiddle:
@@ -273,10 +285,36 @@ namespace XCharts
return np; return np;
} }
private Vector3 GetStartPos(List<Vector3> dataPoints, ref int start)
{
for (int i = 0; i < dataPoints.Count; i++)
{
if (dataPoints[i] != Vector3.zero)
{
start = i;
return dataPoints[i];
}
}
return Vector3.zero;
}
private Vector3 GetEndPos(List<Vector3> dataPoints, ref int end)
{
for (int i = dataPoints.Count - 1; i >= 0; i--)
{
if (dataPoints[i] != Vector3.zero)
{
end = i;
return dataPoints[i];
}
}
return Vector3.zero;
}
private Vector3 GetLastPos(List<Vector3> dataPoints, int index, Vector3 pos) private Vector3 GetLastPos(List<Vector3> dataPoints, int index, Vector3 pos)
{ {
if (index <= 0) return pos; if (index <= 0) return pos;
for (int i = index - 1; i > 0; i--) for (int i = index - 1; i >= 0; i--)
{ {
if (dataPoints[i] != Vector3.zero) return dataPoints[i]; if (dataPoints[i] != Vector3.zero) return dataPoints[i];
} }
@@ -286,7 +324,7 @@ namespace XCharts
private Vector3 GetLLPos(List<Vector3> dataPoints, int index, Vector3 lp) private Vector3 GetLLPos(List<Vector3> dataPoints, int index, Vector3 lp)
{ {
if (index <= 1) return lp; if (index <= 1) return lp;
for (int i = index - 2; i > 0; i--) for (int i = index - 2; i >= 0; i--)
{ {
if (dataPoints[i] != Vector3.zero) return dataPoints[i]; if (dataPoints[i] != Vector3.zero) return dataPoints[i];
} }
@@ -595,8 +633,9 @@ namespace XCharts
private Vector3 stPos1, stPos2, lastDir, lastDnPos; private Vector3 stPos1, stPos2, lastDir, lastDnPos;
private bool DrawNormalLine(VertexHelper vh, Serie serie, Axis axis, Vector3 lp, private bool DrawNormalLine(VertexHelper vh, Serie serie, Axis axis, Vector3 lp,
Vector3 np, Vector3 nnp, int dataIndex, Color lineColor, Color areaColor, Color areaToColor, Vector3 np, Vector3 nnp, int dataIndex, Color lineColor, Color areaColor, Color areaToColor,
Vector3 zeroPos) Vector3 zeroPos, int startIndex = 0)
{ {
var isSecond = dataIndex == startIndex + 1;
bool isYAxis = axis is YAxis; bool isYAxis = axis is YAxis;
var lineWidth = serie.lineStyle.width; var lineWidth = serie.lineStyle.width;
var ySmall = Mathf.Abs(lp.y - np.y) < lineWidth * 3; var ySmall = Mathf.Abs(lp.y - np.y) < lineWidth * 3;
@@ -641,7 +680,7 @@ namespace XCharts
upPos2 = np + dir1v * serie.lineStyle.width; upPos2 = np + dir1v * serie.lineStyle.width;
dnPos = isDown ? upPos2 : upPos1; dnPos = isDown ? upPos2 : upPos1;
} }
if (dataIndex == 1) if (isSecond)
{ {
stPos1 = lp - dir1v * serie.lineStyle.width; stPos1 = lp - dir1v * serie.lineStyle.width;
stPos2 = lp + dir1v * serie.lineStyle.width; stPos2 = lp + dir1v * serie.lineStyle.width;
@@ -671,10 +710,14 @@ namespace XCharts
{ {
if (!isStart) if (!isStart)
{ {
if ((isYAxis && tp1.y > lastDnPos.y) || (!isYAxis && tp1.x > lastDnPos.x) || dataIndex == 1 || IsValue()) if ((isYAxis && tp1.y > lastDnPos.y) || (!isYAxis && tp1.x > lastDnPos.x) || isSecond || IsValue())
{ {
isStart = true; isStart = true;
CheckClipAndDrawPolygon(vh, stPos1, tp1, tp2, stPos2, lineColor, serie.clip); if (stPos2 != Vector3.zero)
{
CheckClipAndDrawPolygon(vh, stPos1, tp1, tp2, stPos2, lineColor, serie.clip);
}
} }
} }
else else
@@ -706,13 +749,13 @@ namespace XCharts
if (isYAxis) if (isYAxis)
{ {
if (tp1.y > lastDnPos.y || dataIndex == 1 || IsValue()) smoothPoints.Add(tp1); if (tp1.y > lastDnPos.y || isSecond || IsValue()) smoothPoints.Add(tp1);
if (tp2.y < dnPos.y || IsValue()) smoothDownPoints.Add(tp2); if (tp2.y < dnPos.y || IsValue()) smoothDownPoints.Add(tp2);
} }
else else
{ {
if (tp1.x > lastDnPos.x || dataIndex == 1 || IsValue()) smoothPoints.Add(tp1); if (tp1.x > lastDnPos.x || isSecond || IsValue()) smoothPoints.Add(tp1);
if (tp2.x < dnPos.x || dataIndex == 1 || IsValue()) smoothDownPoints.Add(tp2); if (tp2.x < dnPos.x || isSecond || IsValue()) smoothDownPoints.Add(tp2);
} }
} }
else else
@@ -721,10 +764,14 @@ namespace XCharts
{ {
if (!isStart) if (!isStart)
{ {
if ((isYAxis && tp2.y > lastDnPos.y) || (!isYAxis && tp2.x > lastDnPos.x) || dataIndex == 1 || IsValue()) if ((isYAxis && tp2.y > lastDnPos.y) || (!isYAxis && tp2.x > lastDnPos.x) || isSecond || IsValue())
{ {
isStart = true; isStart = true;
CheckClipAndDrawPolygon(vh, stPos1, tp1, tp2, stPos2, lineColor, serie.clip); if (stPos2 != Vector3.zero)
{
CheckClipAndDrawPolygon(vh, stPos1, tp1, tp2, stPos2, lineColor, serie.clip);
}
} }
} }
else else
@@ -755,12 +802,12 @@ namespace XCharts
if (isYAxis) if (isYAxis)
{ {
if (tp1.y < dnPos.y || IsValue()) smoothPoints.Add(tp1); if (tp1.y < dnPos.y || IsValue()) smoothPoints.Add(tp1);
if (tp2.y > lastDnPos.y || dataIndex == 1 || IsValue()) smoothDownPoints.Add(tp2); if (tp2.y > lastDnPos.y || isSecond || IsValue()) smoothDownPoints.Add(tp2);
} }
else else
{ {
if (tp1.x < dnPos.x || IsValue()) smoothPoints.Add(tp1); if (tp1.x < dnPos.x || IsValue()) smoothPoints.Add(tp1);
if (tp2.x > lastDnPos.x || dataIndex == 1 || IsValue()) smoothDownPoints.Add(tp2); if (tp2.x > lastDnPos.x || isSecond || IsValue()) smoothDownPoints.Add(tp2);
} }
} }
start = cp; start = cp;
@@ -801,12 +848,15 @@ namespace XCharts
{ {
var points = ((isYAxis && lp.x < zeroPos.x) || (!isYAxis && lp.y < zeroPos.y)) ? smoothPoints : smoothDownPoints; var points = ((isYAxis && lp.x < zeroPos.x) || (!isYAxis && lp.y < zeroPos.y)) ? smoothPoints : smoothDownPoints;
Vector3 aep = isYAxis ? new Vector3(zeroPos.x, zeroPos.y + coordinateHeight) : new Vector3(zeroPos.x + coordinateWidth, zeroPos.y); Vector3 aep = isYAxis ? new Vector3(zeroPos.x, zeroPos.y + coordinateHeight) : new Vector3(zeroPos.x + coordinateWidth, zeroPos.y);
var cross = ChartHelper.GetIntersection(points[0], points[points.Count - 1], zeroPos, aep); var sindex = 0;
var eindex = 0;
var sp = GetStartPos(points, ref sindex);
var ep = GetEndPos(points, ref eindex);
var cross = ChartHelper.GetIntersection(sp, ep, zeroPos, aep);
if (cross == Vector3.zero || smoothDownPoints.Count <= 3) if (cross == Vector3.zero || smoothDownPoints.Count <= 3)
{ {
Vector3 sp = points[0]; sp = points[sindex];
Vector3 ep; for (int i = sindex + 1; i <= eindex; i++)
for (int i = 1; i < points.Count; i++)
{ {
ep = points[i]; ep = points[i];
if (serie.animation.CheckDetailBreak(ep, isYAxis)) break; if (serie.animation.CheckDetailBreak(ep, isYAxis)) break;
@@ -829,7 +879,6 @@ namespace XCharts
var ruPos = ChartHelper.GetIntersection(sp1, ep1, axisUpStart, axisUpEnd); var ruPos = ChartHelper.GetIntersection(sp1, ep1, axisUpStart, axisUpEnd);
var rdPos = ChartHelper.GetIntersection(sp1, ep1, axisDownStart, axisDownEnd); var rdPos = ChartHelper.GetIntersection(sp1, ep1, axisDownStart, axisDownEnd);
Vector3 sp, ep;
if (luPos == Vector3.zero || ldPos == Vector3.zero || ruPos == Vector3.zero || rdPos == Vector3.zero) if (luPos == Vector3.zero || ldPos == Vector3.zero || ruPos == Vector3.zero || rdPos == Vector3.zero)
{ {
sp = points[0]; sp = points[0];
@@ -1015,7 +1064,7 @@ namespace XCharts
private Vector3 smoothStartPosUp, smoothStartPosDn; private Vector3 smoothStartPosUp, smoothStartPosDn;
private bool DrawSmoothLine(VertexHelper vh, Serie serie, Axis xAxis, Vector3 lp, private bool DrawSmoothLine(VertexHelper vh, Serie serie, Axis xAxis, Vector3 lp,
Vector3 np, Vector3 llp, Vector3 nnp, int dataIndex, Color lineColor, Color areaColor, Vector3 np, Vector3 llp, Vector3 nnp, int dataIndex, Color lineColor, Color areaColor,
Color areaToColor, bool isStack, Vector3 zeroPos) Color areaToColor, bool isStack, Vector3 zeroPos, int startIndex = 0)
{ {
bool isYAxis = xAxis is YAxis; bool isYAxis = xAxis is YAxis;
var lineWidth = serie.lineStyle.width; var lineWidth = serie.lineStyle.width;
@@ -1045,12 +1094,15 @@ namespace XCharts
Vector3 toUp, toDn, tnp, tlp; Vector3 toUp, toDn, tnp, tlp;
bool isFinish = true; bool isFinish = true;
if (dataIndex > 1) if (dataIndex > startIndex + 1)
{ {
CheckClipAndDrawTriangle(vh, smoothStartPosUp, startUp, lp, lineColor, serie.clip); if (smoothStartPosDn != Vector3.zero && smoothStartPosUp != Vector3.zero)
CheckClipAndDrawTriangle(vh, smoothStartPosDn, startDn, lp, lineColor, serie.clip); {
smoothPoints.Add(smoothStartPosUp); CheckClipAndDrawTriangle(vh, smoothStartPosUp, startUp, lp, lineColor, serie.clip);
smoothDownPoints.Add(smoothStartPosDn); CheckClipAndDrawTriangle(vh, smoothStartPosDn, startDn, lp, lineColor, serie.clip);
smoothPoints.Add(smoothStartPosUp);
smoothDownPoints.Add(smoothStartPosDn);
}
} }
else else
{ {
@@ -1081,38 +1133,41 @@ namespace XCharts
} }
if (serie.areaStyle.show && (serie.index == 0 || !isStack)) if (serie.areaStyle.show && (serie.index == 0 || !isStack))
{ {
if (k == 1 && dataIndex > 1) if (k == 1 && dataIndex > startIndex + 1)
{ {
startDn = smoothStartPosDn; startDn = smoothStartPosDn;
} }
if (isYAxis) if (startDn != Vector3.zero)
{ {
if (start.x > zeroPos.x && to.x > zeroPos.x) if (isYAxis)
{ {
tnp = new Vector3(zeroPos.x + xAxis.axisLine.width, toDn.y); if (start.x > zeroPos.x && to.x > zeroPos.x)
tlp = new Vector3(zeroPos.x + xAxis.axisLine.width, startDn.y); {
CheckClipAndDrawPolygon(vh, startDn, toDn, tnp, tlp, areaColor, areaToColor, serie.clip); tnp = new Vector3(zeroPos.x + xAxis.axisLine.width, toDn.y);
tlp = new Vector3(zeroPos.x + xAxis.axisLine.width, startDn.y);
CheckClipAndDrawPolygon(vh, startDn, toDn, tnp, tlp, areaColor, areaToColor, serie.clip);
}
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);
CheckClipAndDrawPolygon(vh, tnp, tlp, startUp, toUp, areaToColor, areaColor, serie.clip);
}
} }
else if (start.x < zeroPos.x && to.x < zeroPos.x) else
{ {
tnp = new Vector3(zeroPos.x - xAxis.axisLine.width, toUp.y); if (start.y > zeroPos.y && to.y > zeroPos.y)
tlp = new Vector3(zeroPos.x - xAxis.axisLine.width, startUp.y); {
CheckClipAndDrawPolygon(vh, tnp, tlp, startUp, toUp, areaToColor, areaColor, serie.clip); tnp = new Vector3(toDn.x, zeroPos.y + xAxis.axisLine.width);
} tlp = new Vector3(startDn.x, zeroPos.y + xAxis.axisLine.width);
} CheckClipAndDrawPolygon(vh, startDn, toDn, tnp, tlp, areaColor, areaToColor, serie.clip);
else }
{ else if (start.y < zeroPos.y && to.y < zeroPos.y)
if (start.y > zeroPos.y && to.y > zeroPos.y) {
{ tnp = new Vector3(toUp.x, zeroPos.y - xAxis.axisLine.width);
tnp = new Vector3(toDn.x, zeroPos.y + xAxis.axisLine.width); tlp = new Vector3(startUp.x, zeroPos.y - xAxis.axisLine.width);
tlp = new Vector3(startDn.x, zeroPos.y + xAxis.axisLine.width); CheckClipAndDrawPolygon(vh, tlp, tnp, toUp, startUp, areaToColor, areaColor, serie.clip);
CheckClipAndDrawPolygon(vh, startDn, toDn, tnp, tlp, areaColor, areaToColor, serie.clip); }
}
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);
CheckClipAndDrawPolygon(vh, tlp, tnp, toUp, startUp, areaToColor, areaColor, serie.clip);
} }
} }
} }