zoukankan      html  css  js  c++  java
  • 测量中角度处理常用函数

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace 改为相关项目的命名空间
    {
        /// <summary>
        /// 常用角度处理类
        /// </summary>
        /// <author>llc3s@foxmail.com</author>
        public class CommonAngleFun
        {
            #region 十进制度转化为弧度
            /// <summary>
            /// 十进制度转化为弧度
            /// </summary>
            /// <param name="dd"></param>
            /// <returns></returns>
            public static double deg2rad(double dd)
            {
                return dd * Math.PI / 180.0;
            }
    
            #endregion
    
            #region 空格分隔的度分秒转化为十进制度
            /// <summary>
            /// 空格分隔的度分秒转化为十进制度
            /// </summary>
            /// <param name="temp"></param>
            public static double str2dfm(string temp)
            {
                temp = temp.Trim();
                double[] ang = new double[3];
                double j = -1.0;
                //验证是否为合格的度分秒
                try
                {
                    string[] angles = temp.Split(" ".ToCharArray());
                    if (angles.Length != 3)
                    {
                        MessageBox.Show("度分秒格式不合格");
                        return j;
                    }
    
                    for (int i = 0; i < 3; i++)
                    {
                        ang[i] = double.Parse(angles[i]);
                    }
    
                    j = ang[0] + ang[1] / 60 + ang[2] / 3600;
                }
                catch
                {
                    MessageBox.Show("不是合格的度分秒数据,度分秒之间以空格分隔");
                }
                return j;
            }
            #endregion
    
            #region 空格分隔的度分秒字符串转化为弧度
            /// <summary>
            /// 空格分隔的度分秒转化为弧度
            /// </summary>
            /// <param name="temp"></param>
            /// <returns></returns>
            public static double str2rad(string temp)
            {
                return deg2rad(str2dfm(temp));
            }
            #endregion
    
            #region 弧度转化为十进制度
            /// <summary>
            /// 弧度转化为十进制度分秒
            /// </summary>
            /// <param name="rad"></param>
            public static double rad2Degree(double rad)
            {
                double degree = rad * 180 / Math.PI;
                return degree;
            }
            #endregion
    
            #region 十进制度转化为度分秒
            /// <summary>
            /// 十进制度转化为度分秒
            /// </summary>
            /// <param name="degree"></param>
            /// <param name="n">表示十进制度转化为度分秒时秒位保留的小数位数</param>
            /// <returns></returns>
            public static double[] degree2DFM(double degree,int n)
            {
                double[] dfm = new double[3];
                double d = Math.Floor(degree);
                double f = Math.Floor((degree - d) * 60);
                double m = Math.Round(((degree - d) * 60 - f) * 60,0);
                dfm[0] = d;
                dfm[1] = f;
                dfm[2] = m;
                return dfm;
            }
    
            #endregion
    
            #region 度分秒转化为空格分隔的字符串
            /// <summary>
            /// 度分秒转化为空格分隔的字符串
            /// </summary>
            /// <param name="dfm"></param>
            /// <returns></returns>
            public static string dfm2Str(double[] dfm)
            {
                string str = string.Empty;
                for (int i = 0; i < dfm.Length; i++)
                {
                    str += dfm[i].ToString() + " ";
                }
                return str;
            }
    
            #endregion
    
            #region 弧度转化为空格分隔的度分秒字符串
            /// <summary>
            /// 弧度转化为空格分隔的度分秒字符串
            /// </summary>
            /// <param name="rad"></param>
            /// <param name="n">十进制度转化为度分秒时秒位的小数位数</param>
            /// <returns></returns>
            public static string rad2StrDfm(double rad,int n)
            {
                return dfm2Str(degree2DFM(rad2Degree(rad),n));
            }
            #endregion
    
            #region 夹角计算
            /// <summary>
            /// 夹角计算.用于测量中方向观测法或类似的夹角计算
            /// </summary>
            /// <param name="ang1"></param>
            /// <param name="ang2"></param>
            /// <returns></returns>
            private double[] jiajiao(double[] ang1, double[] ang2)
            {
                if (ang1.Length != 3 || ang2.Length != 3)
                {
                    MessageBox.Show("错误");
                    return null;
                }
                else
                {
                    //预处理
                    //度位待求方向是否大于0方向,不大于,加360;
                    if (ang2[0] < ang1[0])
                        ang2[0] += 360;
    
                    //bool mj = false;
                    //bool dj = false; //度/分借位标记.
    
                    if (ang2[2] < ang1[2])
                    {
                        //mj = true;
                        ang2[2] += 60;
                        ang2[1] -= 1; //秒位加60,分位-1
                    }
    
                    if (ang2[1] < ang1[1])
                    {
                        //dj=true;
                        ang2[1] += 60;
                        ang2[0] -= 1; //分位加60,度位-1;
                    }
    
                    //开始计算
                    double[] result = new double[3];
                    for (int i = 0; i < 3; i++)
                    {
                        result[i] = ang2[i] - ang1[i];
                    }
                    return result;
                }
    
            }
            #endregion
    
            #region 方位角计算
            /// <summary>
            /// 方位角计算(第二个点减第一个点)
            /// </summary>
            /// <param name="x1">第一个点</param>
            /// <param name="y1">第一个点</param>
            /// <param name="x2">第二个点</param>
            /// <param name="y2">第二个点</param>
            /// <returns></returns>
            public static double fangweijiao(double x1, double y1, double x2, double y2)
            {
                double fjrad = Math.Atan(Math.Abs((y1 - y2) / (x1 - x2)));
                //判断象限
                //第一象限
                if (y2 - y1 > 0 && x2 - x1 > 0)
                    return fjrad;
                //第二象限
                else if (y2 - y1 > 0 && x2 - x1 < 0)
                {
                    return Math.PI - fjrad;
                }
                else if (y2 - y1 < 0 && x2 - x1 < 0)
                {
                    //第三象限
                    return Math.PI + fjrad;
                }
                else if (y2 - y1 < 0 && x2 - x1 > 0)
                {
                    //第四象限
                    return (Math.PI * 2 - fjrad);
                }
                else
                    return -1;
    
            }
    
            #endregion
    
            #region 任意两方位角的夹角计算
    
            #endregion
        }
    }
  • 相关阅读:
    [BZOJ4199][NOI2015]品酒大会
    [BZOJ4198][Noi2015]荷马史诗
    [BZOJ4197][Noi2015]寿司晚宴
    [BZOJ4196][NOI2015]软件包管理器
    2016-11-15NOIP模拟赛
    2016.6.30模拟赛
    BZOJ3672: [Noi2014]购票
    UOJ#191. 【集训队互测2016】Unknown
    第四届CCF软件能力认证(CSP2015) 第五题(最小花费)题解
    bzoj3926: [Zjoi2015]诸神眷顾的幻想乡 对[广义后缀自动机]的一些理解
  • 原文地址:https://www.cnblogs.com/DayDreamEveryWhere/p/3160700.html
Copyright © 2011-2022 走看看