モジュール

			
/*****************************************************
  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);


実行方法

  1. モジュールのコンパイル
    % vs_makemodule voronoi.cc
  2. プログラムの実行
    % vios_run < voronoi.vpe


実行フロー設定項目

特に無し。


モジュールプログラム説明