Find if a point lies inside, outside or on the circumcircle of three points A, B, C

Given four non-collinear points A, B, C, and P. The task is to find whether point P lies inside, outside or on the circumcircle formed by points A, B, and C.

Examples

Input: A = {2, 8}, B = {2, 1}, C = {4, 5}, P = {2, 4};
Output: Point (2, 4) is inside the circumcircle.

Input: A = {2, 8}, B = {2, 1}, C = {4, 5}, P = {3, 0};
Output: Point (3, 0) lies outside the circumcircle.

Approach:



  1. Find the Circumcentre of the triangle formed by the points A, B, and C by the approach discussed in this article.
  2. After getting the points of the circumcentre in the above step, find the radius of the circumcentre by calculating the distance between the circumcentre and one of the points of A, B, or C using the below formula:
    For Point A = (x, y) and Point B = (a, b)
    The distance between points A and B is given by:- 
    distance = sqrt((x - a)2 + (y - b)2)
    
  3. Since we know the radius and circumcentre of the circle and coordinates of point P, find the location of point P by using the approach discussed in this article.

Below is the implementation of the above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program to find the points
// which lies inside, outside or
// on the circle
#include <bits/stdc++.h>
using namespace std;
  
// Structure Pointer to
// store x and y coordinates
struct point {
    double x, y;
};
  
// Function to find the line given
// two points
void lineFromPoints(point P, point Q,
                    double& a, double& b,
                    double& c)
{
    a = Q.y - P.y;
    b = P.x - Q.x;
    c = a * (P.x) + b * (P.y);
}
  
// Function which converts the
// input line to its perpendicular
// bisector. It also inputs the
// points whose mid-point lies o
// on the bisector
void perpenBisectorFromLine(point P, point Q,
                            double& a, double& b,
                            double& c)
{
  
    // Find the mid point
    point mid_point;
  
    // x coordinates
    mid_point.x = (P.x + Q.x) / 2;
  
    // y coordinates
    mid_point.y = (P.y + Q.y) / 2;
  
    // c = -bx + ay
    c = -b * (mid_point.x)
        + a * (mid_point.y);
  
    // Assign the coefficient of
    // a and b
    double temp = a;
    a = -b;
    b = temp;
}
  
// Returns the intersection point of
// two lines
double LineInterX(double a1, double b1,
                  double c1, double a2,
                  double b2, double c2)
{
  
    // Find determinant
    double determ = a1 * b2 - a2 * b1;
  
    double x = (b2 * c1 - b1 * c2);
    x /= determ;
  
    return x;
}
  
// Returns the intersection point of
// two lines
double LineInterY(double a1, double b1,
                  double c1, double a2,
                  double b2, double c2)
{
  
    // Find determinant
    double determ = a1 * b2 - a2 * b1;
  
    double y = (a1 * c2 - a2 * c1);
    y /= determ;
  
    return y;
}
  
// Function to find the point
// lies inside, outside or on
// the circle
void findPosition(point P, point Q,
                  point R, point D)
{
  
    // Store the coordinates
    // radius of circumcircle
    point r;
  
    // Line PQ is represented
    // as ax + by = c
    double a, b, c;
    lineFromPoints(P, Q, a, b, c);
  
    // Line QR is represented
    // as ex + fy = g
    double e, f, g;
    lineFromPoints(Q, R, e, f, g);
  
    // Converting lines PQ and QR
    // to perpendicular bisectors.
    // After this, L = ax + by = c
    // M = ex + fy = g
    perpenBisectorFromLine(P, Q, a, b, c);
    perpenBisectorFromLine(Q, R, e, f, g);
  
    // The point of intersection
    // of L and M gives r as the
    // circumcenter
    r.x = LineInterX(a, b, c, e, f, g);
    r.y = LineInterY(a, b, c, e, f, g);
  
    // Length of radius
    double q = (r.x - P.x) * (r.x - P.x)
               + (r.y - P.y) * (r.y - P.y);
  
    // Distance between radius
    // and the given point D
    double dis = (r.x - D.x) * (r.x - D.x)
                 + (r.y - D.y) * (r.y - D.y);
  
    // Condition for point lies
    // inside circumcircle
    if (dis < q) {
        cout << "Point (" << D.x << ", "
             << D.y << ") is inside "
             << "the circumcircle";
    }
  
    // Condition for point lies
    // on circumcircle
    else if (dis == q) {
        cout << "Point (" << D.x << ", "
             << D.y << ") lies on the "
             << "circumcircle";
    }
  
    // Condition for point lies
    // outside circumcircle
    else {
        cout << "Point (" << D.x << ", "
             << D.y << ") lies outside"
             << " the circumcircle";
    }
}
  
// Driver Code
int main()
{
    point A, B, C, D;
  
    // Given Points
    A = { 2, 8 };
    B = { 2, 1 };
    C = { 4, 5 };
    D = { 3, 0 };
  
    // Function call to find
    // the point lies inside,
    // outside or on the
    // circle
    findPosition(A, B, C, D);
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program to find the points
// which lies inside, outside or
// on the circle
class GFG{
   
// Structure Pointer to
// store x and y coordinates
static class point {
    double x, y;
    public point() {
    }
    public point(double x, double y) {
        this.x = x;
        this.y = y;
    }
      
};
   
// Function to find the line given
// two points
static void lineFromPoints(point P, point Q,
                    double a, double b,
                    double c)
{
    a = Q.y - P.y;
    b = P.x - Q.x;
    c = a * (P.x) + b * (P.y);
}
   
// Function which converts the
// input line to its perpendicular
// bisector. It also inputs the
// points whose mid-point lies o
// on the bisector
static void perpenBisectorFromLine(point P, point Q,
                            double a, double b,
                            double c)
{
   
    // Find the mid point
    point mid_point = new point();
   
    // x coordinates
    mid_point.x = (P.x + Q.x) / 2;
   
    // y coordinates
    mid_point.y = (P.y + Q.y) / 2;
   
    // c = -bx + ay
    c = -b * (mid_point.x)
        + a * (mid_point.y);
   
    // Assign the coefficient of
    // a and b
    double temp = a;
    a = -b;
    b = temp;
}
   
// Returns the intersection point of
// two lines
static double LineInterX(double a1, double b1,
                  double c1, double a2,
                  double b2, double c2)
{
   
    // Find determinant
    double determ = a1 * b2 - a2 * b1;
   
    double x = (b2 * c1 - b1 * c2);
    x /= determ;
   
    return x;
}
   
// Returns the intersection point of
// two lines
static double LineInterY(double a1, double b1,
                  double c1, double a2,
                  double b2, double c2)
{
   
    // Find determinant
    double determ = a1 * b2 - a2 * b1;
   
    double y = (a1 * c2 - a2 * c1);
    y /= determ;
   
    return y;
}
   
// Function to find the point
// lies inside, outside or on
// the circle
static void findPosition(point P, point Q,
                  point R, point D)
{
   
    // Store the coordinates
    // radius of circumcircle
    point r = new point();
   
    // Line PQ is represented
    // as ax + by = c
    double a = 0, b = 0, c = 0;
    lineFromPoints(P, Q, a, b, c);
   
    // Line QR is represented
    // as ex + fy = g
    double e = 0, f = 0, g = 0;
    lineFromPoints(Q, R, e, f, g);
   
    // Converting lines PQ and QR
    // to perpendicular bisectors.
    // After this, L = ax + by = c
    // M = ex + fy = g
    perpenBisectorFromLine(P, Q, a, b, c);
    perpenBisectorFromLine(Q, R, e, f, g);
   
    // The point of intersection
    // of L and M gives r as the
    // circumcenter
    r.x = LineInterX(a, b, c, e, f, g);
    r.y = LineInterY(a, b, c, e, f, g);
   
    // Length of radius
    double q = (r.x - P.x) * (r.x - P.x)
               + (r.y - P.y) * (r.y - P.y);
   
    // Distance between radius
    // and the given point D
    double dis = (r.x - D.x) * (r.x - D.x)
                 + (r.y - D.y) * (r.y - D.y);
   
    // Condition for point lies
    // inside circumcircle
    if (dis < q) {
        System.out.print("Point (" +  D.x+ ", "
             + D.y+ ") is inside "
            + "the circumcircle");
    }
   
    // Condition for point lies
    // on circumcircle
    else if (dis == q) {
        System.out.print("Point (" +  D.x+ ", "
             + D.y+ ") lies on the "
            + "circumcircle");
    }
   
    // Condition for point lies
    // outside circumcircle
    else {
        System.out.print("Point (" +  D.x+ ", "
             + D.y+ ") lies outside"
            + " the circumcircle");
    }
}
   
// Driver Code
public static void main(String[] args)
{
    point A, B, C, D;
   
    // Given Points
    A = new point(2, 8 );
    B = new point(2, 1 );
    C = new point(4, 5 );
    D = new point(3, 0 );
   
    // Function call to find
    // the point lies inside,
    // outside or on the
    // circle
    findPosition(A, B, C, D);
}
}
  
// This code is contributed by Rajput-Ji

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program to find the points
// which lies inside, outside or
// on the circle
using System;
  
class GFG{
    
// Structure Pointer to
// store x and y coordinates
class point {
    public double x, y;
    public point() {
    }
    public point(double x, double y) {
        this.x = x;
        this.y = y;
    }
       
};
    
// Function to find the line given
// two points
static void lineFromPoints(point P, point Q,
                    double a, double b,
                    double c)
{
    a = Q.y - P.y;
    b = P.x - Q.x;
    c = a * (P.x) + b * (P.y);
}
    
// Function which converts the
// input line to its perpendicular
// bisector. It also inputs the
// points whose mid-point lies o
// on the bisector
static void perpenBisectorFromLine(point P, point Q,
                            double a, double b,
                            double c)
{
    
    // Find the mid point
    point mid_point = new point();
    
    // x coordinates
    mid_point.x = (P.x + Q.x) / 2;
    
    // y coordinates
    mid_point.y = (P.y + Q.y) / 2;
    
    // c = -bx + ay
    c = -b * (mid_point.x)
        + a * (mid_point.y);
    
    // Assign the coefficient of
    // a and b
    double temp = a;
    a = -b;
    b = temp;
}
    
// Returns the intersection point of
// two lines
static double LineInterX(double a1, double b1,
                  double c1, double a2,
                  double b2, double c2)
{
    
    // Find determinant
    double determ = a1 * b2 - a2 * b1;
    
    double x = (b2 * c1 - b1 * c2);
    x /= determ;
    
    return x;
}
    
// Returns the intersection point of
// two lines
static double LineInterY(double a1, double b1,
                  double c1, double a2,
                  double b2, double c2)
{
    
    // Find determinant
    double determ = a1 * b2 - a2 * b1;
    
    double y = (a1 * c2 - a2 * c1);
    y /= determ;
    
    return y;
}
    
// Function to find the point
// lies inside, outside or on
// the circle
static void findPosition(point P, point Q,
                  point R, point D)
{
    
    // Store the coordinates
    // radius of circumcircle
    point r = new point();
    
    // Line PQ is represented
    // as ax + by = c
    double a = 0, b = 0, c = 0;
    lineFromPoints(P, Q, a, b, c);
    
    // Line QR is represented
    // as ex + fy = g
    double e = 0, f = 0, g = 0;
    lineFromPoints(Q, R, e, f, g);
    
    // Converting lines PQ and QR
    // to perpendicular bisectors.
    // After this, L = ax + by = c
    // M = ex + fy = g
    perpenBisectorFromLine(P, Q, a, b, c);
    perpenBisectorFromLine(Q, R, e, f, g);
    
    // The point of intersection
    // of L and M gives r as the
    // circumcenter
    r.x = LineInterX(a, b, c, e, f, g);
    r.y = LineInterY(a, b, c, e, f, g);
    
    // Length of radius
    double q = (r.x - P.x) * (r.x - P.x)
               + (r.y - P.y) * (r.y - P.y);
    
    // Distance between radius
    // and the given point D
    double dis = (r.x - D.x) * (r.x - D.x)
                 + (r.y - D.y) * (r.y - D.y);
    
    // Condition for point lies
    // inside circumcircle
    if (dis < q) {
        Console.Write("Point (" +  D.x+ ", "
             + D.y+ ") is inside "
            + "the circumcircle");
    }
    
    // Condition for point lies
    // on circumcircle
    else if (dis == q) {
        Console.Write("Point (" +  D.x+ ", "
             + D.y+ ") lies on the "
            + "circumcircle");
    }
    
    // Condition for point lies
    // outside circumcircle
    else {
        Console.Write("Point (" +  D.x+ ", "
             + D.y+ ") lies outside"
            + " the circumcircle");
    }
}
    
// Driver Code
public static void Main(String[] args)
{
    point A, B, C, D;
    
    // Given Points
    A = new point(2, 8 );
    B = new point(2, 1 );
    C = new point(4, 5 );
    D = new point(3, 0 );
    
    // Function call to find
    // the point lies inside,
    // outside or on the
    // circle
    findPosition(A, B, C, D);
}
}
  
// This code is contributed by Rajput-Ji

chevron_right


Output:

Point (3, 0) lies outside the circumcircle

competitive-programming-img




My Personal Notes arrow_drop_up

Recommended Posts:

    Article Tags :
    Practice Tags :


    2


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