C#Winform程序制作仿真地平仪,磁罗盘飞行仪表盘

article/2025/11/11 6:26:56

因为项目需要做一个电子飞行仪表盘包括地平仪和磁罗盘,网上找了很久,没有找到一个合适的控件,就学习了一些图形处理的开源代码做一个简陋的仪表盘来使用,希望对其他人有帮助,如果有好的建议不妨留言

源程序代码https://download.csdn.net/download/qq_42237381/10877536

目录

一、效果示意

二、原理说明

三、代码参考


一、效果示意

飞行仪表应用于飞行器上主要是飞行姿态角的监测

包括俯仰角,偏航角和滚动角

点击开始按钮,随机生成姿态角

二、原理说明

既然要仿真一些,先从网上找几个机械仪表的样式来学习,再从网上找些图片当做背景来使用

好了,这个就是俯仰角的表盘背景,需要将将它切割成一个圆,通过移动图片的位置在图片框的显示,不同的角度,滚动角可以和这个表放一起,滚动了多少度将图片旋转多少度,在写一圈的刻度值即可。

再找一个磁罗盘的图片,需要代码将它切割成一个圆,里面的表盘也用个截图工具截下来,只需要代码让里面的表盘转动既可以达到效果

三、代码参考

开始编程,创建WINFORM程序,添加两个图片框控件,一个按钮控件,一个时间控件。

程序如下,

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;namespace Dashboard
{public partial class Form1 : Form{public Image imgtmp;public Image imgori;public Bitmap bitmp;public Bitmap bm;public bool IsSure = false;double DbPitchAngle = new double(); //俯仰角度[-90,90]double DbRowAngle = new double();   //滚转角度[-180,180]double DbYawAngle = new double();    //航向角度[-45,45]public Form1(){InitializeComponent();}//重绘旋转后的仪表盘图片 public void Overlap(Bitmap btm, int x, int y, int w, int h){Bitmap image = new Bitmap(btm);Bitmap hi = new Bitmap(bm);Graphics g = Graphics.FromImage(hi);g.DrawImage(image, new Rectangle(x, y, w, h));bm = hi;}//-------------------磁罗盘显示函数-------------------////入口参数://航向角 dir_angle 范围0~360 度 private void Compass_Disp(double dir_angle){string file = System.IO.Path.Combine(Environment.CurrentDirectory, @"point.jpg");bitmp = new Bitmap(file);Bitmap pointImage = new Bitmap(250, 250);System.Drawing.Graphics gPoint = System.Drawing.Graphics.FromImage(pointImage);gPoint.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.Bilinear;gPoint.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;//计算偏移量Rectangle rectPoint = new Rectangle(0, 0, 250, 250);gPoint.TranslateTransform(125, 125);//g.RotateTransform(360 - row_angle);gPoint.RotateTransform((float)dir_angle);//恢复图像在水平和垂直方向的平移 gPoint.TranslateTransform(-125, -125);gPoint.DrawImage(bitmp, rectPoint);//重至绘图的所有变换  gPoint.ResetTransform();gPoint.Dispose();//保存旋转后的图片bm = pointImage;Overlap(pointImage, 0, 0, 250, 250);CompointBox.Image = bm;// 刻度盘截圆System.Drawing.Drawing2D.GraphicsPath gp = new System.Drawing.Drawing2D.GraphicsPath();gp.FillMode = 0;gp.AddEllipse(new Rectangle(0, 0, 350, 350));ComshellBox.Region = new Region(gp);//表盘截圆System.Drawing.Drawing2D.GraphicsPath gp1 = new System.Drawing.Drawing2D.GraphicsPath();gp1.FillMode = 0;gp1.AddEllipse(new Rectangle(0, 0, 250, 250));CompointBox.Region = new Region(gp1);gp1.Dispose();gp.Dispose();gPoint.Dispose();bitmp.Dispose();//Graphics gp1 = CompointBox.CreateGraphics();//gp1.DrawEllipse()}//-------------------地平仪刻度划线函数-------------------////入口参数:无       public Image Hori_Line(){bitmp = new Bitmap(350, 350);System.Drawing.Graphics gscale = System.Drawing.Graphics.FromImage(bitmp);Pen p1 = new Pen(Color.Red, 4);Pen p2 = new Pen(Color.Green, 3);//准心绘线//gscale.DrawEllipse(Pens.Red ,165, 165, 20, 20);gscale.DrawLine(p2, 145, 175, 205, 175);gscale.DrawLine(p1, 145, 185, 175, 175);gscale.DrawLine(p1, 205, 185, 175, 175);//滚转刻度线gscale.DrawEllipse(Pens.White, 35, 35, 280, 280);int i, i1, j, j1, k;for (k = 0; k < 73; k++){i = Convert.ToInt32(140 * Math.Cos(k * Math.PI / 36) + 175);j = Convert.ToInt32(140 * Math.Sin(k * Math.PI / 36) + 175);if (k % 2 == 0){i1 = Convert.ToInt32(155 * Math.Cos(k * Math.PI / 36) + 175);j1 = Convert.ToInt32(155 * Math.Sin(k * Math.PI / 36) + 175);}else{i1 = Convert.ToInt32(150 * Math.Cos(k * Math.PI / 36) + 175);j1 = Convert.ToInt32(150 * Math.Sin(k * Math.PI / 36) + 175);}gscale.DrawLine(Pens.White, i, j, i1, j1);}gscale.Dispose();return bitmp;}//-------------------地平仪显示函数-------------------////入口参数://俯仰角 pitch_angle 范围-90~90 度 //滚动角 row_angle   范围-90~90 度private void Hori_Disp(double pitch_angle, double row_angle){//1地平仪图像载入带平移int pic_position;pic_position = Convert.ToInt32(pitch_angle * 3.86);string file = System.IO.Path.Combine(Environment.CurrentDirectory, @"11.jpg");try{imgtmp = new Bitmap(file);row_angle = row_angle % 360;//弧度转换  double ar = 2;double radian = (row_angle - 90) * Math.PI / 180.0;double radiana = (row_angle - 90 - ar) * Math.PI / 180.0;double radianc = (row_angle - 90 + ar) * Math.PI / 180.0;double cos = Math.Cos(radian);double cosa = Math.Cos(radiana);double cosc = Math.Cos(radianc);double sin = Math.Sin(radian);double sina = Math.Sin(radiana);double sinc = Math.Sin(radianc);//目标位图Bitmap dsImage = new Bitmap(350, 350);System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(dsImage);g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.Bilinear;g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;//计算偏移量Rectangle rect = new Rectangle(-175, -175 + pic_position, 700, 700);g.TranslateTransform(175, 175);g.RotateTransform((float)row_angle);//恢复图像在水平和垂直方向的平移 g.TranslateTransform(-175, -175);g.DrawImage(imgtmp, rect);//重至绘图的所有变换  g.ResetTransform();g.Dispose();//保存旋转后的图片bm = dsImage;//调用imgori 已经是画好的刻度盘Bitmap bitmp = new Bitmap(imgori);Overlap(bitmp, 0, 0, 350, 350);Bitmap pointImage = new Bitmap(350, 350);// 指针设计 ;System.Drawing.Graphics gPoint = System.Drawing.Graphics.FromImage(pointImage);SolidBrush h = new SolidBrush(Color.Red);Point a = new Point(Convert.ToInt32(175 + 131 * cosa), Convert.ToInt32(180 + 131 * sina));Point b = new Point(Convert.ToInt32(141 * cos + 175), Convert.ToInt32(141 * sin + 175));Point c = new Point(Convert.ToInt32(175 + 131 * cosc), Convert.ToInt32(180 + 131 * sinc));Point[] pointer = { a, b, c };gPoint.FillPolygon(h, pointer);Overlap(pointImage, 0, 0, 350, 350);HoriBox.Image = bm;g.Dispose();imgtmp.Dispose();}catch (Exception ex){MessageBox.Show(ex.Message);}System.Drawing.Drawing2D.GraphicsPath gp = new System.Drawing.Drawing2D.GraphicsPath();gp.FillMode = 0;gp.AddEllipse(new Rectangle(0, 0, 350, 350));HoriBox.Region = new Region(gp);gp.Dispose();}/// <summary>/// 开始按钮点击/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button1_Click(object sender, EventArgs e){if (IsSure == false){timer1.Enabled = true;IsSure = true;button1.Text = "停止";}else{timer1.Enabled = false;IsSure = false;button1.Text = "开始";}}private void timer1_Tick(object sender, EventArgs e){double DbPitchAngle = 0; //俯仰角度[-90,90]double DbRowAngle = 0;   //滚转角度[-180,180]double DbYawAngle = 0;   //航向角度[-45,45]Random pR = new Random();Random rR = new Random();Random yR = new Random();DbPitchAngle = pR.Next(0, 90);DbRowAngle = rR.Next(-180, 180);DbYawAngle = yR.Next(-45,45);Hori_Disp(DbPitchAngle, DbRowAngle);Compass_Disp(DbYawAngle);Hori_Line();}private void Form1_Load(object sender, EventArgs e){imgori = Hori_Line();}}
}

 


http://chatgpt.dhexx.cn/article/d0SiIG4t.shtml

相关文章

不能解锁且地面站显示Preflight Fail:Compass Sensors inconsistent,就把传感器部分全部重新校准一遍就可以解锁了,单单只校准磁罗盘是不够的。

不能解锁且地面站显示Preflight Fail:Compass Sensors inconsistent&#xff0c;就把传感器部分全部重新校准一遍就可以解锁了(今天遇到两次都是这样解决的&#xff09;&#xff0c;单单只校准磁罗盘是不够的。今天在某院飞遇到的。 因为可能我不是第一次遇到这个报错&#xff…

基于RflySim平台的mahony(含磁罗盘)互补滤波在pixhawk仿真及实物实验(带实验数据)

写在前面 本案例实验采用RflySim平台&#xff0c;该平台可以高效快速编写代码&#xff0c;使用simulink模型搭建&#xff0c;可以见代码直接生成对应的C代码&#xff0c;并一键将代码烧录Pixhawk中&#xff0c;是一种快速开发平台&#xff0c;RflySim获取更多可以参考网站 开…

磁罗盘

地磁的北极在地理的南极的附近 地磁的南极在地理的北极的附近 磁体的同名磁极相斥,异名磁极相吸 所以指南针的北极总是指着地理的北极(地磁的南极) 1、红色指针指向北面&#xff0c;白色指针指向南面。在表盘上“北”用字母N表示&#xff0c;南用字母“S”表示。   2、指南针…

9轴电子罗盘工作原理,校准与应用

高精度9轴电子罗盘 目录1 概述及应用2 运用原理3 逻辑框架4 校准方法5 结语 目录 1 概述及应用 基本介绍 电子罗盘&#xff0c;也叫数字指南针&#xff0c;是利用地磁场来定北极的一种方法&#xff0c;作为导航仪器或姿态传感器已被广泛应用。古代称为罗经&#xff0c…

PX4 磁罗盘干扰分析

磁罗盘干扰分析 推力与磁场关系正常情况干扰情况与推力相关解决方法 与推力不相关 罗盘补偿操作流程获取用于分析的日志分析日志调整罗盘补偿参数 推力与磁场关系 无人机上的电机电流会干扰无人机上搭载的磁罗盘&#xff0c;PX4官方提供了一些方式&#xff0c;通过分析飞行日志…

陀螺仪加速度计磁罗盘的校准

一、校准加速度计 加速度计有零偏和尺度误差。还有其他误差&#xff0c;这里只讨论这两种误差。 六面校准法&#xff1a;目的是让输出的数据在9.8mss左右(可以将Xmax 9.44, Xmin -10.24代进去感受一下) 公式&#xff1a;以X轴为例 操作&#xff1a;六个面朝上的时候&…

四轴无人机那些事 番外篇 3 磁罗盘

地磁的北极在地理的南极的附近 地磁的南极在地理的北极的附近 磁体的同名磁极相斥,异名磁极相吸 所以指南针的北极总是指着地理的北极(地磁的南极) 1、红色指针指向北面&#xff0c;白色指针指向南面。在表盘上“北”用字母N表示&#xff0c;南用字母“S”表示。 2、指南针又称…

Datax-异构数据源离线同步

目录 一、介绍 1、Datax介绍 2、DataX 的设计 3、支持的数据源 4、框架设计 5、运行原理 六、优势 二、使用 1、从stream读取数据并打印到控制台 2、mysql同步到mysql 3、读取 DB2 的数据导入 MySQL 4、读取 SQLServer 的数据导入 MySQL 5、读取 MongoDB 的数据导入 …

数仓之异构数据源同步

本小结介绍下数仓数据同步常用的开源组件&#xff0c;具体组件如下 datax &#xff1a;离线数据同步工具&#xff0c;由阿里开源。github地址 kettle&#xff1a;离线ETL工具&#xff0c;由Pentaho公司开源。中文站点。下载地址 canal&#xff1a;实时binlog订阅工具&#x…

如何进行异构数据库同步

1、简介 最近一阵子笔者在进行完成同样功能的两套异构数据库系统的同步工作&#xff0c;有一些心得体会分享给大家&#xff0c;欢迎技术同仁拍砖。 该项目有一个运行若干年&#xff08;5&#xff5e;10年&#xff09;的旧系统&#xff0c;采用的是SQL Server数据库&#xff0c;…

什么是异构数据源和分布式数据库

2019独角兽企业重金招聘Python工程师标准>>> 异构数据源&#xff08;disparate data source&#xff09;广义上讲是指数据结构、存取方式、形式不一样的多个数据源。如&#xff0c;在一个系统中&#xff0c;同时包含由关系型数据库Oracle/SQL SERVER/MYSQL、EXCEL文…

异构数据库传输工具

异构数据库传输工具 一、国产1 QMatrix - 沃趣科技2 SuperSync - DSG3 DataX - 淘宝4 DMHS - 武汉达梦 二、国外1 OGG - Oracle2 DBSync 三、工具对比 一、国产 1 QMatrix - 沃趣科技 企业多云数据流计算平台。 相关资料链接 数随心动QMatrix产品QMatrix与传统的ETL&#xf…

异构数据比对

1 概述 BeeDI提供任意数据库间&#xff08;Oracle、SQL Server、MySQL、PostgreSQL、DB2、Elasticsearch、Cassandra、MongoDB、Solr、HBase等&#xff09;表的数据一致性比对校验功能&#xff0c;支持异构表&#xff08;不同表名&#xff0c;目标表字段可多于源表&#xff09…

数据异构方案

1、定义 何谓数据异构&#xff0c;上周交易部门商品的同事过来做分享&#xff0c;又看到这个词&#xff0c;他的PPT里面是 数据库异构。其实我们以前做的事情&#xff0c;也是可以成为数据异构。比如我们将DB里面的数据持久化到REDIS里面去&#xff0c;就是一种数据异构的方式。…

数据异构的武器-BINLOG+MQ

2019独角兽企业重金招聘Python工程师标准>>> 1、定义 何谓数据异构&#xff0c;上周交易部门商品的同事过来做分享&#xff0c;又看到这个词&#xff0c;他的PPT里面是 数据库异构。其实我们以前做的事情&#xff0c;也是可以成为数据异构。比如我们将DB里面的数据持…

LVDS差分信号深度详解

博主福利&#xff1a;100G电子设计学习资源包&#xff01; http://mp.weixin.qq.com/mp/homepage?__bizMzU3OTczMzk5Mg&hid7&snad5d5d0f15df84f4a92ebf72f88d4ee8&scene18#wechat_redirect -------------------------------------------------------------------…

lvds接口_LVDS,接口,时序讲解,非常好的文章

欢迎FPGA工程师加入官方微信技术群 点击蓝字关注我们FPGA之家-中国最好最大的FPGA纯工程师社群 1.1.1 LVDS接口分类 1.1.1.1 单路6bit LVDS 这种接口电路中,采用单路方式传输,每个基色信号采用6位数据,共18位RGB数据,因此,也称18位或18bit LVDS接口。此,也称18位或18bit…

YL芯片LVDS屏幕时序和接口介绍

接口说明 YL芯片使用LVDS接口对外输出图像&#xff0c;芯片支持单8和双8和2路单8同时输出的方式输出图像。 芯片支持VESA (Video Electronics Standards Association) standard and JEIDA (Japanese Electronic Industry Development Association) standard两种输出标准。 LV…

ftp软件是什么如何使用,ftp软件是什么如何使用

ftp软件是什么&#xff0c;ftp软件是一种文件传输下载方式&#xff0c;它是TCP/IP协议栈的一部分&#xff1b;其中FTP又由两部分组成&#xff0c;一部分是FTP的服务器&#xff0c;另一部分是FTP的客户端&#xff01;它能够高效安全地进行文件传输下载操作&#xff01;可以使用服…

ftp,windows ftp工具哪个好用

说起windows ftp工具&#xff0c;不知道你们有什么推荐。不过小编有很熟悉的windows ftp工具&#xff0c;多多少少也有那么几个觉得特别好用的。不过需要注意的是有很多的ftp工具只能在windows系统上面操作&#xff0c;也有只能在liunx系统上面操作的。在下载的时候一定要看清楚…