我有一个带点的图表(那些四轴飞行器图像),我想在x半径的那个点上绘制一个圆圈。我无法弄清楚如何去做。
代码:
for (int i = 0; i < drone.Length; i++)
{
var pos_atual = drone[i].posicao_atual;
var pos_desej = drone[i].posicao_desejada;
chart.Series[i].Points.Clear();
chart.Series[i].Points.AddXY(drone[i].pos_atual().X, drone[i].pos_atual().Y);
}
}
答案 0 :(得分:2)
您需要编写其中一个xxxPaint事件,可能是这样的:
private void chart_PostPaint(object sender, ChartPaintEventArgs e)
{
Series s = chart.Series[yourSeriesIndex];
int yourPointIndex = 4;
if (s.Points.Count < yourPointIndex) return;
DataPoint dp = s.Points[yourPointIndex];
ChartArea ca = chart.ChartAreas[0];
int x = (int) ca.AxisX.ValueToPixelPosition(dp.XValue);
int y = (int) ca.AxisY.ValueToPixelPosition(dp.YValues[0]);
// a circle with 20 pixels diameter
e.ChartGraphics.Graphics.DrawEllipse(Pens.Red, x-10, y-10, 20, 20);
}
作为替代方案,您可以将Marker
MarkerStyle Circle
,Color Transparent
和MarkerBorderColor Red
添加到DataPoint
..:
Chart chart = TestChart;
Series s = chart.Series[0];
DataPoint dp = s.Points[5];
dp.MarkerStyle = MarkerStyle.Circle;
dp.MarkerSize = 20; // diameter in pixels
dp.MarkerColor = Color.Transparent;
dp.MarkerBorderColor = Color.Orange;
dp.MarkerBorderWidth = 2;
<强>更新强>
从您发表评论我明白您要设置的圆圈大小不是像素,而是数据点值。
这也是可能的,并不是很难;但是它确实需要了解Chart
规则。
我们走了:
首先我们定义我们想要的宽度和高度。请注意我的数字与你的数字有很大不同,宽度和高度也不相同!!
double vx = 1d;
double vy = 20d;
接下来我们计算尺寸;它们是零和我们的价值之间的差异(!)。这看起来很复杂,但请查看我的图表:y轴以否定开头。因此,简单地从一个值获取像素将会相当偏移..
int wx = (int) ( ca.AxisX.ValueToPixelPosition(vx) -
ca.AxisX.ValueToPixelPosition(0)) ;
int wy = (int) ( ca.AxisY.ValueToPixelPosition(vy) -
ca.AxisY.ValueToPixelPosition(0)) ;
使用这些数字我们可以绘制圆圈:
e.ChartGraphics.Graphics.DrawEllipse(Pens.Red, x - wx / 2, y - wy / 2, wx, wy);
请注意我们如何从偏移开始偏移 一半大小
现在尺寸将遵循图表尺寸: