几组矢量数据的生成和读取方法

来源:互联网 发布:山东预算软件 编辑:程序博客网 时间:2024/05/14 17:58
       科学计算可视化,第一步是要有数据,没有数据一切都是空谈。我在做矢量场可视化算法过程中,一开始也是着实着急了一阵,手头没有矢量数据,就无法验证文献中阐述的算法,而有了数据,如果不是相应文献作者的数据,即使结果出来了,但多多少少还是怕生成的矢量纹理不正确,就这样在纠结中过了很长时间。还好,后面陆续获得很多矢量数据,使我的算法实现过程进展的很顺利。下面是我在研究算法过程中经常用到的几组矢量数据,现在把数据读取方式和下载链接分享出来,希望对正在做矢量场可视化工作的同学有帮助。
       矢量数据是一组即有大小、又有方向的数据,但是通常情况下在存储时并不是按照矢量大小和方向存储,而是按照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分量即可。可视化效果为:
                                           

       数据下载地址:http://download.csdn.net/detail/u013085897/7046467


3 0
原创粉丝点击