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é.
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.
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)