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); 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) public bool Contains(float x, float y)
{ {
if (x < context.x - 1 || x > context.x + context.width + 1 || return ContainsX(x) && ContainsY(y);
y < context.y - 1 || y > context.y + context.height + 1) }
{
return false; [Since("v3.7.0")]
} public bool ContainsX(float x)
return true; {
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> /// <summary>

View File

@@ -86,8 +86,13 @@ namespace XCharts.Runtime
var lastDataIsIgnore = false; var lastDataIsIgnore = false;
for (int i = 0; i < points.Count; i++) for (int i = 0; i < points.Count; i++)
{ {
var tp = points[i].position; var pdata = points[i];
var isIgnore = points[i].isIgnoreBreak; var tp = pdata.position;
if (serie.clip)
{
grid.Clamp(ref tp);
}
var isIgnore = pdata.isIgnoreBreak;
var color = areaColor; var color = areaColor;
var toColor = areaToColor; var toColor = areaToColor;
var lerp = areaLerp; var lerp = areaLerp;
@@ -282,7 +287,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; var firstInGridPointIndex = smooth && serie.clip ? -1 : 1;
var interactPoints = new List<Vector3>(); // var interactPoints = new List<Vector3>();
for (int i = 1; i < dataCount; i++) for (int i = 1; i < dataCount; i++)
{ {
var cdata = datas[i]; var cdata = datas[i];
@@ -305,7 +310,7 @@ namespace XCharts.Runtime
var isClip = false; var isClip = false;
if (serie.clip) if (serie.clip)
{ {
if (smooth) //if (smooth)
{ {
if (!grid.Contains(cp)) if (!grid.Contains(cp))
isClip = true; isClip = true;
@@ -314,29 +319,29 @@ namespace XCharts.Runtime
if (firstInGridPointIndex > 0 && !grid.Contains(np)) if (firstInGridPointIndex > 0 && !grid.Contains(np))
isClip = true; isClip = true;
} }
else // else
{ // {
var isLpInGrid = grid.Contains(lp); // var isLpInGrid = grid.Contains(lp);
var isCpInGrid = grid.Contains(cp); // var isCpInGrid = grid.Contains(cp);
if (!isLpInGrid || !isCpInGrid) // if (!isLpInGrid || !isCpInGrid)
{ // {
interactPoints.Clear(); // interactPoints.Clear();
if (grid.BoundaryPoint(lp, cp, ref interactPoints)) // if (grid.BoundaryPoint(lp, cp, ref interactPoints))
{ // {
if (interactPoints.Count >= 2) // if (interactPoints.Count >= 2)
{ // {
lp = interactPoints[0]; // lp = interactPoints[0];
cp = interactPoints[1]; // cp = interactPoints[1];
} // }
else if (isLpInGrid) // else if (isLpInGrid)
cp = interactPoints[0]; // cp = interactPoints[0];
else // else
lp = interactPoints[0]; // lp = interactPoints[0];
if (i == dataCount - 1) // if (i == dataCount - 1)
np = cp; // np = cp;
} // }
} // }
} // }
if (isClip) isIgnore = true; if (isClip) isIgnore = true;
} }
if (!smooth) if (!smooth)
@@ -379,7 +384,7 @@ namespace XCharts.Runtime
ref itp, ref ibp, ref itp, ref ibp,
ref clp, ref crp, ref clp, ref crp,
ref bitp, ref bibp, i); ref bitp, ref bibp, i);
if (i == 1) if (i == firstInGridPointIndex)
{ {
AddLineVertToVertexHelper(vh, ltp, lbp, lineColor, isVisualMapGradient, isLineStyleGradient, AddLineVertToVertexHelper(vh, ltp, lbp, lineColor, isVisualMapGradient, isLineStyleGradient,
visualMap, serie.lineStyle, grid, axis, relativedAxis, false, lastDataIsIgnore, isIgnore); 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) private static void UpdateNormalLineDrawPoints(Serie serie, Settings setting, VisualMap visualMap)
{ {
var isVisualMapGradient = VisualMapHelper.IsNeedGradient(visualMap); var isVisualMapGradient = VisualMapHelper.IsNeedGradient(visualMap);
if (isVisualMapGradient) if (isVisualMapGradient || serie.clip)
{ {
var dataPoints = serie.context.dataPoints; var dataPoints = serie.context.dataPoints;
if (dataPoints.Count > 1) if (dataPoints.Count > 1)