use List::Util qw(min max); sub x1{0} sub y1{1} sub x2{2} sub y2{3} sub rect_overlap_1 { my($r1,$r2) = @_; return max($$r1[x1],$$r2[x1]) <= min($$r1[x2],$$r2[x2]) && max($$r1[y1],$$r2[y1]) <= min($$r1[y2],$$r2[y2]); } # some tests: use Test::Simple 'no_plan'; ok rect_overlap_1 [10, 10, 30, 30], [20, 20, 40, 60]; # do ok !rect_overlap_1 [10, 10, 30, 30], [20, 40, 40, 60]; # don't ok rect_overlap_1 [10, 10, 30, 30], [15, 15, 20, 20]; # inside ok rect_overlap_1 [10, 10, 30, 30], [40, 20, 20, 60]; # do sub rect_overlap_2 { my($r1,$r2) = @_; return max(min(@$r1[x1,x2]),min(@$r2[x1,x2])) <= min(max(@$r1[x1,x2]),max(@$r2[x1,x2])) && max(min(@$r1[y1,y2]),min(@$r2[y1,y2])) <= min(max(@$r1[y1,y2]),max(@$r2[y1,y2])); } ok rect_overlap_2 [10, 10, 30, 30], [20, 20, 40, 60]; # do ok !rect_overlap_2 [10, 10, 30, 30], [20, 40, 40, 60]; # don't ok rect_overlap_2 [10, 10, 30, 30], [15, 15, 20, 20]; # inside ok rect_overlap_2 [10, 10, 30, 30], [40, 20, 20, 60]; # do sub rect_overlap_3 { my($r1,$r2) = @_; return max(map{min(@$_[x1,x2])}($r1,$r2)) <= min(map{max(@$_[x1,x2])}($r1,$r2)) && max(map{min(@$_[y1,y2])}($r1,$r2)) <= min(map{max(@$_[y1,y2])}($r1,$r2)); } ok rect_overlap_3 [10, 10, 30, 30], [20, 20, 40, 60]; # do ok !rect_overlap_3 [10, 10, 30, 30], [20, 40, 40, 60]; # don't ok rect_overlap_3 [10, 10, 30, 30], [15, 15, 20, 20]; # inside ok rect_overlap_3 [10, 10, 30, 30], [40, 20, 20, 60]; # do sub rect_overlap { return max(map{min(@$_[x1,x2])}@_) <= min(map{max(@$_[x1,x2])}@_) && max(map{min(@$_[y1,y2])}@_) <= min(map{max(@$_[y1,y2])}@_); } ok rect_overlap [10, 10, 30, 30], [20, 20, 40, 60]; # do ok !rect_overlap [10, 10, 30, 30], [20, 40, 40, 60]; # don't ok rect_overlap [10, 10, 30, 30], [15, 15, 20, 20]; # inside ok rect_overlap [10, 10, 30, 30], [40, 20, 20, 60]; # do ok rect_overlap [10, 10, 30, 30], [15, 15, 20, 20], [20, 20, 40, 60]; # (20,20)