/***************************************************** voronoi.cc 離散ボロノイ分割 ******************************************************/ vs_module voronoi(ivalue gx, ivalue gy, iImage data) { int genetrices_color = orig_width(gx) * 2; parallel(x,y) { double min = orig_width(data) + orig_heigh(data); for(int i=0;i<orig_width(gx);i++){ // 各母点との距離を計算 int dx = gx[[i]] - l2g_x(data,x); int dy = gy[[i]] - l2g_y(data,y); double distance = sqrt(dx*dx + dy*dy); // 最も距離が近い母点のIndexをdata[][]に代入 if(distance < min){ min = distance; data[][] = i; // 母点を区別する if(distance==0) data[][] = genetrices_color; } } } // キャッシュ更新 vsSyncCache(data); // テンポラリ変数 iImage shadow(data); // 径1の外周(全領域中での)は処理からはずす vsSetBoundary2D(1); // 各ボロノイ領域を線で仕切る(輪郭抽出) parallel(x,y) { shadow[][] = data[][]; if(data[][]-data[-1][]){ shadow[][] = genetrices_color;} if(data[][]-data[+1][]){ shadow[][] = genetrices_color;} if(data[][]-data[][-1]){ shadow[][] = genetrices_color;} if(data[][]-data[][+1]){ shadow[][] = genetrices_color;} } // 大域変数にコピー ImgCopy(data,shadow); }
/**************************************** voronoi.vpe 離散ボロノイ分割 ****************************************/ // 通信処理初期化 ------------- #pragma host_name host1 #pragma host_name host2 #pragma host_name host3 #pragma host_name host4 #pragma use_intercomm /********************************/ /* フィールド */ int w; w = 512; int h; h = 512; iImage data(w,h); /** 母点 **/ int a; a = 80; int gx[a]; // 母点のX座標 int gy[a]; // 母点のY座標 int i; for(i=0;i<a;i=i+1){ gx[i] = (random() * (w-1)) / RAND_MAX; gy[i] = (random() * (h-1)) / RAND_MAX; } /* モジュール実行 */ set(data, CACHE, 1); module("voronoi",gx,gy,data); /* 結果をpgmイメージに保存 */ gather(data); imgSave("result.pgm",data);
int dx = gx[[i]] - l2g_x(data,x); int dy = gy[[i]] - l2g_y(data,y); double distance = sqrt(dx*dx + dy*dy);ここで、parallel構文内でx,yはローカル座標であるので、母点との距離を計算するためにl2g_x(),l2g_y()を用いてグローバル座標への変換を行っている。