机场跑道入侵检测

  • 实现原理:
  • 效果
  • 关键代码(只提供思路和部分代码,并非完整代码。)

实现原理:

1、读取并解析机场跑道、车道数据,显示和存储。
2、根据本机的经纬度坐标,确定本机所在跑道,并计算出一个多边形区域。
3、实时获取它机、车辆坐标数据,判断是否位于本机起飞跑道的多边形范围内。
4、如果它机、车辆坐标位于本机跑道,则预警。

通过面积法,判断点P是否在四边形(A,B,C,D)内。如果在四边形内,则四边形的面积=面积(P,A,B)+面积(P,B,C)+面积(P,C,D)+面积(P,D,A),反之不在四边形内。

如下图:

效果

视频地址:https://www.bilibili.com/video/BV1bK4y147R1/

关键代码(只提供思路和部分代码,并非完整代码。)

 //judge quadrangle is contain point pbool isInQuadrangle(QVector<QPointF> &pointfs, QPointF p);//calculate triangle areadouble getTriangleArea(QPointF p1, QPointF p2, QPointF p3);//get Vertex of Quadrangle void getQuadrangleVertex(QPointF m1, QPointF m2, float direction, double len, QVector<QPointF> &pointfs);//polygon vertexes can be sorted clockwisevoid clockwiseSort(QVector<QPointF> & vPoints);bool PointCmp(const QPointF &a, const QPointF &b, const QPointF &center);double getAngle(const QPointF &oldPos, const QPointF &newPos) const;
//跑道入侵检测
void runwayIncursionCheck(std::vector<OtherAircraftInfo> &aircraftInfo)
{for (std::vector<OtherAircraftInfo>::iterator itr = aircraftInfo.begin(); itr != aircraftInfo.end(); itr++){if (mCurrentRunWay.count() == 4){if (mCalculate.isInQuadrangle(mCurrentRunWay, QPointF(itr->lon, itr->lat))){itr->incursion = true;qWarning() << "Runway Incursion: " << itr->ID;}else{itr->incursion = false;}}        }
}
计算本机所在的跑道
void whichRunWay(const AircraftInfo & aircraftInfo)
{//foreach runWaymCurrentRunWay.clear();for (int runwayIndex = 0; runwayIndex < mRunWays.count() ; runwayIndex++){        QVector<QPointF> runWay(4);double angle = mCalculate.getAngle(mRunWays[runwayIndex].at(0), mRunWays[runwayIndex].at(1));  //calculate runway anglemCalculate.getQuadrangleVertex(mRunWays[runwayIndex].at(0), mRunWays[runwayIndex].at(1), angle , 60/1852.0, runWay);if (mCalculate.isInQuadrangle(runWay, QPointF(aircraftInfo.lon, aircraftInfo.lat))){mCurrentRunWay = runWay;}}
}
//通过一个已知坐标点、方位角、和距离,计算另一个点的经纬度坐标
void CalculatePositionByAngle(double & DestLat, double & DestLon, double orgLat, double orgLon, double distNM, double angle)
{double rad_lati = ToRadian(orgLat);double rad_longi = ToRadian(orgLon);double Ec = PolarRadiusMeter + (EquatorRadiusMeter - PolarRadiusMeter)*(90.0 - orgLat) / 90.0;double Ed = EquatorRadiusMeter * cos(rad_lati);double difx = distNM * 1852.0 * cos(ToRadian(90 - angle));double dify = distNM * 1852.0 * sin(ToRadian(90 - angle));DestLat = ToAngle(1.0*dify / Ec + rad_lati);DestLon = ToAngle(1.0*difx / Ed + rad_longi);if (DestLon > 180){DestLon = DestLon - 360;}if (DestLat > 180){DestLat = DestLat - 360;}
}
const qreal pi = 3.141592653589793238462643383;
//判断坐标点,是否在一个四边形区域内
bool isInQuadrangle(QVector<QPointF> &pointfs, QPointF p)
{double dTriangle = getTriangleArea(pointfs.at(0), pointfs.at(1), p) + getTriangleArea(pointfs.at(1), pointfs.at(2), p) + getTriangleArea(pointfs.at(2), pointfs.at(3), p) + getTriangleArea(pointfs.at(3), pointfs.at(0), p);double dQuadrangle = getTriangleArea(pointfs.at(0), pointfs.at(1), pointfs.at(2)) + getTriangleArea(pointfs.at(2), pointfs.at(3), pointfs.at(0));if ((dTriangle >0) && (dQuadrangle > 0) && (qAbs(dTriangle - dQuadrangle) < 0.00001)){qDebug() << "isInQuadrangle: " << qAbs(dTriangle - dQuadrangle);return true;}elsereturn false;//return dTriangle == dQuadrangle;
}
//计算一个三角形的面积
double getTriangleArea(QPointF p1, QPointF p2, QPointF p3)
{return qAbs((p1.x()*p2.y() + p2.x()*p3.y() + p3.x()*p1.y() - p2.x()*p1.y() - p3.x()*p2.y() - p1.x()*p3.y()) / 2.0);
}//根据四边形两条对边的中线,方位、宽度,计算出四个顶点坐标
void getQuadrangleVertex(QPointF m1, QPointF m2, float direction, double len, QVector<QPointF> &pointfs)
{float angle1 = 0.0;float angle2 = 0.0;angle1 = (direction + 90.0) > 360.0 ? direction + 90.0 - 360.0 : direction + 90.0;angle2 = (direction + 270.0) > 360.0 ? direction + 270.0 - 360.0 : direction + 270.0;Conversions cver;cver.CalculatePositionByAngle(pointfs[0].ry(), pointfs[0].rx(), m1.y(), m1.x(), len / 2, angle1);cver.CalculatePositionByAngle(pointfs[1].ry(), pointfs[1].rx(), m1.y(), m1.x(), len / 2, angle2);cver.CalculatePositionByAngle(pointfs[2].ry(), pointfs[2].rx(), m2.y(), m2.x(), len / 2, angle1);cver.CalculatePositionByAngle(pointfs[3].ry(), pointfs[3].rx(), m2.y(), m2.x(), len / 2, angle2);clockwiseSort(pointfs);
}//四边形四个顶点 按照顺时针排序
void clockwiseSort(QVector<QPointF>& vPoints)
{//calculate centre pointQPointF center;double x = 0, y = 0;for (int i = 0; i < vPoints.size(); i++){x += vPoints[i].x();y += vPoints[i].y();}center.rx() = (int)x / vPoints.size();center.ry() = (int)y / vPoints.size();//sort pointfor (int i = 0; i < vPoints.size(); i++){for (int j = 0; j < vPoints.size() - i - 1; j++){if (PointCmp(vPoints[j], vPoints[j + 1], center)){QPointF tmp = vPoints[j];vPoints[j] = vPoints[j + 1];vPoints[j + 1] = tmp;}}}
}bool PointCmp(const QPointF &a, const QPointF &b, const QPointF &center)
{if (a.x() >= 0 && b.x() < 0)return true;/*if (a.x() == 0 && b.x() == 0)return a.y() > b.y();*///向量OA和向量OB的叉积int det = (a.x() - center.x()) * (b.y() - center.y()) - (b.x() - center.x()) * (a.y() - center.y());if (det < 0)return true;if (det > 0)return false;//向量OA和向量OB共线,以距离判断大小int d1 = (a.x() - center.x()) * (a.x() - center.x()) + (a.y() - center.y()) * (a.y() - center.y());int d2 = (b.x() - center.x()) * (b.x() - center.y()) + (b.y() - center.y()) * (b.y() - center.y());return d1 > d2;
}
//根据两个点,计算方位
double getAngle(const QPointF &oldPos, const QPointF &newPos) const
{//根据两个点的经纬度,以一个点(old)为坐标中心,y轴正方向为正北方向(即为 0°),求出另一个点(new)关于正北方向的角度(0° ~ 360°)double a = newPos.x() - oldPos.x();  //经度差double b = newPos.y() - oldPos.y();    //纬度差double c = hypot(fabs(a), fabs(b));double cosy = 0.0;double angle = 0;if (a > 0 && b > 0)         // 判断road点在user点的东北位置{cosy = b / c;angle = 0;}else if ((a == 0) && (b > 0))  //在正北位置{angle = -90;}else if ((a > 0) && (b < 0))   // 判断road点在user点的东南位置{cosy = a / c;angle = 90;}else if ((a > 0) && (b == 0))  //在正东位置{angle = 90;}else if ((a < 0) && (b < 0))    // 判断road点在user点的西南位置{cosy = fabs(b) / c;angle = 180;}else if ((a == 0) && (b < 0))   //在正南位置{angle = 90;}else if ((a < 0) && (b > 0))    // 判断road点在user点的西北位置{cosy = fabs(a) / c;angle = 270;}else if ((a < 0) && (b == 0))   //在正西位置{angle = 180;}double m = acos(cosy);//n 即以正北为 0 的总角度double n = (m / pi) * 180 + angle;return n;
}

机场跑道入侵检测(C++、Qt)相关推荐

  1. 基于视频监控分析异物入侵检测算法的实现方法

    随着视觉识别技术的不断发展和应用,大量的应用场景需要对重要设施和区域进行异物入侵检测,如轨道交通.输变电站.铁路沿线.机场跑道等,以防止因异物入侵而导致财产损失或人身安全伤害. 当前用于视频图像的异物 ...

  2. 基于机器学习的入侵检测系统

    导 语 在过去十年中,机器学习技术取得了快速进步,实现了以前从未想象过的自动化和预测能力.随着这一技术的发展促使研究人员和工程师为这些美妙的技术构思新的应用.不久,机器学习技术被用于加强网络安全系统. ...

  3. 网络入侵检测规避工具fragrouter

    网络入侵检测规避工具fragrouter 网络入侵检测系统可以通过拦截数据包,获取内容进而判断是否为恶意数据包.对于传输较大的数据包,通常会采用分片的方式,将大数据包拆分为小数据包进行传输.如果入侵检 ...

  4. linux 入侵检测

    最近遇到了很多服务器被入侵的例子,为了方便日后入侵检测以及排查取证,我查询了一些linux服务器入侵取证的相关资料,并在此总结分享,以便日后查询. 一般服务器被入侵的迹象,包括但不局限于:由内向外发送 ...

  5. 浅谈大型网络入侵检测建设

    博文作者:xti9er[TSRC] 发布日期:2013-07-10 阅读次数:7063 博文内容: 一.前言 伊朗2010年被报出核工厂遭受"超级工厂"(Stuxnet)病毒攻击, ...

  6. [转载]基于数据挖掘技术入侵检测系统研究

    [---  资料是从免费网站上获取的,上载在这里,只为交流学习目的,文章原作者保留所有权力, 如本博客的内容侵犯了你的权益,请与以下地址联系,本人获知后,马上删除.同时本人深表歉意,并致以崇高的谢意! ...

  7. Libnids库-网络入侵检测的基础框架

    1.Libnids介绍: Libnids(library  network intrusion detection system)是网络入侵检测开发的专业编程接口,实现了网络入侵检测系统的基本框架,提 ...

  8. 专门入侵检测linux叫什么,入侵检测系统分析及其在Linux下的实现(上)

    一.入侵检测系统分析 1.1 什么是入侵检测系统 所谓入侵,是指任何试图危及计算机资源的完整性.机密性或可用性的行为.而入侵检测,顾名思义,便是对入侵行为的发觉.它通过从计算机网络或系统中的若干关键点 ...

  9. SNORT入侵检测系统

    0x00 一条简单的规则 alert tcp 202.110.8.1 any -> 122.111.90.8 80 (msg:"Web Access"; sid:1) ale ...

最新文章

  1. 使用Novell.Directory.Ldap.NETStandard在.NET Core中验证AD域账号
  2. Java 查看文件绝对路径,JAVA获取文件绝对路径的方法
  3. 阿里某员工:年终奖到手,再见996
  4. PHP-Curl模拟HTTP请求
  5. python就业方向及工资-Python的就业的方向和前景
  6. 使用VS2003创建WEB程序的时候出现AutoMation服务器不能创建对象错误
  7. defunct 进程占用端口_UAV心跳机制与容器、进程数据采集
  8. Ubuntu 安装 Kafka
  9. 欧洲英语语言c1证书,威尼斯大学认可的英语语言证书
  10. 宏碁电脑BIOS没有usb启动项怎么办?
  11. No certificate for team ‘‘ matching ‘iPhone Distribution: VOVA TECH LIMITED ()‘ Select a different s
  12. opencv实现两张图片叠加
  13. 南航与英航签署合作谅解备忘录
  14. 【个人记录 | 研二预答辩】
  15. 计算机台式机硬盘,台式电脑硬盘和笔记本硬盘有什么区别【详解】
  16. 国家卫生计生委医院管理研究所简介
  17. EasyPR-Java新能源车牌识别
  18. IPsec中IKE与ISAKMP过程分析(主模式-消息5和消息6)
  19. java中continue用法
  20. Tomcat 打印日志让你事半功倍

热门文章

  1. uniapp中购物车demo(全选反选、计算总价、改变商品数量)
  2. 特征提取算法:HOG,HAAR,LBP
  3. 利用Python爬取年终总结等文字,并保存为公文格式的word文档
  4. Structured Streaming中StructType与StructField的嵌套使用
  5. Python 常见文件格式 .py .pyc .pyw .pyo .pyd
  6. 右键菜单出现在光标左侧问题
  7. NPDP-《新产品战略》
  8. U盘安装CentOS7查看u盘设备名称的命令
  9. 国内开源Android系统,国产华为用的安卓系统是开源的,这开源是啥意思?
  10. jsp火车时刻查询服务系统ssh