首页 > 编程语言 >球面双站定位c++源码及原理介绍(已知2点经纬高及看向目标的方位、俯仰,求目标的经

球面双站定位c++源码及原理介绍(已知2点经纬高及看向目标的方位、俯仰,求目标的经

时间:2024-06-15 15:10:24浏览次数:22  
标签:高及 double c++ 站点 源码 ra 球面 dec sin

球面双站定位是一个空间几何问题,它用于在给定两个已知站点的经纬度和他们向特定目标看去的方位和俯仰角的情况下,计算目标的经纬度。

这个问题可以通过解一个线性方程组来求解。假设两个站点分别是A和B,他们分别看向目标的方位分别是θAθA​和θBθB​,俯仰角分别是ϕAϕA​和ϕBϕB​。目标的经纬度可以通过以下方式确定:

  1. 将三个方位角转换为球面坐标系中的向量。
  2. 利用向量积计算他们的交点,这个点就是目标的球面坐标。
  3. 最后将球面坐标转换为经纬度。

以下是一个简化的C++实现:

#include <iostream>
#include <cmath>

// 球面坐标系下的向量乘法
void SphericalMultiply(double ra, double dec1, double dec2, double *r, double *dec) {
    double sinDec = sin(dec1) * cos(ra) * sin(dec2) +
                    cos(dec1) * sin(ra);
    *r = acos(sinDec / sin(dec2));
    *dec = atan2(cos(dec1) * sin(ra),
                 sin(dec1) * cos(dec2) -
                     cos(dec1) * sin(dec2) * cos(ra));
}

// 经纬度转球面坐标
void GeoToSphere(double lat1, double lon1, double *ra, double *dec) {
    *ra = lon1 * M_PI / 180.0;
    *dec = acos(sin(lat1 * M_PI / 180.0));
}

// 球面坐标转经纬度
void SphereToGeo(double ra, double dec, double *lat, double *lon) {
    *lat = asin(sin(dec)) * 180.0 / M_PI;
    *lon = ra * 180.0 / M_PI;
}

// 球面双站定位
void SphereBipolar(double latA, double lonA, double azA, double elA,
                   double latB, double lonB, double azB, double elB,
                   double *lat, double *lon) {
    double raA, decA, raB, decB;
    GeoToSphere(latA, lonA, &raA, &decA);
    GeoToSphere(latB, lonB, &raB, &decB);

    double ra = 0, dec = 0;
    SphericalMultiply(raA - raB, decA, decB, &ra, &dec);

    SphereToGeo(ra, dec, lat, lon);
}

int main() {
    double latA = 40.0; // 站点A的纬度
    double lonA = -70.0; // 站点A的经度
    double azA = 30.0; // 站点A向目标看去的方位角
    double elA = 10.0; // 站点A俯仰的角度

    double latB = 45.0; // 站点B的纬度
    double lonB = -80.0; // 站点B的经度
    double azB = 45.0; // 站点B向目标看去的方位角
    double elB = 15.0; // 站点B俯仰的角度

    double lat, lon; // 计算出的目标的纬度和经度

    SphereBipolar(latA, lonA, azA, elA, latB, lonB, azB, elB, &lat, &lon);

    std::cout << "计算出的目标经度-纬度: " << lon <<"-"<<lat << std::endl;
}

标签:高及,double,c++,站点,源码,ra,球面,dec,sin
From: https://www.cnblogs.com/eastgeneral/p/18249317

相关文章

  • 基于Java+SpringBoot+Vue前后端分离宠物管理系统(源码+万字LW+PPT+部署教程)
    博主介绍:✌全网粉丝10W+csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌一、作品包含源码+数据库+设计文档LW+PPT+全套环境和工具资源+部署教程二、项目......
  • 最新支持ChatGPT3.5/GPT4.0网站源码,AI系统源码,ChatGPT运营网站系统,支持GPTs应用、AI绘
    一、文章前言SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统,支持OpenAI-GPT全模型+国内AI全模型。支持GPT-4o大模型、文档分析、识图图片理解、GPTs应用、GPT语音对话、联网提问、GPT-4全模型、DALL-E3文生图、GPT4-All联网搜索模型、思维导图、......
  • C++:特殊类
    文章目录不能拷贝的类C++98C++11只能在堆上创建对象的类只能在栈上创建对象的类不能被继承的类C++98C++11单例模式饿汉模式饿汉模式不能拷贝的类拷贝只会发生在两个场景中:拷贝构造函数以及赋值运算符重载,因此想要让一个类禁止拷贝,只需让该类不能调用拷贝构造函数......
  • C++:智能指针
    文章目录背景内存泄漏内存泄漏的危害内存泄漏的分类堆内存泄露(HeapLeak)系统资源泄露如何避免内存泄漏智能指针的使用和原理RAII智能指针地原理auto_ptrunique_ptrshared_ptrshared_ptr的循环引用定制删除器背景由于C++11中引入了异常的概念,而异常会影响执行流,......
  • C++多线程:生产者消费者模式
    文章目录一、模式简介二、头文件、全局变量2.1仓库类的设计2.1.1关于仓库类的分析2.1.2仓库类的设计代码2.2工厂类的设计2.2.1关于工厂类的分析2.2.2工厂类的设计代码a将产品item放到仓库repob将产品item从仓库repo取出c生产者操作d消费者操作2.2.3主函数代......
  • 【C++】类和对象(下)
    【C++】类和对象(下)初始化列表构造时的类型转化static成员概念特性友元友元函数友元类内部类匿名对象总结初始化列表在对类和对象有了基本的认识之后,可以知道在创建对象的时候,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。classDate{public: ......
  • 【C++核心编程】菱形继承&虚基类
    多继承多继承的语法:class派生类名:[继承方式1]基类名1,[继承方式2]基类名2,......{派生类新增加的成员};不提倡使用多继承,只有在比较简单和不出现二义性的情况时才使用多继承,能用单一继承解决的问题就不要使用多继承。如果继承的层次很多、关系很复杂,程序的编写、......
  • 美食天下 网页设计 html源码 大作业
    ......
  • 自动化生成C/C++单元测试覆盖率报告!
    覆盖率生成脚本化处理在《生成单元覆盖率》一文中,我们已经可以成功的生成代码覆盖率报告,但是,不知道各位读者有没发现,整个过程是有一定繁杂的,多个命令搭配诸多不同的参数,对于初初接触的人来说,敲一下看一眼,生怕敲错、或者cv大法来来回回好几趟,生成个报告,没个三几分钟都不行;对......
  • C/C++生成单元测试覆盖率
    生成单元测试覆盖率前文提到添加了编译参数-fprofile-arcs、-ftest-coverage已经生成了gcno文件,单元测试运行后也产生了gcda文件。并且我们已经安装好lcov,那么该如何使用lcov来生成覆盖率报告呢?进入到我们生成了*.gcno*.gcda文件的目录收集覆盖率数据(*.gcda)并......