* UILineChart: 增加了一种开关量曲线的显示方式

This commit is contained in:
Sunny 2023-05-12 23:13:18 +08:00
parent e74a9891d2
commit c23e3f5634
2 changed files with 78 additions and 15 deletions

View File

@ -42,6 +42,7 @@
* 2022-09-19: V3.2.4 MouseZoom
* 2023-03-26: V3.3.3 X轴坐标时
* 2023-04-23: V3.3.5 Smooth绘制
* 2023-05-12: V3.3.6 线
******************************************************************************/
using System;
@ -95,6 +96,13 @@ namespace Sunny.UI
series.CalcData(this, XScale, Y2Scale);
else
series.CalcData(this, XScale, YScale);
if (series is UISwitchLineSeries lineSeries)
{
lineSeries.YOffsetPos = series.IsY2 ?
Y2Scale.CalcYPixel(lineSeries.YOffset, DrawOrigin.Y, DrawSize.Height) :
YScale.CalcYPixel(lineSeries.YOffset, DrawOrigin.Y, DrawSize.Height);
}
}
NeedDraw = true;
@ -481,26 +489,39 @@ namespace Sunny.UI
{
g.SetHighQuality();
if (series.ContainsNan || !series.Smooth || series.Points.Count == 2 || ZoomAreas.Count > 5)
if (series is UISwitchLineSeries lineSeries)
{
for (int i = 0; i < series.Points.Count - 1; i++)
{
g.DrawTwoPoints(pen, series.Points[i], series.Points[i + 1], DrawRect);
}
List<PointF> points = new List<PointF>();
points.Add(new PointF(lineSeries.Points[0].X, lineSeries.YOffsetPos));
points.AddRange(lineSeries.Points);
points.Add(new PointF(lineSeries.Points[series.Points.Count - 1].X, lineSeries.YOffsetPos));
g.FillPath(color, points.ToArray().Path());
g.DrawLine(color, points[0], points[points.Count - 1]);
points.Clear();
}
else
{
try
{
g.DrawCurve(pen, series.Points.ToArray());
}
catch
if (series.ContainsNan || !series.Smooth || series.Points.Count == 2 || ZoomAreas.Count > 5)
{
for (int i = 0; i < series.Points.Count - 1; i++)
{
g.DrawTwoPoints(pen, series.Points[i], series.Points[i + 1], DrawRect);
}
}
else
{
try
{
g.DrawCurve(pen, series.Points.ToArray());
}
catch
{
for (int i = 0; i < series.Points.Count - 1; i++)
{
g.DrawTwoPoints(pen, series.Points[i], series.Points[i + 1], DrawRect);
}
}
}
}
g.SetDefaultQuality();

View File

@ -107,6 +107,21 @@ namespace Sunny.UI
return series;
}
public UILineSeries AddSwitchLineSeries(string seriesName, float Offset = 0, bool isY2 = false)
{
if (seriesName.IsNullOrEmpty())
{
throw new NullReferenceException("seriesName 不能为空");
}
if (ExistsSeries(seriesName)) return Series[seriesName];
UISwitchLineSeries series = new UISwitchLineSeries(seriesName, isY2);
series.YOffset = Offset;
AddSeries(series);
return series;
}
public bool ExistsSeries(string seriesName)
{
return seriesName.IsValid() && Series.ContainsKey(seriesName);
@ -360,6 +375,31 @@ namespace Sunny.UI
}
public class UISwitchLineSeries : UILineSeries
{
public UISwitchLineSeries(string name, bool isY2 = false) : base(name, isY2)
{
}
public UISwitchLineSeries(string name, Color color, bool isY2 = false) : base(name, color, isY2)
{
}
public UISwitchLineSeries(string name, double yOffset, bool isY2 = false) : base(name, isY2)
{
YOffset = yOffset;
}
public UISwitchLineSeries(string name, Color color, double yOffset, bool isY2 = false) : base(name, color, isY2)
{
YOffset = yOffset;
}
internal float YOffsetPos { get; set; }
}
public class UILineSeries
{
public UILineSeries(string name, bool isY2 = false)
@ -387,6 +427,8 @@ namespace Sunny.UI
IsY2 = isY2;
}
public double YOffset { get; set; } = 0;
public void SetValueFormat(int xAxisDecimalPlaces, int yAxisDecimalPlaces)
{
XAxisDecimalPlaces = xAxisDecimalPlaces;
@ -481,14 +523,14 @@ namespace Sunny.UI
private readonly List<double> PointsY = new List<double>();
private int MaxCount = 0;
protected int MaxCount = 0;
public void UpdateYData(int index, double value)
{
if (YData.Count == 0) return;
if (index >= 0 && index < YData.Count)
{
YData[index] = value;
YData[index] = value + YOffset;
}
}
@ -600,7 +642,7 @@ namespace Sunny.UI
XData.Add(x);
if (y.IsInfinity()) y = double.NaN;
if (y.IsNan()) ContainsNan = true;
YData.Add(y);
YData.Add(y + YOffset);
if (MaxCount > 0 && XData.Count > MaxCount)
Remove(1);
@ -612,7 +654,7 @@ namespace Sunny.UI
XData.Add(t);
if (y.IsInfinity()) y = double.NaN;
if (y.IsNan()) ContainsNan = true;
YData.Add(y);
YData.Add(y + YOffset);
if (MaxCount > 0 && XData.Count > MaxCount)
Remove(1);
@ -624,7 +666,7 @@ namespace Sunny.UI
XData.Add(cnt);
if (y.IsInfinity()) y = double.NaN;
if (y.IsNan()) ContainsNan = true;
YData.Add(y);
YData.Add(y + YOffset);
if (MaxCount > 0 && XData.Count > MaxCount)
Remove(1);