幾組向量資料的生成和讀取方法
阿新 • • 發佈:2019-02-11
科學計算視覺化,第一步是要有資料,沒有資料一切都是空談。我在做向量場視覺化演算法過程中,一開始也是著實著急了一陣,手頭沒有向量資料,就無法驗證文獻中闡述的演算法,而有了資料,如果不是相應文獻作者的資料,即使結果出來了,但多多少少還是怕生成的向量紋理不正確,就這樣在糾結中過了很長時間。還好,後面陸續獲得很多向量資料,使我的演算法實現過程進展的很順利。下面是我在研究演算法過程中經常用到的幾組向量資料,現在把資料讀取方式和下載連結分享出來,希望對正在做向量場視覺化工作的同學有幫助。
向量資料是一組即有大小、又有方向的資料,但是通常情況下在儲存時並不是按照向量大小和方向儲存,而是按照x分量和y分量儲存,即(x, y),對於向量大小及向量方向,則可以通過(x, y)進一步計算得出。
1. 直接計算得到向量場資料
下面的模擬方法很容易理解,對於指定行、列二維網格的網格點,將座標位置對映並平移後得到的數值作為其向量x分量和y分量。
2. 讀取檔案得到向量場資料 在氣象領域,風場是一個典型的向量場。下面這兩份資料是經由wrf模式運算得到的數值預報風場資料,資料格式很簡單,檔案開始是2個int數值,表明資料列和行,隨後為float型向量資料x、y分量,即(x, y)(x, y)(x, y)......,讀取方式如下:
下面的資料一份為穩定向量場資料,一份為不穩定向量場資料,這兩份資料均由浙江大學一位周姓博士學長提供給我的,在此也表示感謝。vec256^256為穩定向量場資料,其資料格式和讀取方式與上面一樣。psi為三維不穩定場資料,資料格式與讀取方式與上面基本一樣,檔案開始是3個int數值,表明資料行、列、時間步,隨後為float型向量資料x、y、z分量,即(x, y, z)(x, y, z)(x, y, z)......,對於二維向量場,只需處理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分量即可。視覺化效果為: