zoukankan      html  css  js  c++  java
  • 根据2点经纬度,计算方位角,以及计算2条线的夹角

      1. 以真北为0度起点,由东向南向西顺时针旋转360度,主要是用于控制象限。
        根据2点经纬度,计算方位角
        [csharp]
                ///
        <summary>
                /// 给定2点,获得经纬度
                /// </summary>
        
                /// <param name="startPoint">起点经纬度,都是以度为单位</param>
                /// <param name="endPoint">终点经纬度,都是以度为单位</param>
                /// <returns></returns>
                private double GetLineAngle(Point2D startPoint, Point2D endPoint)
                {
                    double mathPI = 3.1415926535897931;
                    double tmpValue = 0;
                    double latStart = startPoint.Y * mathPI / 180;
                    double lngStart = startPoint.X * mathPI / 180;
                    double latEnd = endPoint.Y * mathPI / 180;
                    double lngEnd = endPoint.X * mathPI / 180;
                    if (startPoint.X == endPoint.X || startPoint.Y == endPoint.Y)
                    {
                        if (startPoint.X == endPoint.X)
                        {
                            /// 经度相同
                            if (endPoint.Y >= startPoint.Y)
                            {
                                return 0;
                            }
                            else
                            {
                                return 180;
                            }
                        }
                        else
                        {
                            /// 纬度相同
                            if (endPoint.X >= startPoint.X)
                            {
                                return 90;
                            }
                            else
                            {
                                return 270;
                            }
                        }
                    }
        
                    tmpValue = Math.Sin(latStart) * Math.Sin(latEnd) + Math.Cos(latStart) * Math.Cos(latEnd) * Math.Cos(lngEnd - lngStart);
                    tmpValue = Math.Sqrt(1 - tmpValue * tmpValue);
                    tmpValue = Math.Cos(latEnd) * Math.Sin(lngEnd - lngStart) / tmpValue;
                    double resultAngle = Math.Abs(Math.Asin(tmpValue) * 180 / mathPI);
        
                    if (endPoint.X > startPoint.X)
                    {
                        if (endPoint.Y >= startPoint.Y)
                        {
                            /// 第一象限 
                            return resultAngle;
                        }
                        else
                        {
                            /// 第二象限 
                            return 180 - resultAngle;
                        }
                    }
                    else
                    {
                        /// 第四象限
                        if (endPoint.Y >= startPoint.Y)
                        {
                            return 360 - resultAngle;
                        }
                        else
                        {
                            /// 第三象限
                            return 180 + resultAngle;
                        }
                    }
                }
        [/csharp]

      2. 计算线的夹角:
        [csharp]
        double lastAngle = GetLineAngle(tempvPoints[k-1], tempvPoints[k]);
        double thisAngle = GetLineAngle(tempvPoints[k], tempvPoints[k + 1]);
        double angle = Math.Abs(thisAngle - lastAngle);
        if (angle > 180)
        {
           angle = 360 - angle;
        }
        angle = 180 - angle;
        [/csharp]

      3. 参考文档:

        http://linfengsheng.iteye.com/blog/1473037
        http://blog.sina.com.cn/s/blog_658a93570101hynw.html

  • 相关阅读:
    GotoAndPlay 图论
    P1965 转圈游戏  快速幂
    双栈排序 图论
    威尔逊定理 数学
    n!mod p 的求法 数学
    P3195 [HNOI2008]玩具装箱TOY DP+优化
    loj6485. LJJ 学二项式定理
    loj6539. 奇妙数论题
    loj535. 「LibreOJ Round #6」花火
    loj534. 「LibreOJ Round #6」花团
  • 原文地址:https://www.cnblogs.com/firesword/p/6093099.html
Copyright © 2011-2022 走看看