C#在控件上绘制圆圈

时间:2017-02-15 16:29:45

标签: c#

我有一个带点的图表(那些四轴飞行器图像),我想在x半径的那个点上绘制一个圆圈。我无法弄清楚如何去做。

我想要enter image description here

代码:

 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);
            }
         }

1 个答案:

答案 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);

}

enter image description here

作为替代方案,您可以将Marker MarkerStyle CircleColor TransparentMarkerBorderColor 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);

请注意我们如何从偏移开始偏移 一半大小

现在尺寸将遵循图表尺寸:

enter image description here