科学计算可视化,第一步是要有数据,没有数据一切都是空谈。我在做矢量场可视化算法过程中,一开始也是着实着急了一阵,手头没有矢量数据,就无法验证文献中阐述的算法,而有了数据,如果不是相应文献作者的数据,即使结果出来了,但多多少少还是怕生成的矢量纹理不正确,就这样在纠结中过了很长时间。还好,后面陆续获得很多矢量数据,使我的算法实现过程进展的很顺利。下面是我在研究算法过程中经常用到的几组矢量数据,现在把数据读取方式和下载链接分享出来,希望对正在做矢量场可视化工作的同学有帮助。
矢量数据是一组即有大小、又有方向的数据,但是通常情况下在存储时并不是按照矢量大小和方向存储,而是按照x分量和y分量存储,即(x, y),对于矢量大小及矢量方向,则可以通过(x, y)进一步计算得出。
1. 直接计算得到矢量场数据
下面的模拟方法很容易理解,对于指定行、列二维网格的网格点,将坐标位置映射并平移后得到的数值作为其矢量x分量和y分量。
int row = 400, col = 400, index = 0;
float vec_x = 0.0f, vec_y = 0.0f, vcMag = 0.0f, scale = 0.0f;
float* pVector = (float*)malloc(sizeof(float) * row * col * 2 );
for(int i = 0; i < row; i++)
{
for(int j = 0; j < col; j++)
{
// 数据生成
index = i * col + j;// 中心矢量场
// index = (row - 1 - i) * col + j;// 马鞍矢量场
vec_x = -(float)i / row + 0.5f;
vec_y = (float)j / col - 0.5f;
// 数据规整
vcMag = float(sqrt(vec_x * vec_x + vec_y * vec_y));
scale = (vcMag < 0.001f) ? 0.0f : 1.0f / vcMag;
vec_x *= scale;
vec_y *= scale;
pVector[2*index] = vec_x;
pVector[2*index + 1] = vec_y;
}
}
可视化效果为:
2. 读取文件得到矢量场数据
在气象领域,风场是一个典型的矢量场。下面这两份数据是经由wrf模式运算得到的数值预报风场数据,
数据格式很简单,文件开始是2个int数值,表明数据列和行,随后为float型矢量数据x、y分量,即
(x, y)(x, y)(x, y)......,读取方式如下:
int info[2];
FILE* fp = fopen("data\\wrf1-500hpa-0.dat", "rb");
fread(info, sizeof(int), 2, fp);
int col = info[0];
int row = info[1];
float* pVector = new float[row * col * 2];
fread(pVector, sizeof(float), row * col * 2, fp);
//
// ... ...
//
fclose(fp);
fp = NULL;
可视化效果为:
下面的数据一份为稳定矢量场数据,一份为不稳定矢量场数据,这两份数据均由浙江大学一位周姓博士学长提供给我的,在此也表示感谢。vec256^256为稳定矢量场数据,其数据格式和读取方式与上面一样。psi为三维不稳定场数据,数据格式与读取方式与上面基本一样,文件开始是3个int数值,表明数据行、列、时间步,随后为float型矢量数据x、y、z分量,即(x, y, z)(x, y, z)(x, y, z)......,对于二维矢量场,只需处理x, y分量即可。可视化效果为: