三角と四角で考える

画像マップを小さくして試したが、どうも遅い・・・
線分を引く毎(はみ出した場合)に多大な計算が発生する。
これはもういかんともしがたいので、最初にマップの構造を把握するところからやり直してみよう。

http://gihyo.jp/dev/serial/01/geometry/0008
などにもあるが多角形の中に点が含まれているかどうかは割りと簡単に算出できる。
これなら、そもそもバイト配列も不要になる。
不特定の図形を把握するのはすごく大変なので、割りと簡単な多角形だけで構成されるマップを考える。
三角だけでいいと思うけど、四角形も含める。
円は多角形に近似されるが近似するのに時間がかかるので考えないことにする。
多角形の数を100個くらいに限定しても、速度的にはそれなりに動いてくれると思う。


塗りつぶしに関しては android.graphics.Path が解決してくれる。

マップの切り抜きによって多角形が壊れた時は再計算の必要がある。
ただこれは部分的な計算になる(はずな)ので、時間的には問題ないと思う。

例えば、(x0,y0)-(x1,y1)で構成される、四角形があるとする。

この時の面積は (x1 - x0) * (y1 - y0) = s0 となる。

下図のようにa(ax,ay),b(bx,by),c(cx,cy)で切り抜かれた後の面積は(色の濃い部分が切り抜かれる)・・・


s0
-((ax - bx) * (ay - by) / 2) ※上の三角形の面積
-(bx - x1) * (by - y1) ※中の四角形の面積
-((cx - bx) * (cy - by) / 2) ※下の三角形の面積

で求められる。
(※ax=x0,cy=x0となっているがどちらでも可)

新しい多角形は、下図のように

1,2,3,4,5から構成される(三角形と四角形しか考えなくてもいいのかな)。

 (bx - x0) * (by - x0) ※1の四角形の面積
 +(bx - ax) * (ay - y0) ※2の四角形の面積
 +(cx - x0) * (cy - by) ※3の四角形の面積
 +((ax - by) * (by - ax) / 2) ※4の三角形の面積
 +((bx - cx) * (cy - by) / 2) ※5の三角形の面積

これを先ほどのx0,y0-x1,y1の図形の代わりに入れてやることで実現可能。