web-dev-qa-db-fra.com

Calculer la zone de chevauchement entre deux rectangles

enter image description here

Je veux calculer la zone de chevauchement "LA RÉGION GRISE" entre les rectangles rouges et bleus.

Chaque rectangle est défini par ses quatre coordonnées d'angle. L'unité résultante de la zone de chevauchement est l'unité carrée.

Je ne pouvais pas imaginer comment faire?

Tout commentaire créatif serait apprécié.

22
Eric Bal

Ce type d'intersection se fait facilement par l'idée "min des max" et "max des min". Pour l'écrire, il faut une notion spécifique pour le rectangle, et pour clarifier les choses, j'utiliserai un tuple nommé:

from collections import namedtuple
Rectangle = namedtuple('Rectangle', 'xmin ymin xmax ymax')

ra = Rectangle(3., 3., 5., 5.)
rb = Rectangle(1., 1., 4., 3.5)
# intersection here is (3, 3, 4, 3.5), or an area of 1*.5=.5

def area(a, b):  # returns None if rectangles don't intersect
    dx = min(a.xmax, b.xmax) - max(a.xmin, b.xmin)
    dy = min(a.ymax, b.ymax) - max(a.ymin, b.ymin)
    if (dx>=0) and (dy>=0):
        return dx*dy

print area(ra, rb)
#  0.5 

Si vous n'aimez pas la notation namedtuple, vous pouvez simplement utiliser:

dx = max(a[0], b[0]) - min(a[2], b[2])

etc, ou quelle que soit la notation que vous préférez.

44
tom10

Comme cette question a une balise galbée , voici une solution pour l'utiliser. Je vais utiliser les mêmes rectangles que dans le réponse tom1 :

from shapely.geometry import Polygon

polygon = Polygon([(3, 3), (5, 3), (5, 5), (3, 5)])
other_polygon = Polygon([(1, 1), (4, 1), (4, 3.5), (1, 3.5)])
intersection = polygon.intersection(other_polygon)
print(intersection.area)
# 0.5

C'est beaucoup plus concis que la version de la réponse acceptée. Vous n'avez pas à construire votre propre classe Rectangle car Shapely fournit déjà celles qui sont prêtes . C'est moins sujet aux erreurs (allez comprendre la logique de cette fonction area). Et le code lui-même est explicite.


Références:
Documents pour la méthode object.intersection(other)

11
Georgy