* UILineChart:使用过程中Bug修改

This commit is contained in:
Sunny 2020-10-11 21:16:07 +08:00
parent 8004aa04bd
commit 1cf50c2cf1
6 changed files with 51 additions and 53 deletions

Binary file not shown.

Binary file not shown.

View File

@ -23,24 +23,24 @@ namespace Sunny.UI.Demo.Charts
var series = option.AddSeries(new UILineSeries("Line1"));
DateTime dt = new DateTime(2020, 10, 4);
series.Add(dt.AddHours(0), 1.2);
series.Add(dt.AddHours(1), 2.2);
series.Add(dt.AddHours(2), 3.2);
series.Add(dt.AddHours(3), 4.2);
series.Add(dt.AddHours(4), 3.2);
series.Add(dt.AddHours(5), 2.2);
// series.Add(dt.AddHours(0), 1.2);
// series.Add(dt.AddHours(1), 2.2);
// series.Add(dt.AddHours(2), 3.2);
// series.Add(dt.AddHours(3), 4.2);
// series.Add(dt.AddHours(4), 3.2);
// series.Add(dt.AddHours(5), 2.2);
series.Symbol = UILinePointSymbol.Square;
series.SymbolSize = 4;
series.SymbolLineWidth = 2;
series.SymbolColor = Color.Red;
series = option.AddSeries(new UILineSeries("Line2", Color.Lime));
series.Add(dt.AddHours(3), 3.3);
series.Add(dt.AddHours(4), 2.3);
series.Add(dt.AddHours(5), 2.3);
series.Add(dt.AddHours(6), 1.3);
series.Add(dt.AddHours(7), 2.3);
series.Add(dt.AddHours(8), 4.3);
// series.Add(dt.AddHours(3), 3.3);
// series.Add(dt.AddHours(4), 2.3);
// series.Add(dt.AddHours(5), 2.3);
// series.Add(dt.AddHours(6), 1.3);
// series.Add(dt.AddHours(7), 2.3);
// series.Add(dt.AddHours(8), 4.3);
series.Symbol = UILinePointSymbol.Star;
series.SymbolSize = 4;
series.SymbolLineWidth = 2;

View File

@ -213,6 +213,30 @@ namespace Sunny.UI
}
}
private void DrawSeries(Graphics g, Color color, UILineSeries series)
{
if (series.Points.Count == 0)
{
return;
}
if (series.Points.Count == 1 && series.Symbol == UILinePointSymbol.None)
{
g.FillEllipse(color, series.Points[0].X - 2, series.Points[0].Y - 2, 4, 4);
return;
}
using (Pen pen = new Pen(color, series.Width))
{
g.SetHighQuality();
if (series.Smooth)
g.DrawCurve(pen, series.Points.ToArray());
else
g.DrawLines(pen, series.Points.ToArray());
g.SetDefaultQuality();
}
}
private void DrawSeries(Graphics g)
{
if (YScale == null) return;
@ -224,17 +248,7 @@ namespace Sunny.UI
{
Color color = series.Color;
if (!series.CustomColor) color = ChartStyle.GetColor(idx);
using (Pen pen = new Pen(color, series.Width))
{
g.SetHighQuality();
if (series.Smooth)
g.DrawCurve(pen, series.Points.ToArray());
else
g.DrawLines(pen, series.Points.ToArray());
g.SetDefaultQuality();
}
DrawSeries(g, color, series);
idx++;
}
}
@ -251,42 +265,24 @@ namespace Sunny.UI
Color color = series.Color;
if (!series.CustomColor) color = ChartStyle.GetColor(idx);
using (Pen pen = new Pen(color, series.Width))
using (Graphics graphics = bmp.Graphics())
{
Graphics graphics = bmp.Graphics();
graphics.SetHighQuality();
if (series.Smooth)
graphics.DrawCurve(pen, series.Points.ToArray());
else
graphics.DrawLines(pen, series.Points.ToArray());
graphics.SetDefaultQuality();
DrawSeries(graphics, color, series);
}
if (LineOption.GreaterWarningArea != null)
{
using (Pen pen = new Pen(LineOption.GreaterWarningArea.Color, series.Width))
using (Graphics graphics = bmpGreater.Graphics())
{
Graphics graphics = bmpGreater.Graphics();
graphics.SetHighQuality();
if (series.Smooth)
graphics.DrawCurve(pen, series.Points.ToArray());
else
graphics.DrawLines(pen, series.Points.ToArray());
graphics.SetDefaultQuality();
DrawSeries(graphics, LineOption.GreaterWarningArea.Color, series);
}
}
if (LineOption.LessWarningArea != null)
{
using (Pen pen = new Pen(LineOption.LessWarningArea.Color, series.Width))
using (Graphics graphics = bmpLess.Graphics())
{
Graphics graphics = bmpLess.Graphics();
graphics.SetHighQuality();
if (series.Smooth)
graphics.DrawCurve(pen, series.Points.ToArray());
else
graphics.DrawLines(pen, series.Points.ToArray());
graphics.SetDefaultQuality();
DrawSeries(graphics, LineOption.LessWarningArea.Color, series);
}
}
@ -296,7 +292,6 @@ namespace Sunny.UI
if (LineOption.GreaterWarningArea != null)
{
wTop = YScale.CalcYPixel(LineOption.GreaterWarningArea.Value, DrawOrigin.Y, DrawSize.Height);
wTop = DrawOrigin.Y - wTop;
g.DrawImage(bmpGreater, new Rectangle(0, 0, Width, (int)wTop),
new Rectangle(0, 0, Width, (int)wTop), GraphicsUnit.Pixel);
}
@ -304,7 +299,6 @@ namespace Sunny.UI
if (LineOption.LessWarningArea != null)
{
wBottom = YScale.CalcYPixel(LineOption.LessWarningArea.Value, DrawOrigin.Y, DrawSize.Height);
wBottom = DrawOrigin.Y - wBottom;
g.DrawImage(bmpLess, new Rectangle(0, (int)wBottom, Width, Height - (int)wBottom),
new Rectangle(0, (int)wBottom, Width, Height - (int)wBottom), GraphicsUnit.Pixel);
}
@ -398,7 +392,6 @@ namespace Sunny.UI
foreach (var line in LineOption.YAxisScaleLines)
{
float pos = YScale.CalcYPixel(line.Value, DrawOrigin.Y, DrawSize.Height);
pos = (Height - LineOption.Grid.Bottom - pos);
using (Pen pn = new Pen(line.Color, line.Size))
{
g.DrawLine(pn, DrawOrigin.X, pos, Width - LineOption.Grid.Right, pos);
@ -426,6 +419,7 @@ namespace Sunny.UI
selectPointsTemp.Clear();
foreach (var series in LineOption.Series.Values)
{
if (series.DataCount == 0) continue;
if (series.GetNearestPoint(e.Location, 4, out double x, out double y, out int index))
{
UILineSelectPoint point = new UILineSelectPoint();

View File

@ -267,6 +267,11 @@ namespace Sunny.UI
public bool GetNearestPoint(Point p, int offset, out double x, out double y, out int index)
{
x = 0;
y = 0;
index = -1;
if (PointsX.Count == 0) return false;
index = PointsX.BinarySearchNearIndex(p.X);
if (p.X >= PointsX[index] - offset && p.X <= PointsX[index] + offset &&
p.Y >= PointsY[index] - offset && p.Y <= PointsY[index] + offset)
@ -276,8 +281,6 @@ namespace Sunny.UI
return true;
}
x = 0;
y = 0;
return false;
}

View File

@ -68,6 +68,7 @@ namespace Sunny.UI
/// <returns>最近值序号</returns>
public static int BinarySearchNearIndex<T>(this IList<T> list, T target) where T : IComparable
{
if (list.Count == 0) return -1;
int i = 0, j = list.Count - 1;
if (target.CompareTo(list[0]) == -1) return 0;
@ -166,7 +167,7 @@ namespace Sunny.UI
public static T CheckLowerLimit<T>(this T obj, T lowerLimit) where T : IComparable
{
return obj.CompareTo(lowerLimit) == -1 ? lowerLimit : obj;
return obj.CompareTo(lowerLimit) == -1 ? lowerLimit : obj;
}
public static T CheckUpperLimit<T>(this T obj, T upperLimit) where T : IComparable