Wind Vectors have a U (Eastward) and V (Northward) Component.
Below is the code in C# to calculate the resultant wind
public struct Wind
{
public Wind(float speed, float direction)
{
Speed = speed;
Direction = direction;
}
public float Speed { get; set; }
public float Direction { get; set; }
}
public static Wind CalculateWindSpeedAndDirection(float u, float v)
{
if(Math.Abs(u) < 0.001 && Math.Abs(v) < 0.001)
return new Wind(0,0);
const double radianToDegree = (180 / Math.PI);
return new Wind(
Convert.ToSingle(Math.Sqrt(Math.Pow(u, 2) + Math.Pow(v, 2))),
Convert.ToSingle(Math.Atan2(u, v) * radianToDegree + 180));
}
Test Code
[TestCase(-8.748f, 7.157f, 11.303f, 129.29f)]
[TestCase(-4.641f, -3.049f, 5.553f, 56.696f)]
[TestCase(10f, 0f, 10f, 270f)]
[TestCase(-10f, 0f, 10f, 90)]
[TestCase(0f, 10f, 10f, 180f)]
[TestCase(0f, -10f, 10f, 360f)]
[TestCase(0f,0f,0f,0f)]
[TestCase(0.001f, 0.001f, 0.0014142f, 225f)]
public void CanConvertWindVectorComponents(float u, float v, float expectedWindSpeed, float expectedWindDirection)
{
var result = MetraWaveForecastLocationModel.CalculateWindSpeedAndDirection(u, v);
Assert.AreEqual(Math.Round(expectedWindDirection,2), Math.Round(result.Direction,2));
Assert.AreEqual(Math.Round(expectedWindSpeed,2), Math.Round(result.Speed,2));
}