以.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)