/*****************************************************
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()を用いてグローバル座標への変換を行っている。