[[20171005184200]] 『矩形同士の重なり判定』(すけろく) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『矩形同士の重なり判定』(すけろく)

 矩形A 左下座標(x1,y1)、右上座標(x2,y2)
 矩形B 左下座標(x3,y3)、右上座標(x4,y4)
 が分かっているときにこの2つの矩形が少しでも重なっているかを
 判定するファンクションプロシージャ(結果はTrueかFalse)を
 作成したいのですが、ロジックが分かりません。

 どなたか教えていただけませんか?

< 使用 Excel:Excel2010、使用 OS:Windows7 >


 Intersect(矩形A,矩形B) Is Nothing
 ってことですか?
(稲葉) 2017/10/05(木) 19:05

 すみません、言葉たらずでした。
 座標値には地図の緯度経度が入ります。
 地球の丸みは無視で大丈夫です。
(すけろく) 2017/10/05(木) 21:41

Abs(x1 + x2 - x3 - x4) < Abs(x2 - x1) + Abs(x4 - x3)
かつ
Abs(y1 + y2 - y3 - y4) < Abs(y2 - y1) + Abs(y4 - y3)

の場合が、重なりありでしょうか?

(マナ) 2017/10/05(木) 22:13


↑ちょっと自信ないです。
サンプルデータで確認してみてください。

(マナ) 2017/10/05(木) 22:17


 >地球の丸みは無視で大丈夫です。

 日本の狭い範囲を想定しているってことですかねぇ・・

 ならば、これでイケませんか(接している状況は「重なっていない」とするなら、等号を追加)

 =NOT(AND(OR(X4<X1,X2<X3),OR(Y2<Y3,Y4<Y1)))

(半平太) 2017/10/05(木) 23:02


 返信が遅くなり申し訳ありません。

 マナさんに教えていただいた式をコードに。
 Function ShpOvlapChk1(X1 As Double, Y1 As Double, X2 As Double, Y2 As Double, X3 As Double, Y3 As Double, X4 As Double, Y4 As Double) As Boolean
    ShpOvlapChk1 = Abs(X1 + X2 - X3 - X4) <= Abs(X2 - X1) + Abs(X4 - X3) And Abs(Y1 + Y2 - Y3 - Y4) <= Abs(Y2 - Y1) + Abs(Y4 - Y3)
 End Function

 半平太さんに教えていただいた式をコードに。
 Function ShpOvlapChk2(X1 As Double, Y1 As Double, X2 As Double, Y2 As Double, X3 As Double, Y3 As Double, X4 As Double, Y4 As Double) As Boolean
    ShpOvlapChk2 = Not ((X4 <= X1 Or X2 <= X3) And (Y2 <= Y3 Or Y4 <= Y1))
 End Function

 それぞれいただいた式を基にいろんなパターンで実証しました。

 パターン	結果推測	x1	y1	x2	y2	x3	y3	x4	y4
 パターン1	重なる  	0	0	7	7	1	2	5	6
 パターン2	重なる  	1	2	5	6	0	0	7	7
 パターン3	重なる  	0	0	4	4	3	3	7	7
 パターン4	重なる  	3	3	7	7	0	0	4	4
 パターン5	重なる  	0	0	3	7	2	3	5	5
 パターン6	重なる  	2	3	5	5	0	0	3	7
 パターン7	重なる  	0	3	4	7	3	1	6	4
 パターン8	重なる  	3	1	6	4	0	3	4	7
 パターン9	重なる  	0	3	7	7	3	1	4	5
 パターン10	重なる  	3	1	4	5	0	3	7	7
 パターン11	重ならない	0	0	3	3	4	4	7	7
 パターン12	重ならない	4	4	7	7	0	0	3	3
 パターン13	重ならない	0	5	2	7	3	5	5	7
 パターン14	重ならない	3	5	5	7	0	5	2	7
 パターン15	辺で接する	0	5	2	7	2	4	5	7
 パターン16	点で接する	0	5	2	7	2	0	3	4

 結果、どちらも「重なる」はずのものはすべて大丈夫でしたが、
 パターン16はどちらも重ならない判定が出てしまいました。
 またパターン13、14では半平太さんの式では「重なる」判定となってしまいました。

 いただいた式を基にもう少し考えてみます。
(すけろく) 2017/10/06(金) 09:15

 済みません、間違えました。

 =IF(OR(X4<X1,X2<X3,Y2<Y3,Y4<Y1),"不",CHOOSE(OR(X4=X1,X2=X3)+OR(Y2=Y3,Y4=Y1)+1,"重","辺","点"))

 因みに、そちらのパターン16は「重ならない」ですよね?

 Function OLCK(X1 As Double, Y1 As Double, X2 As Double, Y2 As Double, X3 As Double, Y3 As Double, X4 As Double, Y4 As Double) As String
    If X4 < X1 Or X2 < X3 Or Y2 < Y3 Or Y4 < Y1 Then
        OLCK = "不"
    Else
        OLCK = IIf(X4 = X1 Or X2 = X3, IIf(Y2 = Y3 Or Y4 = Y1, "点", "辺"), "重")
    End If
 End Function 

(半平太) 2017/10/06(金) 12:01


 半平太さんありがとうございます。
 パターン16についてはサンプルの数値が誤っておりました。申し訳ありません。

 パターン	結果推測	x1	y1	x2	y2	x3	y3	x4	y4
 パターン16	点で接する	0	4	2	7	2	0	3	4

 結果、半平太さんの式でうまく希望のものが出せました!
 また、マナさんの式でもうまくいっておりました。
 ありがとうございます!
(すけろく) 2017/10/06(金) 12:29

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.