Line支持Clip

This commit is contained in:
monitor1394
2023-05-11 08:34:04 +08:00
parent fab683f5e1
commit bab788d4cb
2 changed files with 74 additions and 35 deletions

View File

@@ -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;
}
/// <summary>

View File

@@ -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<Vector3>();
// var interactPoints = new List<Vector3>();
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)