幾何学のアルゴリズムを考えるのは楽しいな。というわけで
リブルとラブルとルブルで包んでバシシするゲーム。ナムコのリブルラブルを三次元化してみる。
初期状態は▲らりる。幕がはってある三角を▲、枠だけの三角を△と以下表す。▲らりるが三次元中の杭に引っかかって複雑な形になっていく。
▲らりるに杭1が引っかかると、▲らり1、▲りる1、▲るら1が新たに出来る。▲らりるは△らりるになる。
この判定は、らりるが動いた場合に全ての▲のなかで頂点のいずれかにらりるを含む▲について、移動の前と後で杭1がどちら側にあるか調べ、側が変わったら引っかかった可能性がある。その場合、移動前後の二つの三角が作る三角柱の内部に杭があるかどうかしらべれば判定できる。これをすべての杭について行う。
引っかかった場合は新しい▲を3つ生成する。古い三角は△になる。こうしてできた△は引っかかった杭と関連付けて記憶し、杭から離れる判定のためにとっておく。
離れる判定は、△ABCとそれに関連付けられた杭xについて引っかかる判定と同じことを行い、これが真であれば▲ABX、▲BCX、▲CAXを消去して▲ABCを復活させる。同様の判定をすべての△のうち頂点にらりるのどれかを含むものについて行う。
と思ったら違った。離れる判定は難しい。最悪、Convex Hull という問題と等価だったりするかも。まずはすべての陵(Edge)について曲がり具合を調べて元と反対に曲がっていればそのEdge を消去、それに応じて三角を更新、てとこかな。後で詳しく考える。
下段の図は、▲123、▲12ら、▲23る、▲31り、▲2らる、▲1らり、▲3りる、からなる状態。
「り」が▲2らるに引っつくと「バシシ」。空いている面は△らりるしかないので、これがどれかの▲に接すると閉じた空間ができてバシシ完了。
尚、入出力にはオノ=センダイ社製サイバースペース7が適当と思われる。
また、ポワンカレ星のヤドカリ星人向けに、5次元空間をリブルとラブルとレブルとロブルとルブルを操って4次元面で包んでバシシするバージョンも考えられる。
元のゲームに従うなら、空間の各点で何回バシシされたかを記憶しておいて色を変える必要がある。1000x1000x1000くらいのボクセルを使っても、1ボクセル1バイトなら全部で1Gb。なんとかならんこともない。可視化がトリッキーかもしれんが。バシシした領域の色を変える処理は、まず境界ボクセルを全てリストアップ。そこから内側に向かって隣の隣の隣と breadth first でたどっていって同時に画面も更新する。時間がかかっても画面エフェクトだと思えばプレイヤーはストレスを感じない。(ナイスなアイディアだな)