teratail header banner
teratail header banner
質問するログイン新規登録
NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

1484閲覧

pythonで2つの図表位置の比べ方

msken

総合スコア15

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/02/12 15:55

0

0

お世話になります。

pythonで、PDFの処理をしています。

座標軸が取得できている2つのオブジェクトがあり、
片方の図表が、もう片方の図表の 内側に収まっているかどうか を調べていますが
コードの書き方が分かりません。

左下を起点(0,0)として、例えば、リストで下記のような
outer_boxとinner_boxの変数を持った場合、
inner_boxが、outer_boxの内側に完全に収まっているかどうかを調べるためには、
どのようにすれば良いでしょうか?

 outer_box=[(2,2),(2,8),(8,2),(8,8)]
inner_box =[(4,4),(4,6),(6,4),(6,6)]

実際には、inner_boxがたくさんあり、
1つずつ、ループで調べる手順です。

もし、numpyなどをimportして便利であれば、その方法でご教授いただけると幸いです

お手数をお掛けしますが、よろしくお願いします

イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wwbQzhMkhhgEmhU

2019/02/12 20:47

オブジェクトがN個あるのであれば、その組み合わせは、N!/2あります。 仮にそれをi番目のオブジェクトがj番目のオブジェクトと比較した結果、内包関係にあるかどうかをcomp[i][j](ただしi>j)で定義し(i<=jの部分は全てFalseとします)、各オブジェクトの左上、座標をpos[k]=[topleft,topright,bottomleft,bottomright]と定義するなら(各座標はx,y要素を持ちます)。 comp[i][j]=(pos[i].topleft.x<pos[j].topleft.x) and (pos[j].topright.x<pos[i].topright.x) and (pos[i].topleft.y<pos[j].topleft.y) and (pos[j].bottomleft.y<pos[i].bottomleft.y) and (pos[i].bottomleft.x<pos[j].bottomleft.x) and (pos[j].bottomright.x<pos[i].bottomright.x) and (pos[i].topright.y<pos[j].topright.y) and (pos[j].bottomright.y<pos[i].bottomright.y) (座標が一致しているときは内包にしていません。自分で書き換えてください。) となると思うので、ループすれば何となく出てくるのではないかと。。。 階層にもならないし、一致座標をTrue判定にしていないので、目的のものになるかは知りませんが、大雑把な考え方だけ知りたいのであれば、この説明で十分かと思います。速い方法や洗練された方法を知りたいのであればご自分でご検討ください。
msken

2019/02/13 13:26

早速にアドバイスいただきありがとうございました。 wwbQzhMkhhgEmhUさんとiredflyさんのアドバイスを元に 回答に辿りつかせていただきました。 今後ともよろしくお願いしますm(_ _)m
guest

回答2

0

ベストアンサー

各辺が座標軸に平行な(=左上と右下の点だけで表現できる)長方形であれば、以下のようなコードで判定できます。
参考:Find out if a rectangle is inside another rectangle [C]

Python

1import numpy as np 2 3# left,right,top,bottom座標を返す 4def get_rect(box): 5 ary = np.array(box) 6 x,y = ary[:,0],ary[:,1] 7 l,r,t,b = min(x),max(x),max(y),min(y) 8 return l,r,t,b 9 10# box1がbox2を内包するか 11def is_inner(box1,box2): 12 l1,r1,t1,b1 = get_rect(box1) 13 l2,r2,t2,b2 = get_rect(box2) 14 return r2 < r1 and l2 > l1 and t2 < t1 and b2 > b1 15 16 17outer_box =[(2,2),(2,8),(8,2),(8,8)] 18inner_box =[(4,4),(4,6),(6,4),(6,6)] 19 20ret = is_inner(outer_box,inner_box) 21print(ret) # True

inner_boxが多数あり、より効率よく処理したい場合は以下の過去回答の考えが参考になるかと思います。
[Python3]長方形に内包される長方形を判定したい

投稿2019/02/13 00:56

can110

総合スコア38352

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

msken

2019/02/13 13:26

早速のご回答と、参考情報をいただきありがとうございました Numpyは、まだ使ったことがなかったので たいへん参考になりました。 今後ともよろしくお願いしますm(_ _)m
guest

0

こんにちは。

図表は長方形に限られるという前提ですが、
boxAの四隅の座標がboxBの対応する四隅の座標よりすべて「内側」にあるとき
boxAはboxBに内包される、というのはお分かりかと思います。

全boxの四隅の座標を左上、右上、左下、右下ごと外→内順に並べて
すべての座標が相手より小さいペアを見つけるのはいかがでしょう。

左上:ABC
右上:ACB
左下:ABC
右下:ACB

この場合はboxAがboxBおよびboxCを内包している(他はなし)。

投稿2019/02/13 00:12

編集2019/02/13 00:15
firedfly

総合スコア1133

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

msken

2019/02/13 13:26

早速にアドバイスいただきありがとうございました。 iredflyさんとwwbQzhMkhhgEmhUさんのアドバイスを元に 回答に辿りつかせていただきました。 ベストアンサーをお送りしたかったのですが、 最終的にNumpyをご教授いただいた方にさせていただきましたが iredflyさんのアドバイスがなければ、出来なかったです。 本当にありがとうございました! 今後ともよろしくお願いしますm(_ _)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問