2つの四角形が重なる条件
ビル・ゲイツの面接試験−私の場合 より、
うーん、真っ先に「重なる」という事象に対して「四角を構成する線分の太さを0と仮定する場合」と「太さがある場合」に場合わけしちゃうのはダメなんだろうか(苦笑
数式を < にするか ≦ にするかの差でしかないことかもしれないが、ハードウェア制御などでは、これはものすごく重要な話でもあったりする。
1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|
2 | ||||
3 | ||||
4 | ||||
5 |
このような、(1, 1) から (5, 5) の座標を構成する四角形、あなたから見て、そしてあなたの使うクラスライブラリからみて、幅丈はいくつですか?
ちなみに、.NET の System.Drawing.Rectangle.FromLTRB(1, 1, 5, 5).Width は4です。
ちなみに、
私の場合、四角Bの4頂点の座標が、四角Aに含まれているかを4回検査し、最後に四角Aの4頂点のうち1つが四角Bに含まれているか調査する、ということショートサーキットで調べると考えました。
bool RectOnRect(Rect a, Rect b) { return PtInRect(a, b[1]) || PtInRect(a, b[3]) || PtInRect(a, b[7]) || PtInRect(a, b[9]) || PtInRect(b, a[7]); } bool PtInRect(Rect r, Pt p) { return (r.Left < p.X) && (r.Right > p.X) && (r.Top < p.Y) && (r.Bottom > p.Y); }
まあ、実装位置としては Rect 構造体の Contains メソッドなので引数は多少違うんですが…。