Perimeter of the Union of Two Rectangles
Last Updated :
22 Jun, 2021
Given two arrays X[] and Y[], each of length 4, where (X[0], Y[0]) and (X[1], Y[1]) represents the bottom left and top right corners of one rectangle and (X[2], Y[2]) and (X[3], Y[3]) represents the bottom left and top right corners of the other rectangle, the task is to find the perimeter of the outer boundaries of the union of the two rectangles as shown below.
Examples:
Input: X[] = {-1, 2, 0, 4}, Y[] = {2, 5, -3, 3}
Output: 26
Explanation: Required Perimeter = 2 * ( (4 – (-1)) + (5 – (-3)) ) = 2*(8 + 5) = 26.
Input: X[] = {-3, 1, 1, 4}, Y[] = {-2, 3, 1, 5}
Output: 26
Explanation: Required Perimeter = 2 * ( (4 – (-3)) + (5 – (-2)) ) = 2*(7 + 7) = 28.
Approach: Follow the steps below to solve the problem:
- Check if the rectangles formed by the given points intersect or not.
- If found to be intersecting, then the perimeter can be calculated by the formula 2*((X[1] – X[0]) + (X[3] – X[2]) + (Y[1] – Y[0]) + (Y[3] – Y[2])).
- Otherwise, print twice the sum of maximum differences between X and Y coordinates respectively, i.e. 2 * (max(X[]) – min(X[]) + max(Y[]) – min(Y[])).
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
bool doIntersect(vector< int > X,
vector< int > Y)
{
if (X[0] > X[3] || X[2] > X[1])
return false ;
if (Y[0] > Y[3] || Y[2] > Y[1])
return false ;
return true ;
}
int getUnionPerimeter(vector< int > X,
vector< int > Y)
{
int perimeter = 0;
if (!doIntersect(X, Y)) {
perimeter
+= 2 * ( abs (X[1] - X[0])
+ abs (Y[1] - Y[0]));
perimeter
+= 2 * ( abs (X[3] - X[2])
+ abs (Y[3] - Y[2]));
}
else {
int w = *max_element(X.begin(),
X.end())
- *min_element(X.begin(),
X.end());
int l = *max_element(Y.begin(),
Y.end())
- *min_element(Y.begin(),
Y.end());
perimeter = 2 * (l + w);
}
return perimeter;
}
int main()
{
vector< int > X{ -1, 2, 4, 6 };
vector< int > Y{ 2, 5, 3, 7 };
cout << getUnionPerimeter(X, Y);
}
|
Java
import java.util.*;
class GFG
{
static boolean doIntersect( int []X,
int []Y)
{
if (X[ 0 ] > X[ 3 ] || X[ 2 ] > X[ 1 ])
return false ;
if (Y[ 0 ] > Y[ 3 ] || Y[ 2 ] > Y[ 1 ])
return false ;
return true ;
}
static int getUnionPerimeter( int []X,
int []Y)
{
int perimeter = 0 ;
if (!doIntersect(X, Y)) {
perimeter
+= 2 * (Math.abs(X[ 1 ] - X[ 0 ])
+ Math.abs(Y[ 1 ] - Y[ 0 ]));
perimeter
+= 2 * (Math.abs(X[ 3 ] - X[ 2 ])
+ Math.abs(Y[ 3 ] - Y[ 2 ]));
}
else {
int w = Arrays.stream(X).max().getAsInt()
- Arrays.stream(X).min().getAsInt();
int l = Arrays.stream(Y).max().getAsInt()
- Arrays.stream(Y).min().getAsInt();
perimeter = 2 * (l + w);
}
return perimeter;
}
public static void main(String[] args)
{
int []X = { - 1 , 2 , 4 , 6 };
int []Y = { 2 , 5 , 3 , 7 };
System.out.print(getUnionPerimeter(X, Y));
}
}
|
Python3
def doIntersect(X, Y):
if (X[ 0 ] > X[ 3 ] or X[ 2 ] > X[ 1 ]):
return False
if (Y[ 0 ] > Y[ 3 ] or Y[ 2 ] > Y[ 1 ]):
return False
return True
def getUnionPerimeter(X, Y):
perimeter = 0
if ( not doIntersect(X, Y)):
perimeter + = 2 * ( abs (X[ 1 ] - X[ 0 ]) + abs (Y[ 1 ] - Y[ 0 ]))
perimeter + = 2 * ( abs (X[ 3 ] - X[ 2 ]) + abs (Y[ 3 ] - Y[ 2 ]))
else :
w = max (X) - min (X)
l = max (Y) - min (Y)
perimeter = 2 * (l + w)
return perimeter
if __name__ = = '__main__' :
X = [ - 1 , 2 , 4 , 6 ]
Y = [ 2 , 5 , 3 , 7 ]
print (getUnionPerimeter(X, Y))
|
C#
using System;
using System.Linq;
public class GFG
{
static bool doIntersect( int []X,
int []Y)
{
if (X[0] > X[3] || X[2] > X[1])
return false ;
if (Y[0] > Y[3] || Y[2] > Y[1])
return false ;
return true ;
}
static int getUnionPerimeter( int []X,
int []Y)
{
int perimeter = 0;
if (!doIntersect(X, Y))
{
perimeter
+= 2 * (Math.Abs(X[1] - X[0])
+ Math.Abs(Y[1] - Y[0]));
perimeter
+= 2 * (Math.Abs(X[3] - X[2])
+ Math.Abs(Y[3] - Y[2]));
}
else
{
int w = X.Max()
- X.Min();
int l = X.Max()
- Y.Min();
perimeter = 2 * (l + w);
}
return perimeter;
}
public static void Main(String[] args)
{
int []X = { -1, 2, 4, 6 };
int []Y = { 2, 5, 3, 7 };
Console.Write(getUnionPerimeter(X, Y));
}
}
|
Javascript
<script>
function doIntersect(X,Y)
{
if (X[0] > X[3] || X[2] > X[1])
return false ;
if (Y[0] > Y[3] || Y[2] > Y[1])
return false ;
return true ;
}
function getUnionPerimeter(X,Y)
{
let perimeter = 0;
if (!doIntersect(X, Y)) {
perimeter
+= 2 * (Math.abs(X[1] - X[0])
+ Math.abs(Y[1] - Y[0]));
perimeter
+= 2 * (Math.abs(X[3] - X[2])
+ Math.abs(Y[3] - Y[2]));
}
else {
let w = Math.max(...X)
- Math.min(...X);
let l = Math.max(...Y)
- Math.min(...Y);
perimeter = 2 * (l + w);
}
return perimeter;
}
let X = [-1, 2, 4, 6 ];
let Y = [ 2, 5, 3, 7 ];
document.write(getUnionPerimeter(X, Y));
</script>
|
Time Complexity: O(1)
Auxiliary Space: O(1)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...