UV分量和风速风向值互转

以.NET为例:如下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Wind.Util
{
    
    
    public class WindUtil
    {
    
    
        #region 通过风速风向 转换为 UV

        //double fanU = U(FS, FX);
        //double fanV = V(FS, FX);

        /// <summary>
        /// 风速风向转U
        /// </summary>
        /// <param name="dSp">风速</param>
        /// <param name="dWrd">风向</param>
        /// <returns></returns>
        public static double U(double dSp, double dWrd)
        {
    
    
            if (dSp < 0)
                return 0;
            double d0 = 0;
            d0 = dSp * Math.Cos((270 - dWrd) * Math.PI / 180);
            return d0;
        }

        /// <summary>
        /// 风速风向转V
        /// </summary>
        /// <param name="dSp">风速</param>
        /// <param name="dWrd">风向</param>
        /// <returns></returns>
        public static double V(double dSp, double dWrd)
        {
    
    
            if (dSp < 0)
                return 0;
            double d0 = 0;
            d0 = dSp * Math.Sin((270 - dWrd) * Math.PI / 180);
            return d0;
        }

        #endregion

        #region UV分量计算风向风速信息
        /// <summary>
        /// UV分量计算风向风速信息
        /// </summary>
        /// <param name="u"></param>
        /// <param name="v"></param>
        /// <returns></returns>
        public static WindInfo GenWindInfoByUV(double u, double v)
        {
    
    
            //风向
            double fx = 999.9;
            if (u == 9999 || v == 9999)
            {
    
    
                fx = 0;
            }
            else if (u > 0 & v > 0)
            {
    
    
                fx = 270 - Math.Atan(v / u) * 180 / Math.PI;
            }
            else if (u < 0 & v > 0)
            {
    
    
                fx = 90 - Math.Atan(v / u) * 180 / Math.PI;
            }
            else if (u < 0 & v < 0)
            {
    
    
                fx = 90 - Math.Atan(v / u) * 180 / Math.PI;
            }
            else if (u > 0 & v < 0)
            {
    
    
                fx = 270 - Math.Atan(v / u) * 180 / Math.PI;
            }
            else if (u == 0 & v > 0)
            {
    
    
                fx = 180;
            }
            else if (u == 0 & v < 0)
            {
    
    
                fx = 0;
            }
            else if (u > 0 & v == 0)
            {
    
    
                fx = 270;
            }
            else if (u < 0 & v == 0)
            {
    
    
                fx = 90;
            }
            else if (u == 0 & v == 0)
            {
    
    
                fx = 999.9;
            }

            //风速是uv分量的平方和
            double fs = Math.Sqrt(Math.Pow(u, 2) + Math.Pow(v, 2));
            if (u == 9999 || v == 9999)
            {
    
    
                fs = 0;
            }
            WindInfo windInfo = new WindInfo()
            {
    
    
                U = u,
                V = v,
                WindDir = fx,
                WindSpeed = fs,
                WindPowerLevel = GenWindPowerLevel((decimal)fs),
                WindDirDesc = GenWindDirection((decimal)fx)
            };
            return windInfo;
        }
        #endregion
    }

    public class WindInfo
    {
    
    
        /// <summary>
        /// U分量
        /// </summary>
        public double U {
    
     get; set; }

        /// <summary>
        /// V分量
        /// </summary>
        public double V {
    
     get; set; }

        /// <summary>
        /// 风速
        /// </summary>
        public double WindSpeed {
    
     get; set; }

        /// <summary>
        /// 风力等级
        /// </summary>
        public int WindPowerLevel {
    
     get; set; }

        /// <summary>
        /// 风向值
        /// </summary>
        public double WindDir {
    
     get; set; }

        /// <summary>
        /// 风向描述
        /// </summary>
        public string WindDirDesc {
    
     get; set; }
    }
}

风向是以y轴正方向为零度顺时针转(0-360)
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43972758/article/details/129552940
Uv