We are given four segments as a pair of coordinates of their end points. We need to tell whether those four line segments make a rectangle or not.

Examples:

Input : segments[] = [(4, 2), (7, 5), (2, 4), (4, 2), (2, 4), (5, 7), (5, 7), (7, 5)] Output : Yes Given these segment make a rectangle of length 3X2. Input : segment[] = [(7, 0), (10, 0), (7, 0), (7, 3), (7, 3), (10, 2), (10, 2), (10, 0)] Output : Not These segments do not make a rectangle. Above examples are shown in below diagram.

This problem is mainly an extension of How to check if given four points form a square

We can solve this problem by using properties of a rectangle. First, we check total unique end points of segments, if count of these points is not equal to 4 then the line segment can’t make a rectangle. Then we check distances between all pair of points, there should be at most 3 different distances, one for diagonal and two for sides and at the end we will check the relation among these three distances, for line segments to make a rectangle these distance should satisfy Pythagorean relation because sides and diagonal of rectangle makes a right angle triangle. If they satisfy mentioned conditions then we will flag polygon made by line segment as rectangle otherwise not.

`// C++ program to check whether it is possible ` `// to make a rectangle from 4 segments ` `#include <bits/stdc++.h> ` `using` `namespace` `std; ` `#define N 4 ` ` ` `// structure to represent a segment ` `struct` `Segment ` `{ ` ` ` `int` `ax, ay; ` ` ` `int` `bx, by; ` `}; ` ` ` `// Utility method to return square of distance ` `// between two points ` `int` `getDis(pair<` `int` `, ` `int` `> a, pair<` `int` `, ` `int` `> b) ` `{ ` ` ` `return` `(a.first - b.first)*(a.first - b.first) + ` ` ` `(a.second - b.second)*(a.second - b.second); ` `} ` ` ` `// method returns true if line Segments make ` `// a rectangle ` `bool` `isPossibleRectangle(Segment segments[]) ` `{ ` ` ` `set< pair<` `int` `, ` `int` `> > st; ` ` ` ` ` `// putiing all end points in a set to ` ` ` `// count total unique points ` ` ` `for` `(` `int` `i = 0; i < N; i++) ` ` ` `{ ` ` ` `st.insert(make_pair(segments[i].ax, segments[i].ay)); ` ` ` `st.insert(make_pair(segments[i].bx, segments[i].by)); ` ` ` `} ` ` ` ` ` `// If total unique points are not 4, then ` ` ` `// they can't make a rectangle ` ` ` `if` `(st.size() != 4) ` ` ` `return` `false` `; ` ` ` ` ` `// dist will store unique 'square of distances' ` ` ` `set<` `int` `> dist; ` ` ` ` ` `// calculating distance between all pair of ` ` ` `// end points of line segments ` ` ` `for` `(` `auto` `it1=st.begin(); it1!=st.end(); it1++) ` ` ` `for` `(` `auto` `it2=st.begin(); it2!=st.end(); it2++) ` ` ` `if` `(*it1 != *it2) ` ` ` `dist.insert(getDis(*it1, *it2)); ` ` ` ` ` `// if total unique distance are more than 3, ` ` ` `// then line segment can't make a rectangle ` ` ` `if` `(dist.size() > 3) ` ` ` `return` `false` `; ` ` ` ` ` `// copying distance into array. Note that set maintains ` ` ` `// sorted order. ` ` ` `int` `distance[3]; ` ` ` `int` `i = 0; ` ` ` `for` `(` `auto` `it = dist.begin(); it != dist.end(); it++) ` ` ` `distance[i++] = *it; ` ` ` ` ` `// If line seqments form a square ` ` ` `if` `(dist.size() == 2) ` ` ` `return` `(2*distance[0] == distance[1]); ` ` ` ` ` `// distance of sides should satisfy pythagorean ` ` ` `// theorem ` ` ` `return` `(distance[0] + distance[1] == distance[2]); ` `} ` ` ` `// Driver code to test above methods ` `int` `main() ` `{ ` ` ` `Segment segments[] = ` ` ` `{ ` ` ` `{4, 2, 7, 5}, ` ` ` `{2, 4, 4, 2}, ` ` ` `{2, 4, 5, 7}, ` ` ` `{5, 7, 7, 5} ` ` ` `}; ` ` ` ` ` `(isPossibleRectangle(segments))?cout << ` `"Yes\n"` `:cout << ` `"No\n"` `; ` `} ` |

*chevron_right*

*filter_none*

Output:

Yes

This article is contributed by **Utkarsh Trivedi**. If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the **DSA Self Paced Course** at a student-friendly price and become industry ready.

## Recommended Posts:

- Check if given four integers (or sides) make rectangle
- Given n line segments, find if any two segments intersect
- Number of ways N can be divided into four parts to construct a rectangle
- How to check if given four points form a square
- Ratio of area of a rectangle with the rectangle inscribed in it
- Largest subset of rectangles such that no rectangle fit in any other rectangle
- Maximum area of a Rectangle that can be circumscribed about a given Rectangle of size LxW
- Find Four points such that they form a square whose sides are parallel to x and y axes
- Check whether four points make a parallelogram
- How to check if two given line segments intersect?
- Queries to find whether a number has exactly four distinct factors or not
- Euler's Four Square Identity
- Lagrange's four square theorem
- Number of digits in the nth number made of given four digits
- Find four factors of N with maximum product and sum equal to N | Set-2
- Find four factors of N with maximum product and sum equal to N
- Maximize the product of four factors of a Number
- Find four factors of N with maximum product and sum equal to N | Set 3
- Maximum possible time that can be formed from four digits
- Find the number of ways to divide number into four parts such that a = c and b = d