Given a set of points, connect the dots without crossing.

Example:

Input: points[] = {(0, 3), (1, 1), (2, 2), (4, 4), (0, 0), (1, 2), (3, 1}, {3, 3}}; Output: Connecting points in following order would not cause any crossing {(0, 0), (3, 1), (1, 1), (2, 2), (3, 3), (4, 4), (1, 2), (0, 3)}

**We strongly recommend you to minimize your browser and try this yourself first.**

The idea is to use sorting.

- Find the bottom-most point by comparing y coordinate of all points. If there are two points with same y value, then the point with smaller x coordinate value is considered. Put the bottom-most point at first position.

- Consider the remaining n-1 points and sort them by polor angle in counterclockwise order around points[0]. If polor angle of two points is same, then put the nearest point first.
- Traversing the sorted array (sorted in increasing order of angle) yields simple closed path.

**How to compute angles?**

One solution is to use trigonometric functions.

Observation: We don’t care about the actual values of the angles. We just want to sort by angle.

Idea: Use the orientation to compare angles without actually computing them!

Below is C++ implementation of above idea.

`// A C++ program to find simple closed path for n points ` `// for explanation of orientation() ` `#include <bits/stdc++.h> ` `using` `namespace` `std; ` ` ` `struct` `Point ` `{ ` ` ` `int` `x, y; ` `}; ` ` ` `// A global point needed for sorting points with reference ` `// to the first point. Used in compare function of qsort() ` `Point p0; ` ` ` `// A utility function to swap two points ` `int` `swap(Point &p1, Point &p2) ` `{ ` ` ` `Point temp = p1; ` ` ` `p1 = p2; ` ` ` `p2 = temp; ` `} ` ` ` `// A utility function to return square of distance between ` `// p1 and p2 ` `int` `dist(Point p1, Point p2) ` `{ ` ` ` `return` `(p1.x - p2.x)*(p1.x - p2.x) + ` ` ` `(p1.y - p2.y)*(p1.y - p2.y); ` `} ` ` ` `// To find orientation of ordered triplet (p, q, r). ` `// The function returns following values ` `// 0 --> p, q and r are colinear ` `// 1 --> Clockwise ` `// 2 --> Counterclockwise ` `int` `orientation(Point p, Point q, Point r) ` `{ ` ` ` `int` `val = (q.y - p.y) * (r.x - q.x) - ` ` ` `(q.x - p.x) * (r.y - q.y); ` ` ` ` ` `if` `(val == 0) ` `return` `0; ` `// colinear ` ` ` `return` `(val > 0)? 1: 2; ` `// clockwise or counterclock wise ` `} ` ` ` `// A function used by library function qsort() to sort ` `// an array of points with respect to the first point ` `int` `compare(` `const` `void` `*vp1, ` `const` `void` `*vp2) ` `{ ` ` ` `Point *p1 = (Point *)vp1; ` ` ` `Point *p2 = (Point *)vp2; ` ` ` ` ` `// Find orientation ` ` ` `int` `o = orientation(p0, *p1, *p2); ` ` ` `if` `(o == 0) ` ` ` `return` `(dist(p0, *p2) >= dist(p0, *p1))? -1 : 1; ` ` ` ` ` `return` `(o == 2)? -1: 1; ` `} ` ` ` `// Prints simple closed path for a set of n points. ` `void` `printClosedPath(Point points[], ` `int` `n) ` `{ ` ` ` `// Find the bottommost point ` ` ` `int` `ymin = points[0].y, min = 0; ` ` ` `for` `(` `int` `i = 1; i < n; i++) ` ` ` `{ ` ` ` `int` `y = points[i].y; ` ` ` ` ` `// Pick the bottom-most. In case of tie, chose the ` ` ` `// left most point ` ` ` `if` `((y < ymin) || (ymin == y && ` ` ` `points[i].x < points[min].x)) ` ` ` `ymin = points[i].y, min = i; ` ` ` `} ` ` ` ` ` `// Place the bottom-most point at first position ` ` ` `swap(points[0], points[min]); ` ` ` ` ` `// Sort n-1 points with respect to the first point. ` ` ` `// A point p1 comes before p2 in sorted ouput if p2 ` ` ` `// has larger polar angle (in counterclockwise ` ` ` `// direction) than p1 ` ` ` `p0 = points[0]; ` ` ` `qsort` `(&points[1], n-1, ` `sizeof` `(Point), compare); ` ` ` ` ` `// Now stack has the output points, print contents ` ` ` `// of stack ` ` ` `for` `(` `int` `i=0; i<n; i++) ` ` ` `cout << ` `"("` `<< points[i].x << ` `", "` ` ` `<< points[i].y <<` `"), "` `; ` `} ` ` ` `// Driver program to test above functions ` `int` `main() ` `{ ` ` ` `Point points[] = {{0, 3}, {1, 1}, {2, 2}, {4, 4}, ` ` ` `{0, 0}, {1, 2}, {3, 1}, {3, 3}}; ` ` ` `int` `n = ` `sizeof` `(points)/` `sizeof` `(points[0]); ` ` ` `printClosedPath(points, n); ` ` ` `return` `0; ` `} ` |

*chevron_right*

*filter_none*

Output:

(0, 0), (3, 1), (1, 1), (2, 2), (3, 3), (4, 4), (1, 2), (0, 3),

Time complexity of above solution is O(n Log n) if we use a O(nLogn) sorting algorithm for sorting points.

Source:

http://www.dcs.gla.ac.uk/~pat/52233/slides/Geometry1x1.pdf

This article is contributed by **Rajeev Agrawal**. 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:

- Find the point on X-axis from given N points having least Sum of Distances from all other points
- Find the centroid of a non-self-intersecting closed Polygon
- Count of obtuse angles in a circle with 'k' equidistant points between 2 given points
- Number of Integral Points between Two Points
- Minimum number of points to be removed to get remaining points on one side of axis
- Ways to choose three points with distance between the most distant points <= L
- Find points at a given distance on a line of given slope
- Find the maximum possible distance from origin using given points
- Find the equation of plane which passes through two points and parallel to a given axis
- Represent a given set of points by the best possible straight line
- Perimeter of Convex hull for a given set of points
- Count of Squares that are parallel to the coordinate axis from the given set of N points
- Check if the given point lies inside given N points of a Convex Polygon
- Find Corners of Rectangle using mid points
- Program to find line passing through 2 Points
- Program to find equation of a plane passing through 3 points
- Haversine formula to find distance between two points on a sphere
- Find Four points such that they form a square whose sides are parallel to x and y axes
- Find K Closest Points to the Origin
- Find the number of points that have atleast 1 point above, below, left or right of it