今考えてるものは次のようなものです。
ガラスを割ると言っても、本物のようなものはかなり無理ゲーなので直線をたくさん引いて、それで分割する手法をとります。
まず線を引くのですが、直線の式を
Ax+By=E
として、ABEの値をランダムで決定します。
まず上下左右どの端にいるかを決め、その辺上の位置をランダムで決めます。
これをもう一度行い、直線を引く2点を選びます。
(同じ値にならないように、また頂点と重ならないように。これを重なり判定とし、
処理がめんどくさくなると思われるので重ならないように今後全ての点に対し総当たりで行います)
この求めた座標を(x1,y1),(x2,y2)とします。
このときA,B,Eの値を求めるのですが、
Ax1+By1=E
Ax2+By2=E
未知数3つに対して、式が2つしかない。
あれ?
これは中学校からやり直しフラグか?
とりあえず解くと、
B=(x2-x1)/(y2-y1)*A
E=Ax1 + (x2-x1)/(y2-y1)*y1
やっぱりAが消えない・・・。Aってどんな値でもよかったんでしたっけ?そしたら1にしたいです。
このへんよくわかりませんが、とりあえず直線が求まったとします。これにより四角い画面はぶった切られます。
このときどんな図形になるか、図にまとめました。
長方形の画面とはいっても、下のように一般的な四角形に分類できるので、イビツな四角形や三角形と一緒にして考えています。
図によると、
三角形を隣り合った辺で分割 → 三角形 + 四角形
四角形を隣り合った辺で分割 → 三角形 + 五角形
四角形を2つ隣りの辺で分割 → 四角形 + 四角形
ここから
n角形を隣り合った辺で分割 → 三角形 + (n+1)角形
n角形を2つ隣りの辺で分割 → 四角形 + (n)角形
さらに
n角形をm個隣りの辺で分割 → (m+2)角形 + (n-m+2)角形
となることがわかります。
なにがなんだかわからなくなってまいりました。
三角形を分割した場合、直線と三角形の交点は2つであるはずです。
(△x1,△y1),(△x2,△y2),(△x3,△y3)とあったとき、交点(x1,y1),(x2,y2)は
(△x1 > x1 > △x2) かつ (△y1 > y1 > △y2) かつ
(△x2 > x2 > △x3) かつ (△y2 > y2 > △y3)
となるはずです。これをn角形に応用すると
(△x1,△y1)~(△xn,△yn)の頂点があり、(△なのは突っ込んだら負け)
(△xi > x1 > △xi+1) かつ (△yi > y1 > △yi+1) かつ
(△xj > x2 > △xj+1) かつ (△yj > y2 > △yj+1)
となるiとjが決まるはずです。iとjは、6角形ならiが5番目でi+1が0番目ということがありうるので注意が必要ですね。
~ここまでで2時間~
プログラムが書ける気がしない。
こうしてiとjの差が求まります。これがmです。ということはi≠jですね。
mがわかれば、iとjもわかっているのでどの辺でどう分割すればいいかがわかるはずです。その結果何角形になるかもわかります。
多分これで分割できるのではと思います。
ちなみに
Ax+By=E
Cx+Dy=F
の連立方程式の解は
x=(E*D-B*F)/(A*D-B*C)
y=(F*A-E*C)/(A*D-C*B)
なので、直線同士の交点はこれで求めます。
次です。三角形はいいのですが、四角形以降は三角形をくっつけて描画しないといけません。
百角形ができないとは言い切れないので、これまた一般化して考えたいです。
まず五角形の場合、頂点0~4まであります。
必要な三角形の座標は
△1 (x0,y0),(x1,y1),(x2,y2)
△2 (x0,y0),(x2,y2),(x3,y3)
△3 (x0,y0),(x3,y3),(x4,y4)
あ、なんか簡単そう。一般化は省略します。
次に実際に描画する3Dの座標をどう決めるかという問題が残っていますがとりあえずこんなところで。
プログラム抜きでざざっと考えてみましたが、こんなに複雑だとは思いませんでした・・・。
現在絶賛迷走中ですので、他にいいやり方があったら教えてください。いやほんとに。