65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 C# 绘制雷达显示

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.54/5 (29投票s)

2007年8月17日

CC (ASA 2.5)

3分钟阅读

viewsIcon

555749

downloadIcon

16153

在雷达上使用方位角和仰角绘制符号

Screenshot - Radar1.jpg

引言

最初,我将类似雷达的对象实现为一个 UserControl,目的是解析 NMEA 结构的 GPS 数据并显示视野中的卫星。这效果很好,但我也一直想写我的第一篇文章,现在似乎是时候了。Radar 类在内部维护一个 RadarItem 实现的结构,并在雷达上绘制它们。RadarItem 的位置由翻译两个值确定:AzimuthElevation

使用代码

类图

Screenshot - Radar2.jpg

获取雷达图像

如类图中所示,在此实现中有几个类和一个接口要处理。首先也是最重要的是 Radar 类。这是显示雷达图像的主要类。有两种方法可以从 Radar 类获取 Image

  1. 使用 Radar.Image 成员
  2. 使用由 Radar.ImageUpdate 传递的 ImageUpdateEventArgs.Image

以下示例演示了两者的结合,目的是首先显示空白雷达,而不必等待更新发生。每次对 Radar 类的可绘制元素进行更改时,都会触发 Radar.ImageUpdate 事件。

Radar radar;

private void frmMain_Load(object sender, EventArgs e)
{
    // create a new instance of the Radar class

    Radar radar = new Radar(pictureBox1.Width); 
    // hint: use a square PictureBox


    // display the base image initially

    pictureBox1.Image = radar.Image;

    // add a handler for the ImageUpdate event

    radar.ImageUpdate += new ImageUpdateHandler(radar_ImageUpdate);
}

void radar_ImageUpdate(object sender, ImageUpdateEventArgs e)
{
    // display the updated image

    pictureBox1.Image = e.Image;
}

颜色选项

Radar 类具有一些可自定义的颜色,以便包含背景颜色(渐变的顶部和底部)和绘制的线条的颜色。

Radar radar = new Radar(pictureBox1.Width);

// change the colors of the radar

radar.CustomGradientColorTop = Color.FromArgb(0, 100, 0);
radar.CustomGradientColorBottom = Color.FromArgb(0, 40, 0);
radar.CustomLineColor = Color.FromArgb(0, 255, 0);

pictureBox1.Image = radar.Image;

将 RadarItem 对象添加到雷达

有三个包含的类实现了 RadarItem 接口。它们是 CircleRadarItemSquareRadarItemTriangleRadarItem 对象。随意创建你自己的(有关示例,请参见源代码)并通过电子邮件发送给我!

RadarItems 使用 ID 成员相互区分。这也允许 Radar 对象更新特定 RadarItem 的位置。Radar 类包含一个内部 List<RadarItem>,您可以使用 Radar.AddItem 方法将项目添加到其中。当你传递一个具有预先存在的 IDRadarItem 时,List 中的 RadarItem 将被新的 RadarItem 替换。

Radar radar = new Radar(pictureBox1.Width);

// Arguments:

//   1. ID

//   2. Size

//   3. Azimuth

//   4. Elevation

RadarItem item = new CircleRadarItem(2, 8, 45, 45);

pictureBox1.Image = radar.Image;

扩展 RadarItem 接口

public interface RadarItem : IComparable<RadarItem>
{
    int ID { get; }
    int Azimuth { get; set; }
    int Elevation { get; set; }
    int Height { get; set; }
    int Width { get; set; }
    DateTime Created { get; }
    void DrawItem(Radar radar, Graphics g);
}

这相对简单。只需实现该接口即可!从 Radar 类调用 DrawItem 方法。提供的是 Radar 类的实例,因为使用了 AzEl2XY 方法。为了将 AzimuthElevation 转换为 PointF,该算法必须知道 Radar 的大小。由于逻辑原因以及避免代码重复,此方法位于 Radar 类中。

颜色也通过 Radar 类公开。我使用 Radar.CustomLineColor 作为我的自定义 RadarItem 实现的颜色。还传递了一个 Graphics 实例。这是用于直接在 Radar 上绘制的 Graphics。尽管 RadarItem 接口需要实现 IComparable<RadarItem>,但目前尚未用于任何用途。Created 成员目前也未使用。

扫描线

Radar 包括一个带有淡入淡出效果的“扫描线”的次要实现。注意:使用扫描线时,您将需要使用 Radar.ImageUpdate 事件来更新屏幕上的 Image。 这是因为 Image 在不断更新。

Radar radar = new Radar(pictureBox1.Width);
radar.ImageUpdate += new ImageUpdateHandler(_radar_ImageUpdate);

radar.DrawScanInterval = 60; // in millisecs

radar.DrawScanLine = true;

关注点

特别有趣的是,正如我的同事 Ali 建议的那样,将“扫描线”添加到 Radar。我了解了有关 GraphicsPath 对象以及 PathGradientBrush 的所有信息。请参阅代码以获取详细信息。

Radar 将背景图像单独存储,以减少绘制时间。每次更改与背景相关的属性(即 CustomLineColor)的值时,都会更新此图像。

历史

  • 2007 年 8 月 17 日 -- 发布原始版本
© . All rights reserved.