使用 C# 绘制雷达显示






4.54/5 (29投票s)
在雷达上使用方位角和仰角绘制符号
引言
最初,我将类似雷达的对象实现为一个 UserControl,目的是解析 NMEA 结构的 GPS 数据并显示视野中的卫星。这效果很好,但我也一直想写我的第一篇文章,现在似乎是时候了。Radar
类在内部维护一个 RadarItem
实现的结构,并在雷达上绘制它们。RadarItem
的位置由翻译两个值确定:Azimuth
和 Elevation
。
使用代码
类图
获取雷达图像
如类图中所示,在此实现中有几个类和一个接口要处理。首先也是最重要的是 Radar
类。这是显示雷达图像的主要类。有两种方法可以从 Radar
类获取 Image
- 使用
Radar.Image
成员 - 使用由
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
接口。它们是 CircleRadarItem
、SquareRadarItem
和 TriangleRadarItem
对象。随意创建你自己的(有关示例,请参见源代码)并通过电子邮件发送给我!
RadarItem
s 使用 ID
成员相互区分。这也允许 Radar
对象更新特定 RadarItem
的位置。Radar
类包含一个内部 List<RadarItem>
,您可以使用 Radar.AddItem
方法将项目添加到其中。当你传递一个具有预先存在的 ID
的 RadarItem
时,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
方法。为了将 Azimuth
和 Elevation
转换为 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 日 -- 发布原始版本