使用 PolygonAnnotation 在图表中绘制
Using PolygonAnnotation to draw within a chart
我正在尝试使用 PolygonAnnotation 在图表中绘制多边形,其中我有四个点想用作顶点。
在我的图表下方
chart1
这些点是在运行时在泡泡系列中设置的:
System.Windows.Forms.DataVisualization.Charting.Series serieSA = chartCartesian.Series.FindByName("SeriesSafetyArea");
DataPoint dpA = new DataPoint(radarConfigured.SafetyArea.PointA.X,new Double[]{radarConfigured.SafetyArea.PointA.Y, -20});
DataPoint dpB = new DataPoint(radarConfigured.SafetyArea.PointB.X, new Double[]{radarConfigured.SafetyArea.PointB.Y, -20});
DataPoint dpC = new DataPoint(radarConfigured.SafetyArea.PointC.X, new Double[] { radarConfigured.SafetyArea.PointC.Y, -20 });
DataPoint dpD = new DataPoint(radarConfigured.SafetyArea.PointD.X, new Double[] { radarConfigured.SafetyArea.PointD.Y, -20 });
dpA.Label = "A";
dpB.Label = "B";
dpC.Label = "C";
dpD.Label = "D";
serieSA.Points.Add(dpA);
serieSA.Points.Add(dpB);
serieSA.Points.Add(dpC);
serieSA.Points.Add(dpD);
我想使用这些点来获得像矩形这样的图形。
我试过使用此代码:
safetyAreaAnnotation = new PolygonAnnotation();
safetyAreaAnnotation.ClipToChartArea = chartCartesian.ChartAreas[0].Name;
//safetyAreaAnnotation.AnchorX = 10;
//safetyAreaAnnotation.AnchorY = 20;
PointF[] points = new PointF[4];
points[0].X = (float)dpA.XValue;
points[0].Y = (float)dpA.YValues[0] ;
points[1].X = (float)dpB.XValue;
points[1].Y = (float)dpB.YValues[0];
points[2].X = (float)dpC.XValue;
points[2].Y = (float)dpC.YValues[0];
points[3].X = (float)dpD.XValue;
points[3].Y = (float)dpD.YValues[0];
byte[] type = new byte[4];
type[0] = (byte)PathPointType.Start;
type[1] = (byte)PathPointType.Line;
type[2] = (byte)PathPointType.Line;
type[3] = (byte)PathPointType.CloseSubpath;
safetyAreaAnnotation.GraphicsPath=new System.Drawing.Drawing2D.GraphicsPath(points,type);
// //safetyAreaAnnotation.IsSizeAlwaysRelative = false;
// //safetyAreaAnnotation.BackColor = Color.Red;
safetyAreaAnnotation.AxisX = chartCartesian.ChartAreas[0].AxisX;
safetyAreaAnnotation.AxisY = chartCartesian.ChartAreas[0].AxisY;
safetyAreaAnnotation.AnchorDataPoint = serieSA.Points[0];
// //safetyAreaAnnotation.AnchorX = 1;
// //safetyAreaAnnotation.AnchorY = 20;
chartCartesian.Annotations.Add(safetyAreaAnnotation);
但是没有用。我的图表中没有显示任何内容。
也许我应该使用不同的东西来绘制这个多边形?
更新
这是绘制多边形后的结果:
1 - 注释
您的注释未显示,因为您没有为其设置大小。
Remarks
A polyline must use coordinates relative to an annotation object,
where (0,0) denotes the top-left coordinates and (100,100) denotes the
bottom-right coordinates of the annotation.
所以你需要做的第一件事就是给Annotation
一个Size
:
safetyAreaAnnotation.Width = 10;
safetyAreaAnnotation.Height = 10;
这使得它相当大,因为 Size
是以 ChartArea
的百分比给出的。
有关更多信息,请参阅 MSDN on Height etc..
但是,即使您找到 合适的 尺寸,也很难将折线坐标从 DataPoint
值设置为那些 relative到Annotation
区..
不推荐!
2 - 绘图
您可以在 Pre- or PostPaint
事件中将 绘制到 Chart
上:
ChartArea ca = chartCartesian.ChartAreas[0];
Axis ax = ca.AxisX;
Axis ay = ca.AxisY;
List<DataPoint> dp = new List<DataPoint>() { dpA, dpB, dpC, dpD };
List<PointF> points = dp.Select(x=> new PointF(
(float)ax.ValueToPixelPosition(x.XValue),
(float)ay.ValueToPixelPosition(x.YValues[0])
)).ToList();
using (SolidBrush brush = new SolidBrush(Color.FromArgb(64, Color.Gold)))
e.ChartGraphics.Graphics.FillPolygon(brush, points.ToArray());
只需确保代码可以访问 DataPoints
。
如您所见,这很简单:它使用 Axes
.
的 ValueToPixelPosition
方法
这与DataPoints
直接相关,因此它会在调整大小时自动缩放和移动。 我强烈建议使用 Annotation
.
绘制区域
顺便说一句:您将多边形添加到 GraphicsPath
的方法过于复杂。 AddPolygon(PointList.ToArray())
也可以。只有当您想要 圆角和尖角的复杂组合时 才会真正设置 Types
数组..
我正在尝试使用 PolygonAnnotation 在图表中绘制多边形,其中我有四个点想用作顶点。
在我的图表下方
这些点是在运行时在泡泡系列中设置的:
System.Windows.Forms.DataVisualization.Charting.Series serieSA = chartCartesian.Series.FindByName("SeriesSafetyArea");
DataPoint dpA = new DataPoint(radarConfigured.SafetyArea.PointA.X,new Double[]{radarConfigured.SafetyArea.PointA.Y, -20});
DataPoint dpB = new DataPoint(radarConfigured.SafetyArea.PointB.X, new Double[]{radarConfigured.SafetyArea.PointB.Y, -20});
DataPoint dpC = new DataPoint(radarConfigured.SafetyArea.PointC.X, new Double[] { radarConfigured.SafetyArea.PointC.Y, -20 });
DataPoint dpD = new DataPoint(radarConfigured.SafetyArea.PointD.X, new Double[] { radarConfigured.SafetyArea.PointD.Y, -20 });
dpA.Label = "A";
dpB.Label = "B";
dpC.Label = "C";
dpD.Label = "D";
serieSA.Points.Add(dpA);
serieSA.Points.Add(dpB);
serieSA.Points.Add(dpC);
serieSA.Points.Add(dpD);
我想使用这些点来获得像矩形这样的图形。 我试过使用此代码:
safetyAreaAnnotation = new PolygonAnnotation();
safetyAreaAnnotation.ClipToChartArea = chartCartesian.ChartAreas[0].Name;
//safetyAreaAnnotation.AnchorX = 10;
//safetyAreaAnnotation.AnchorY = 20;
PointF[] points = new PointF[4];
points[0].X = (float)dpA.XValue;
points[0].Y = (float)dpA.YValues[0] ;
points[1].X = (float)dpB.XValue;
points[1].Y = (float)dpB.YValues[0];
points[2].X = (float)dpC.XValue;
points[2].Y = (float)dpC.YValues[0];
points[3].X = (float)dpD.XValue;
points[3].Y = (float)dpD.YValues[0];
byte[] type = new byte[4];
type[0] = (byte)PathPointType.Start;
type[1] = (byte)PathPointType.Line;
type[2] = (byte)PathPointType.Line;
type[3] = (byte)PathPointType.CloseSubpath;
safetyAreaAnnotation.GraphicsPath=new System.Drawing.Drawing2D.GraphicsPath(points,type);
// //safetyAreaAnnotation.IsSizeAlwaysRelative = false;
// //safetyAreaAnnotation.BackColor = Color.Red;
safetyAreaAnnotation.AxisX = chartCartesian.ChartAreas[0].AxisX;
safetyAreaAnnotation.AxisY = chartCartesian.ChartAreas[0].AxisY;
safetyAreaAnnotation.AnchorDataPoint = serieSA.Points[0];
// //safetyAreaAnnotation.AnchorX = 1;
// //safetyAreaAnnotation.AnchorY = 20;
chartCartesian.Annotations.Add(safetyAreaAnnotation);
但是没有用。我的图表中没有显示任何内容。 也许我应该使用不同的东西来绘制这个多边形?
更新
这是绘制多边形后的结果:
1 - 注释
您的注释未显示,因为您没有为其设置大小。
Remarks
A polyline must use coordinates relative to an annotation object, where (0,0) denotes the top-left coordinates and (100,100) denotes the bottom-right coordinates of the annotation.
所以你需要做的第一件事就是给Annotation
一个Size
:
safetyAreaAnnotation.Width = 10;
safetyAreaAnnotation.Height = 10;
这使得它相当大,因为 Size
是以 ChartArea
的百分比给出的。
有关更多信息,请参阅 MSDN on Height etc..
但是,即使您找到 合适的 尺寸,也很难将折线坐标从 DataPoint
值设置为那些 relative到Annotation
区..
不推荐!
2 - 绘图
您可以在 Pre- or PostPaint
事件中将 绘制到 Chart
上:
ChartArea ca = chartCartesian.ChartAreas[0];
Axis ax = ca.AxisX;
Axis ay = ca.AxisY;
List<DataPoint> dp = new List<DataPoint>() { dpA, dpB, dpC, dpD };
List<PointF> points = dp.Select(x=> new PointF(
(float)ax.ValueToPixelPosition(x.XValue),
(float)ay.ValueToPixelPosition(x.YValues[0])
)).ToList();
using (SolidBrush brush = new SolidBrush(Color.FromArgb(64, Color.Gold)))
e.ChartGraphics.Graphics.FillPolygon(brush, points.ToArray());
只需确保代码可以访问 DataPoints
。
如您所见,这很简单:它使用 Axes
.
ValueToPixelPosition
方法
这与DataPoints
直接相关,因此它会在调整大小时自动缩放和移动。 我强烈建议使用 Annotation
.
顺便说一句:您将多边形添加到 GraphicsPath
的方法过于复杂。 AddPolygon(PointList.ToArray())
也可以。只有当您想要 圆角和尖角的复杂组合时 才会真正设置 Types
数组..