地図/幾何/立体を回す

奥から塗る — 画家のアルゴリズム

面を塗る順番で前後を表す。奥の面から先に塗り、手前の面を後で塗ると、手前が奥を上書きして隠す。画家が背景から前景へ塗り重ねるのと同じ手順。面を奥行きで並べ替えるだけ。

画家のアルゴリズムは、面を視点からの距離(普通は重心の奥行き)でソートし、遠い順に塗る。実装が単純で、凸多面体なら正しい結果になる。ただし限界がある——面どうしが貫通していたり、A が B の手前で B が C の手前で C が A の手前、のように重なり順が循環すると、どんな順序でも正しく塗れない。これを画素単位で解くのが Z バッファで、各画素に現在最も手前の奥行きを記録し、それより奥の画素は捨てる。Edwin Catmull が 1974 年の博士論文で導入した。ハードウェアの GPU は Z バッファを使うので、面の事前ソートは要らない。CanvasRenderingContext2D には画素ごとの奥行き判定がないので、面のソートで近似する。

立方体の六面を重心の奥行きでソートし、奥から塗る。面ごとに違う明度を割り当てて、どの面が手前に来ているかを見せる。

polys.sort((p, q) => q.zc - p.zc) が肝で、重心の奥行き zc が大きい(奥の)面を先に塗る。この一行を消すと、面が定義順のまま塗られて、奥の面が手前の面を上書きして立体が裏返ったり穴が空いたりする。面ごとの固定明度は塗り順を見せるための便宜で、本当の陰影ではない。回すと手前に来た面が後から塗られて、箱に見える。