风场浓度场模拟实现思路
目录
风场浓度场前端可视化思路
风场
101*101 网格101*101个点 属性为u,v
- 根据u,v计算出方向r;uu+vv开平方得到大小l
- 根据网格及提供的网格四至坐标得到每个点的坐标
- 所有点添加到地图上,根据l设置点的箭头样式,根据r设置箭头方向
/// <summary>
/// 获取风向风力
/// </summary>
/// <param name="u"></param>
/// <param name="v"></param>
/// <returns></returns>
public double GetRadius(double u, double v) {
double fx = 999.9; //风向
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));
List<double> l = new List<double>();
return fx;
}
/// 返回网格坐标
/// </summary>
/// <returns></returns>
public List<COORD> BuildCoord() {
List<COORD> lst = new List<COORD>();
for (int i = 90; i >= -90; i--)
{
for (int m = 0; m < 180; m++)
{
COORD coord = new COORD();
coord.x = m;
coord.y = i;
lst.Add(coord);
}
for (int m = -180; m < 0; m++)
{
COORD coord = new COORD();
coord.x = m;
coord.y = i;
lst.Add(coord);
}
}
//for (int i = 101; i >= 1; i--)
//{
// for (int m = 1; m < 102; m++)
// {
// COORD coord = new COORD();
// coord.x = m;
// coord.y = i;
// lst.Add(coord);
// }
//}
return lst;
}
浓度场渲染
101101 网格101101个点 属性为浓度值d
- 根据网格及提供的网格四至坐标得到每个点的坐标
- 根据四至计算每个点之间距离,由上面的点生成四边形
- 所有四边形添加到地图上,根据浓度d设置对应颜色渲染