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)
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值