Orientation of 3 ordered points

Orientation of an ordered triplet of points in the plane can be

  • counterclockwise
  • clockwise
  • colinear

The following diagram shows different possible orientations of (a,b,c)

orientation1

If orientation of (p1, p2, p3) is collinear, then orientation of (p3, p2, p1) is also collinear.
If orientation of (p1, p2, p3) is clockwise, then orientation of (p3, p2, p1) is counterclockwise and vice versa is also true.

Given three points p1, p2 and p3, find orientation of (p1, p2, p3).
Example:



Input:   p1 = {0, 0}, p2 = {4, 4}, p3 = {1, 2}
Output:  CounterClockWise

Input:   p1 = {0, 0}, p2 = {4, 4}, p3 = {1, 1}
Output:  Colinear

How to compute Orientation?

The idea is to use slope.  

pic

Slope of line segment (p1, p2): σ = (y2 - y1)/(x2 - x1)
Slope of line segment (p2, p3): τ = (y3 - y2)/(x3 - x2)

If  σ > τ, the orientation is clockwise (right turn)

Using above values of σ and τ, we can conclude that, 
the orientation depends on sign of  below expression: 

(y2 - y1)*(x3 - x2) - (y3 - y2)*(x2 - x1)

Above expression is negative when σ < τ, i.e.,  counterclockwise

Below is the implementation of above idea.

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// A C++ program to find orientation of three points
#include <iostream>
using namespace std;
  
struct Point
{
    int x, y;
};
  
// To find orientation of ordered triplet (p1, p2, p3).
// The function returns following values
// 0 --> p, q and r are colinear
// 1 --> Clockwise
// 2 --> Counterclockwise
int orientation(Point p1, Point p2, Point p3)
{
    // See 10th slides from following link for derivation
    // of the formula
    int val = (p2.y - p1.y) * (p3.x - p2.x) -
              (p2.x - p1.x) * (p3.y - p2.y);
  
    if (val == 0) return 0;  // colinear
  
    return (val > 0)? 1: 2; // clock or counterclock wise
}
  
// Driver program to test above functions
int main()
{
    Point p1 = {0, 0}, p2 = {4, 4}, p3 = {1, 2};
    int o = orientation(p1, p2, p3);
    if (o==0)         cout << "Linear";
    else if (o == 1)  cout << "Clockwise";
    else              cout << "CounterClockwise";
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// JAVA Code to find Orientation of 3
// ordered points
class Point
{
    int x, y;
    Point(int x,int y){
        this.x=x;
        this.y=y;
    }
}
  
class GFG {
      
    // To find orientation of ordered triplet 
    // (p1, p2, p3). The function returns 
    // following values 
    // 0 --> p, q and r are colinear
    // 1 --> Clockwise
    // 2 --> Counterclockwise
    public static int orientation(Point p1, Point p2,
                                         Point p3)
    {
        // See 10th slides from following link 
        // for derivation of the formula
        int val = (p2.y - p1.y) * (p3.x - p2.x) -
                  (p2.x - p1.x) * (p3.y - p2.y);
       
        if (val == 0) return 0// colinear
       
        // clock or counterclock wise
        return (val > 0)? 1: 2
    }
      
    /* Driver program to test above function */
    public static void main(String[] args) 
    {
            Point p1 = new Point(0, 0);
            Point p2 = new Point(4, 4);
            Point p3 = new Point(1, 2);
              
            int o = orientation(p1, p2, p3);
              
            if (o==0)     
            System.out.print("Linear");
            else if (o == 1)  
            System.out.print("Clockwise");
            else              
            System.out.print("CounterClockwise");
          
    }
}
  
//This code is contributed by Arnav Kr. Mandal.

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# A Python3 program to find orientation of 3 points
class Point:
      
    # to store the x and y coordinates of a point
    def __init__(self, x, y):
        self.x = x
        self.y = y
  
def orientation(p1, p2, p3):
      
    # to find the orientation of 
    # an ordered triplet (p1,p2,p3)
    # function returns the following values:
    # 0 : Colinear points
    # 1 : Clockwise points
    # 2 : Counterclockwise
    val = (float(p2.y - p1.y) * (p3.x - p2.x)) - \
           (float(p2.x - p1.x) * (p3.y - p2.y))
    if (val > 0):
          
        # Clockwise orientation
        return 1
    elif (val < 0):
          
        # Counterclockwise orientation
        return 2
    else:
          
        # Colinear orientation
        return 0
  
# Driver code
p1 = Point(0, 0)
p2 = Point(4, 4)
p3 = Point(1, 2)
  
o = orientation(p1, p2, p3)
  
if (o == 0):
    print("Linear")
elif (o == 1):
    print("Clockwise")
else:
    print("CounterClockwise")
      
# This code is contributed by Ansh Riyal

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# Code to find Orientation of 3
// ordered points
using System;
public class Point
{
    public int x, y;
    public Point(int x,int y)
    {
        this.x = x;
        this.y = y;
    }
}
  
class GFG 
{
      
    // To find orientation of ordered triplet 
    // (p1, p2, p3). The function returns 
    // following values 
    // 0 --> p, q and r are colinear
    // 1 --> Clockwise
    // 2 --> Counterclockwise
    public static int orientation(Point p1, Point p2,
                                        Point p3)
    {
        // See 10th slides from following link 
        // for derivation of the formula
        int val = (p2.y - p1.y) * (p3.x - p2.x) -
                (p2.x - p1.x) * (p3.y - p2.y);
      
        if (val == 0) return 0; // colinear
      
        // clock or counterclock wise
        return (val > 0)? 1: 2; 
    }
      
    /* Driver program to test above function */<strong>
    public static void Main(String[] args) 
    {
            Point p1 = new Point(0, 0);
            Point p2 = new Point(4, 4);
            Point p3 = new Point(1, 2);
              
            int o = orientation(p1, p2, p3);
              
            if (o == 0)     
                Console.WriteLine("Linear");
            else if (o == 1) 
                Console.WriteLine("Clockwise");
            else            
                Console.WriteLine("CounterClockwise");
          
    }
}
  
/* This code contributed by PrinciRaj1992 */

chevron_right



Output:

CounterClockwise

The concept of orientation is used in below articles:
Find Simple Closed Path for a given set of points
How to check if two given line segments intersect?
Convex Hull | Set 1 (Jarvis’s Algorithm or Wrapping)
Convex Hull | Set 2 (Graham Scan)

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.




My Personal Notes arrow_drop_up

Improved By : princiraj1992, anshrco18

Article Tags :
Practice Tags :


6


Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.