由于最近项目需要一些关于地理位置展示方面的需要,需要牵涉到地理位置方面与角度之间的计算。文章中参考了大神的代码,但是其是java代码实现的,无法在unity中直接使用。有兴趣的可以直接阅读原文http://blog.csdn.net/liang5630/article/details/42775997。

如图所示,A、B两点的经纬度已知,求其连线与经线 也就是与正北方向的角度。

首先,我们先定义一个经纬度类,

/// <summary>
/// 经纬度类
/// </summary>
///
public class MyLatLng
{   
    public static double Rc=6378137;    public static double Rj=6356725;  public double m_LoDeg, m_LoMin, m_LoSec;  public double m_LaDeg, m_LaMin, m_LaSec;  public double m_Longitude, m_Latitude;    public double m_RadLo,m_RadLa;  public double Ec;  public double Ed;    public MyLatLng(double longitude,double latitude)  {    m_LoDeg=(int)longitude;m_LoMin=(int)((longitude-m_LoDeg)*60);m_LoSec=(longitude-m_LoDeg-m_LoMin/60)*3600;m_LaDeg=(int)latitude;m_LaMin=(int)((latitude-m_LaDeg)*60);m_LaSec=(latitude-m_LaDeg-m_LaMin/60)*3600;m_Longitude=longitude;m_Latitude=latitude;m_RadLo=longitude*Mathf.PI/180;m_RadLa=latitude*Mathf.PI/180;Ec=Rj+(Rc-Rj)*(90-m_Latitude)/90;Ed=Ec*(Mathf.Cos((float )m_RadLa));}
}  

保存了经纬度,就可以在自己的类中实现 计算方法 返回的数值类型是一个double类型的数据。具体实现方法如下:
/// <summary>
///  取得地图上两点的夹角 自己的写在A 别人的写在B
/// </summary>
/// <returns>The angle.</returns>
/// <param name="A">A.</param>
/// <param name="B">B.</param>public  static double getAngle(MyLatLng A,MyLatLng B)  {    double dx=(B.m_RadLo-A.m_RadLo)*A.Ed;  double dy=(B.m_RadLa-A.m_RadLa)*A.Ec;  double angle=0.0;  angle=Mathf.Atan(Mathf.Abs((float )dx/(float)dy))*180/Mathf.PI;  double dLo=B.m_Longitude-A.m_Longitude;  double dLa=B.m_Latitude-A.m_Latitude;  if(dLo>0&&dLa<=0)  {    angle=(90-angle)+90;  }    else if(dLo<=0&&dLa<0)  {    angle=angle+180;  }else if(dLo<0&&dLa>=0)  {    angle= (90-angle)+270;  }    return angle;  }  
 定义了上面 经纬度类和 获取角度的方法,就可以进行角度计算了。

*************************************************************************************************************
实例使用如下:
假设我们已知A地 深圳大学的经纬度为:113.942909,22.540435,B地天安门的经纬度为116.232922,39.542637。我们在Start方法中实例化他们,并调用方法,代码如下:
  void Start () {
MyLatLngTest AShenZhenUniversity = new MyLatLngTest(113.942909, 22.540435);
MyLatLngTest BTianAnMen          = new MyLatLngTest(116.232922, 39.542637);
double AngleAToB=    getAngle(AShenZhenUniversity, BTianAnMen);
double AngleBToA = getAngle(BTianAnMen , AShenZhenUniversity );
Debug.Log("深圳大学到北京天安门的角度是北偏"+AngleAToB +"度");
Debug.Log("北京天安门到深圳大学的角度为北偏" +AngleBToA +"度");
}
运行程序,结果如下:



大功告成!
完整示例代码如下 新建脚本直接挂在摄像机上可以直接运行。
using UnityEngine;
using System.Collections;
using System;public class Controller_GetAngle : MonoBehaviour {// Use this for initializationvoid Start () {MyLatLngTest AShenZhenUniversity = new MyLatLngTest(113.942909, 22.540435);MyLatLngTest BTianAnMen          = new MyLatLngTest(116.232922, 39.542637);double AngleAToB=    getAngle(AShenZhenUniversity, BTianAnMen);double AngleBToA = getAngle(BTianAnMen , AShenZhenUniversity );Debug.Log("深圳大学到北京天安门的角度是北偏"+AngleAToB +"度");Debug.Log("北京天安门到深圳大学的角度为北偏" +AngleBToA +"度");}// Update is called once per framevoid Update () {}/// <summary>///  取得地图上两点的夹角 自己的写在A 别人的写在B /// </summary>/// <returns>The angle.</returns>/// <param name="A">A.</param>/// <param name="B">B.</param>public static double getAngle(MyLatLngTest A, MyLatLngTest B){double dx = (B.m_RadLo - A.m_RadLo) * A.Ed;double dy = (B.m_RadLa - A.m_RadLa) * A.Ec;double angle = 0.0;angle =Mathf.Atan(Mathf.Abs((float)dx / (float)dy))* 180 / Mathf.PI;double dLo = B.m_Longitude - A.m_Longitude;double dLa = B.m_Latitude - A.m_Latitude;if (dLo > 0 && dLa <= 0){angle = (90 - angle) + 90;}else if (dLo <= 0 && dLa < 0){angle = angle + 180;}else if (dLo < 0 && dLa >= 0){angle = (90 - angle) + 270;}return angle;}
}
/// <summary>
/// 经纬度类
/// </summary>
///
public class MyLatLngTest
{public static double Rc = 6378137;public static double Rj = 6356725;public double m_LoDeg, m_LoMin, m_LoSec;public double m_LaDeg, m_LaMin, m_LaSec;public double m_Longitude, m_Latitude;public double m_RadLo, m_RadLa;public double Ec;public double Ed;public MyLatLngTest(double longitude, double latitude){m_LoDeg = (int)longitude;m_LoMin = (int)((longitude - m_LoDeg) * 60);m_LoSec = (longitude - m_LoDeg - m_LoMin / 60) * 3600;m_LaDeg = (int)latitude;m_LaMin = (int)((latitude - m_LaDeg) * 60);m_LaSec = (latitude - m_LaDeg - m_LaMin / 60) * 3600;m_Longitude = longitude;m_Latitude = latitude;m_RadLo = longitude * Mathf.PI / 180;m_RadLa = latitude * Mathf.PI / 180;Ec = Rj + (Rc - Rj) * (90 - m_Latitude) / 90;Ed = Ec * (Mathf.Cos((float)m_RadLa));}
}
												

Unity中判断地图上两点之间相对于正北方向的角度 c#实现相关推荐

  1. 高德地图上 两点之间的距离计算

    // 距离计算 pointStart:起点的经纬度,pointEnd:结尾的经纬度getDistance(pointStart, pointEnd) {let La1 = (pointStart.la ...

  2. php 地图两点距离计算,计算地图上两点间的距离PHP类

    计算地图上两点间的距离,使用的是谷歌地图 class GeoHelper { /** * @param int $lat1 * @param int $lon1 * @param int $lat2 ...

  3. python 计算流形上两点之间的测地距离

    在分析数据时,有时要计算流形上两点之间的测地距离.本着有现成轮子绝对不自己写的观点,发现可以通过以下方式计算流形上任意两点之间的测地距离. ISOMAP是一种保持测地距离不变的高维空间中低维流形的降维 ...

  4. php 计算两点时间距离,PHP计算地球上两点之间的距离(示例详解)

    给定经度和纬度,求地球上两点之间的距离.首先我们需要了解该问题的解决思路,然后再用PHP代码来实现计算. 此问题可以用半正矢(haversine)公式求解: 大圆距离或正交距离是球面(或地球表面)上两 ...

  5. Java对接高德地图计算距离_高德地图计算两点之间的距离java+html

    高德地图现在使用比较多了,但是高德地图计算两点之间的距离有些问题.下面提供一个很好的解决方案. 代码如下: /** * 两点的经纬度获取两点距离米 * @param (121.293986,37.27 ...

  6. 给定经纬度计算距离_根据经纬度计算地球上两点之间的距离js实现代码

    利用JS实现的根据经纬度计算地球上两点之间的距离 最近用到了根据经纬度计算地球表面两点间距离的公式,然后就用JS实现了一下. 计算地球表面两点间的距离大概有两种办法. 第一种是默认地球是一个光滑的球面 ...

  7. 用Dijkstra算法找到图上两点之间的最短路径

    Finding the shortest path between two points on a graph is a common problem in data structures, espe ...

  8. 如何求地球上两点之间的最短距离_例谈平行线上两动点之间距离最短问题

    初中几何中有一类关于距离最短的问题,这些问题最终都会转化为"垂线段最短"或"两点之间线段最短".本文就一类平行线上两动点之间距离最短问题,谈谈笔者对此的分析和见 ...

  9. 如何求地球上两点之间的最短距离_初中数学求线段之和最小的问题,知识点题型汇总...

    我们经常在考试当中看到求线段之和最小的问题,首先来看下这几个数学模型: 模型1:两点之间线段最短 要在l找点P,使得PA+PB最短,这模型最简单,两点之间线段最短. 模型2:将军饮马问题 在l上找一点 ...

最新文章

  1. 在学生课堂作业作品发布之前的话
  2. centos 搭建 svn服务器
  3. 升级macOS新系统后,Xcode7.2 Xcode7.3.1 在新建项目界面,出现了文字错乱的情况
  4. java test 用法_Java的testcase用法
  5. 【考研】2022温州大学计算机学硕招收调剂
  6. python中print是什么意思_python中print什么意思
  7. Android运行Socket项目时出现错误 Error: ShouldNotReachHere()
  8. vue获取div中的值_一篇文章看懂Vue.js的11种传值通信方式
  9. 想学 Python?那这套教程再适合你不过了!!
  10. 的ui在vs中显示没有成员_在电脑桌面使用敬业签团队便签怎么设置新增内容在上面显示?...
  11. 谁是三国跳槽王:吕布成毫无规划的跳槽者
  12. Google,Guava本地高效缓存
  13. 轻便的客户端本地文件数据库 SQLite
  14. cvSetMouseCallback()鼠标坐标、事件返回
  15. 基于jsp+mysql+Spring+SpringMVC+mybatis的ssm学生网上请假系统
  16. Windows 下 FTP的搭建
  17. 共享充电宝APP小程序开发
  18. 2019年前端大事件回顾:流年笑掷,未来可期
  19. USB PD协议规范
  20. 企查查如何在线查询失信企业?

热门文章

  1. 计算机取消健,笔记本电脑的去除健失灵了,可以设置其他按键代替吗?
  2. MySQL示例数据库sakila-db的安装导入
  3. Java开发者文档(开发软件+规范)
  4. 基于Android的校园新闻APP
  5. webview android xml,如何将XML加载到WebView Android中
  6. WPS的RANK函数学习过程
  7. 【C++ opencv-resize函数(调整图像大小)】
  8. 爬虫日记-scrapy-day1
  9. 减弱或消除误差的办法
  10. 电脑鼠标左右键不灵敏?看我的!