1. 程式人生 > >幾組向量資料的生成和讀取方法

幾組向量資料的生成和讀取方法

       科學計算視覺化,第一步是要有資料,沒有資料一切都是空談。我在做向量場視覺化演算法過程中,一開始也是著實著急了一陣,手頭沒有向量資料,就無法驗證文獻中闡述的演算法,而有了資料,如果不是相應文獻作者的資料,即使結果出來了,但多多少少還是怕生成的向量紋理不正確,就這樣在糾結中過了很長時間。還好,後面陸續獲得很多向量資料,使我的演算法實現過程進展的很順利。下面是我在研究演算法過程中經常用到的幾組向量資料,現在把資料讀取方式和下載連結分享出來,希望對正在做向量場視覺化工作的同學有幫助。        向量資料是一組即有大小、又有方向的資料,但是通常情況下在儲存時並不是按照向量大小和方向儲存,而是按照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分量即可。視覺化效果為: