>>106249759
def calculateArea(rec):
return abs(rec[0] - rec[2]) * abs(rec[1] - rec[3])
def calculateOverlap(recA, recB):
# check if B is entirely outside A
if (recB[0] >= recA[2] or # B is to the right
recB[2] <= recA[0] or # B is to the left
recB[1] <= recA[3] or # B is below
recB[3] >= recA[1]): # B is above
return 0
hOverlap = 0
vOverlap = 0
if(recB[0] < recA[0]): # poking out to the left
hOverlap = recB[2] - recA[0]
print('one', recB[2], recA[0])
elif(recB[2] > recA[2]): # poking out to the right
hOverlap = recA[2] - recB[0]
else: # entirely inside on this axis
hOverlap = recB[2] - recB[0]
if(recB[1] > recA[1]): # poking out to the top
vOverlap = recB[3] - recA[1]
elif(recB[3] < recA[3]): # poking out to the bottom
vOverlap = recA[3] - recB[1]
else: # entirely inside on this axis
vOverlap = recB[3] - recB[1]
return abs(hOverlap) * abs(vOverlap)
def area(rec1, rec2, rec3):
overlappingArea = 0
rec1rec2Overlap = calculateOverlap(rec1, rec2)
rec2rec3Overlap = calculateOverlap(rec2, rec3)
rec3rec1Overlap = calculateOverlap(rec3, rec1)
overlappingArea += rec1rec2Overlap + rec2rec3Overlap + rec3rec1Overlap
# check if all three are overlapping in one spot and remove double count
if(rec1rec2Overlap > 0 and
rec2rec3Overlap > 0 and
rec3rec1Overlap > 0):
# the rightmost left edge
leftEdge = max(rec1[0], rec2[0], rec3[0])
# the leftmost right edge
rightEdge = min(rec1[2], rec2[2], rec3[2])
# the downmost top edge
topEdge = min(rec1[1], rec2[1], rec3[1])
# the upmost bottom edge
bottomEdge = max(rec1[3], rec2[3], rec3[3])
overlappingArea -= abs(leftEdge - rightEdge) * abs(bottomEdge - topEdge)
combinedArea = calculateArea(rec1) + calculateArea(rec2) + calculateArea(rec3)
return combinedArea - overlappingArea
if __name__ == "__main__":
rec1 = (-1,1,1,-1)
rec2 = (0,3,2,0)
rec3 = (0,2,3,-2)
print(area(rec1, rec2, rec3))
Feels a bit crap somehow but seems to work