// 中点変位法でヘイトマップを生成 // // ActionScript入門Wiki - 中点変位法でハイトマップを生成する // http://web.archive.org/web/20111017054549/http://www40.atwiki.jp/spellbound/pages/1691.html PGraphics pg; float minsize = 8; // 分割を終了させるしきい値 // 初期化 void setup() { size(512, 512); frameRate(1); pg = createGraphics(width, height); drawWorld(); } // 描画 void draw() { drawWorld(); image(pg, 0, 0); } // ヘイトマップを生成 void drawWorld() { pg.beginDraw(); pg.background(0); float tl = random(1); float tr = random(1); float bl = random(1); float br = random(1); generateHeightMap(0, 0, (float)pg.width, (float)pg.width, tl, tr, bl, br); pg.endDraw(); } // ヘイトマップ生成 // @param x [Number] 左上の座標 x // @param y [Number] 左上の座標 y // @param sz [Number] サイズ(横幅, 縦幅) // @param sz0 [Number] 初期値サイズ(横幅, 縦幅) // @param tl [Number] 左上の値 // @param tr [Number] 右上の値 // @param bl [Number] 左下の値 // @param br [Number] 右下の値 void generateHeightMap(float x, float y, float sz, float sz0, float tl, float tr, float bl, float br) { if (sz <= minsize) { // 分割終了 float v = (tl + tr + bl + br) / 4; // 平均値を得る float col = v * 255; // 色(明るさ)を得る pg.noStroke(); pg.fill(col); pg.rect(x, y, sz, sz); // 矩形を描画 return; } // 分割中 // 四隅から見て中央にあるピクセルに // 平均値 + 変位させるランダム値を入れる float midv = (tl + tr + bl + br) / 4; midv += (random(-0.5, 0.5) * sz / sz0); // 0.0 から 1.0 の範囲に収める midv = min(max(midv, 0.0), 1.0); // 中央から見て上下左右にあるピクセルにも平均値を入れる float pTop = (tl + tr) / 2; // 左上と右上の平均値 float pBottom = (bl + br) / 2; // 左下と右下の平均値 float pLeft = (tl + bl) / 2; // 左上と左下の平均値 float pRight = (tr + br) / 2; // 右上と右下の平均値 // 2x2に分割するのでサイズを半分にする sz /= 2; generateHeightMap(x, y, sz, sz0, tl, pTop, pLeft, midv); generateHeightMap(x + sz, y, sz, sz0, pTop, tr, midv, pRight); generateHeightMap(x, y + sz, sz, sz0, pLeft, midv, bl, pBottom); generateHeightMap(x + sz, y + sz, sz, sz0, midv, pRight, pBottom, br); }