マーチングスクエア — 場から線を抜く
二値化は値を「上か下か」で塗り分ける。その境目だけを線で抜くと等値線になる。場の値がちょうどあるしきい値になる点を繋ぐと、地形図の等高線と同じ一本の輪郭が出る。塗りでなく境界を描くので、面でなく線で絵を見せる処理になる。
マーチングスクエア。連続な場 f(x, y) の f = iso を満たす点を、格子のセル単位の局所判定だけで繋ぐ。セル4隅が iso の上か下かを4ビットの番号にまとめると 16 通りで、線がそのセルをどう横切るかが番号ごとに決まる。二値化が各画素を「上か下か」で塗り分けるのに対し、こちらは上と下の境目だけを線で抜く。同じしきい値を、面でなく境界として読む。ピクセル単位の3次元版がマーチングキューブで、医療画像の等値面抽出やメタボールの表面生成に使われる。
場は sin と cos を数本足した波。各格子点で値が iso より上か下かだけを見て、上を明るい色、下を暗い色で塗り分ける。二値化と同じ操作で、iso を時間で上下させると明暗の境目が場の上を動く。
明暗の境目が、抜きたい等値線の通り道。格子で塗ると境目は階段状で、まだ線にはなっていない。
その境目を線分として引く。セルの4隅 tl tr br bl がそれぞれ iso の上か下かを4ビットの番号にまとめると 16 通りになる。全隅が上(15)か全隅が下(0)のセルは線が通らないので飛ばす。残りは上下が分かれている辺を線が横切る。横切る位置を辺の両端の値の差で線形補間して求め、辺どうしを結ぶ。
cross が辺を横切る位置。(iso - va) / d で辺の片端 va から iso までが辺全体の何割かを出し、その割合だけ端から進めた点を返す。場が滑らかなので、隣り合うセルの線分が端で繋がって一本の閉じた輪郭になる。code が 5 と 10 のときだけ対角に二本入るのは、対角の隅どうしが斜めに分かれていて線が二回横切るため。この鞍点は繋ぎ方が二通りあって、ここだけ曖昧さが残る。iso が動くと、輪郭が場の尾根や谷を伝って太ったり痩せたりする。
しきい値を一つでなく等間隔に何本も並べると等高線図になる。場に動くガウスの山をいくつか足して、iso を -0.6 から刻んで同じセル判定を各レベルで回す。一本の輪郭が高さ一つに対応する。
ガウスの山が動くと、それを囲む等高線が伸び縮みする。二つの山が近づくと、外側の低いレベルの輪郭が先に繋がって一つの島になる。同じセル判定を iso を変えながら回すだけで、一枚の場が標高ごとの輪郭の束になる。二値化が面で塗り分けるところを、その境界線だけで地形を見せる読み方になる。