Saturday, November 16, 2024
Google search engine
HomeData Modelling & AICheck whether a given point lies inside a triangle or not

Check whether a given point lies inside a triangle or not

Given three corner points of a triangle, and one more point P. Write a function to check whether P lies within the triangle or not.

Example:

Input: A = (0, 0), B = (10, 30), C = (20, 0), P(10, 15)
Output: Inside
Explanation:
B(10,30)
/ \
/ \
/ \
/ P \ P'
/ \
A(0,0) ----------- C(20,0)
Input: A = (0, 0), B = (10, 30), C = (20, 0), P(30, 15)
Output: Outside
Explanation:
B(10,30)
/ \
/ \
/ \
/ \ P
/ \
A(0,0) ----------- C(20,0)

 

Solution: 
Let the coordinates of the three corners be (x1, y1), (x2, y2), and (x3, y3). And coordinates of the given point P be (x, y)

  1. Calculate the area of the given triangle, i.e., the area of the triangle ABC in the above diagram. 
    Area A = [ x1(y2 – y3) + x2(y3 – y1) + x3(y1-y2)]/2 
  2. Calculate the area of the triangle PAB. We can use the same formula for this. Let this area be A1. 
  3. Calculate the area of the triangle PBC. Let this area be A2. 
  4. Calculate the area of the triangle PAC. Let this area be A3. 
  5. If P lies inside the triangle, then A1 + A2 + A3 must be equal to A. 

C++




#include <bits/stdc++.h>
using namespace std;
  
/* A utility function to calculate area of triangle formed by (x1, y1),
   (x2, y2) and (x3, y3) */
float area(int x1, int y1, int x2, int y2, int x3, int y3)
{
   return abs((x1*(y2-y3) + x2*(y3-y1)+ x3*(y1-y2))/2.0);
}
  
/* A function to check whether point P(x, y) lies inside the triangle formed
   by A(x1, y1), B(x2, y2) and C(x3, y3) */
bool isInside(int x1, int y1, int x2, int y2, int x3, int y3, int x, int y)
{  
   /* Calculate area of triangle ABC */
   float A = area (x1, y1, x2, y2, x3, y3);
  
   /* Calculate area of triangle PBC */ 
   float A1 = area (x, y, x2, y2, x3, y3);
  
   /* Calculate area of triangle PAC */ 
   float A2 = area (x1, y1, x, y, x3, y3);
  
   /* Calculate area of triangle PAB */  
   float A3 = area (x1, y1, x2, y2, x, y);
    
   /* Check if sum of A1, A2 and A3 is same as A */
   return (A == A1 + A2 + A3);
}
  
/* Driver program to test above function */
int main()
{
   /* Let us check whether the point P(10, 15) lies inside the triangle
      formed by A(0, 0), B(20, 0) and C(10, 30) */
   if (isInside(0, 0, 20, 0, 10, 30, 10, 15))
     cout <<"Inside";
   else
     cout <<"Not Inside";
  
   return 0;
}
 
// this code is contributed by shivanisinghss2110


C




#include <stdio.h>
#include <math.h>
#include <stdbool.h>
#include <stdlib.h>
/* A utility function to calculate area of triangle formed by (x1, y1),
   (x2, y2) and (x3, y3) */
float area(int x1, int y1, int x2, int y2, int x3, int y3)
{
   return abs((x1*(y2-y3) + x2*(y3-y1)+ x3*(y1-y2))/2.0);
}
  
/* A function to check whether point P(x, y) lies inside the triangle formed
   by A(x1, y1), B(x2, y2) and C(x3, y3) */
bool isInside(int x1, int y1, int x2, int y2, int x3, int y3, int x, int y)
{  
   /* Calculate area of triangle ABC */
   float A = area (x1, y1, x2, y2, x3, y3);
  
   /* Calculate area of triangle PBC */ 
   float A1 = area (x, y, x2, y2, x3, y3);
  
   /* Calculate area of triangle PAC */ 
   float A2 = area (x1, y1, x, y, x3, y3);
  
   /* Calculate area of triangle PAB */  
   float A3 = area (x1, y1, x2, y2, x, y);
    
   /* Check if sum of A1, A2 and A3 is same as A */
   return (A == A1 + A2 + A3);
}
  
/* Driver program to test above function */
int main()
{
   /* Let us check whether the point P(10, 15) lies inside the triangle
      formed by A(0, 0), B(20, 0) and C(10, 30) */
   if (isInside(0, 0, 20, 0, 10, 30, 10, 15))
     printf ("Inside");
   else
     printf ("Not Inside");
  
   return 0;
}


Java




// JAVA Code for Check whether a given point
// lies inside a triangle or not
import java.util.*;
 
class GFG {
     
    /* A utility function to calculate area of triangle
       formed by (x1, y1) (x2, y2) and (x3, y3) */
    static double area(int x1, int y1, int x2, int y2,
                                        int x3, int y3)
    {
       return Math.abs((x1*(y2-y3) + x2*(y3-y1)+
                                    x3*(y1-y2))/2.0);
    }
      
    /* A function to check whether point P(x, y) lies
       inside the triangle formed by A(x1, y1),
       B(x2, y2) and C(x3, y3) */
    static boolean isInside(int x1, int y1, int x2,
                int y2, int x3, int y3, int x, int y)
    {  
       /* Calculate area of triangle ABC */
        double A = area (x1, y1, x2, y2, x3, y3);
      
       /* Calculate area of triangle PBC */ 
        double A1 = area (x, y, x2, y2, x3, y3);
      
       /* Calculate area of triangle PAC */ 
        double A2 = area (x1, y1, x, y, x3, y3);
      
       /* Calculate area of triangle PAB */  
        double A3 = area (x1, y1, x2, y2, x, y);
        
       /* Check if sum of A1, A2 and A3 is same as A */
        return (A == A1 + A2 + A3);
    }
     
    /* Driver program to test above function */
    public static void main(String[] args)
    {
        /* Let us check whether the point P(10, 15)
           lies inside the triangle formed by
           A(0, 0), B(20, 0) and C(10, 30) */
       if (isInside(0, 0, 20, 0, 10, 30, 10, 15))
           System.out.println("Inside");
       else
           System.out.println("Not Inside");
             
    }
}
 
// This code is contributed by Arnav Kr. Mandal.


Python




# A utility function to calculate area
# of triangle formed by (x1, y1),
# (x2, y2) and (x3, y3)
 
def area(x1, y1, x2, y2, x3, y3):
 
    return abs((x1 * (y2 - y3) + x2 * (y3 - y1)
                + x3 * (y1 - y2)) / 2.0)
 
 
# A function to check whether point P(x, y)
# lies inside the triangle formed by
# A(x1, y1), B(x2, y2) and C(x3, y3)
def isInside(x1, y1, x2, y2, x3, y3, x, y):
 
    # Calculate area of triangle ABC
    A = area (x1, y1, x2, y2, x3, y3)
 
    # Calculate area of triangle PBC
    A1 = area (x, y, x2, y2, x3, y3)
     
    # Calculate area of triangle PAC
    A2 = area (x1, y1, x, y, x3, y3)
     
    # Calculate area of triangle PAB
    A3 = area (x1, y1, x2, y2, x, y)
     
    # Check if sum of A1, A2 and A3
    # is same as A
    if(A == A1 + A2 + A3):
        return True
    else:
        return False
 
# Driver program to test above function
# Let us check whether the point P(10, 15)
# lies inside the triangle formed by
# A(0, 0), B(20, 0) and C(10, 30)
if (isInside(0, 0, 20, 0, 10, 30, 10, 15)):
    print('Inside')
else:
    print('Not Inside')
 
# This code is contributed by Danish Raza


C#




// C# Code to Check whether a given point
// lies inside a triangle or not
using System;
 
class GFG {
 
    /* A utility function to calculate area of triangle
    formed by (x1, y1) (x2, y2) and (x3, y3) */
    static double area(int x1, int y1, int x2,
                       int y2, int x3, int y3)
    {
        return Math.Abs((x1 * (y2 - y3) +
                         x2 * (y3 - y1) +
                         x3 * (y1 - y2)) / 2.0);
    }
 
    /* A function to check whether point P(x, y) lies
    inside the triangle formed by A(x1, y1),
    B(x2, y2) and C(x3, y3) */
    static bool isInside(int x1, int y1, int x2,
                         int y2, int x3, int y3,
                         int x, int y)
    {
        /* Calculate area of triangle ABC */
        double A = area(x1, y1, x2, y2, x3, y3);
 
        /* Calculate area of triangle PBC */
        double A1 = area(x, y, x2, y2, x3, y3);
 
        /* Calculate area of triangle PAC */
        double A2 = area(x1, y1, x, y, x3, y3);
 
        /* Calculate area of triangle PAB */
        double A3 = area(x1, y1, x2, y2, x, y);
 
        /* Check if sum of A1, A2 and A3 is same as A */
        return (A == A1 + A2 + A3);
    }
 
/* Driver program to test above function */
public static void Main()
{
    /* Let us check whether the point P(10, 15)
    lies inside the triangle formed by
    A(0, 0), B(20, 0) and C(10, 30) */
    if (isInside(0, 0, 20, 0, 10, 30, 10, 15))
        Console.WriteLine("Inside");
    else
        Console.WriteLine("Not Inside");
}
}
 
// This code is contributed by vt_m.


Javascript




<script>
 
/* A utility function to calculate area of triangle formed by (x1, y1),
(x2, y2) and (x3, y3) */
function area(x1, y1, x2, y2, x3, y3)
{
return Math.abs((x1*(y2-y3) + x2*(y3-y1)+ x3*(y1-y2))/2.0);
}
 
/* A function to check whether point P(x, y) lies inside the triangle formed
by A(x1, y1), B(x2, y2) and C(x3, y3) */
function isInside(x1, y1, x2, y2, x3, y3, x, y)
{
/* Calculate area of triangle ABC */
let A = area (x1, y1, x2, y2, x3, y3);
 
/* Calculate area of triangle PBC */
let A1 = area (x, y, x2, y2, x3, y3);
 
/* Calculate area of triangle PAC */
let A2 = area (x1, y1, x, y, x3, y3);
 
/* Calculate area of triangle PAB */   
let A3 = area (x1, y1, x2, y2, x, y);
     
/* Check if sum of A1, A2 and A3 is same as A */
return (A == A1 + A2 + A3);
}
 
/* Driver program to test above function */
  
/* Let us check whether the point P(10, 15) lies inside the triangle
    formed by A(0, 0), B(20, 0) and C(10, 30) */
if (isInside(0, 0, 20, 0, 10, 30, 10, 15))
    document.write("Inside");
else
    document.write("Not Inside");
 
// This code is contributed by Mayank Tyagi
 
</script>


PHP




<?php
 
/* A utility function to calculate
  area of triangle formed by (x1, y1),
  (x2, y2) and (x3, y3) */
function area($x1, $y1, $x2,
              $y2, $x3, $y3)
{
    return abs(($x1 * ($y2 - $y3) +
                $x2 * ($y3 - $y1) + 
                $x3 * ($y1 - $y2)) / 2.0);
}
 
/* A function to check whether
   P(x, y) lies inside the
   triangle formed by A(x1, y1),
   B(x2, y2) and C(x3, y3) */
function isInside($x1, $y1, $x2, $y2,
                  $x3, $y3, $x, $y)
{
     
    /* Calculate area of triangle ABC */
    $A = area ($x1, $y1, $x2, $y2, $x3, $y3);
     
    /* Calculate area of triangle PBC */
    $A1 = area ($x, $y, $x2, $y2, $x3, $y3);
     
    /* Calculate area of triangle PAC */
    $A2 = area ($x1, $y1, $x, $y, $x3, $y3);
     
    /* Calculate area of triangle PAB */
    $A3 = area ($x1, $y1, $x2, $y2, $x, $y);
     
    /* Check if sum of A1, A2
    and A3 is same as A */
    return ($A == $A1 + $A2 + $A3);
}
 
    // Driver Code
    /* Let us check whether the
       P(10, 15) lies inside the
       triangle formed by A(0, 0),
       B(20, 0) and C(10, 30) */
    if (isInside(0, 0, 20, 0, 10, 30, 10, 15))
        echo "Inside";
    else
        echo "Not Inside";
 
 
// This code is contributed by anuj_67.
?>


Output

Inside

Time Complexity: O(1)
Auxiliary Space: O(1)

Exercise: Given coordinates of four corners of a rectangle, and a point P. Write a function to check whether P lies inside the given rectangle or not.

Another Approach – Using Barycentric Coordinate Method: Below is the algorithm to check if a point P lies inside a triangle ABC using the Barycentric Coordinate Method:

  • Define a function “isInsideTriangle” that takes four input parameters: A, B, C, and P.
  • Calculate the barycentric coordinates of point P with respect to the triangle ABC. To do this, we first need to calculate the area of the triangle ABC. We can use the cross product to find the area of the triangle ABC as:

Area(ABC) = 0.5 * ||AB x AC||, where ||AB x AC|| is the magnitude of the cross product of vectors AB and AC.

  • Then, we can calculate the barycentric coordinates of point P as:
    1. a = 0.5 * ||PB x PC|| / Area(ABC)
    2. b = 0.5 * ||PC x PA|| / Area(ABC)
    3. c = 0.5 * ||PA x PB|| / Area(ABC), where PB, PC, and PA are vectors from point P to vertices B, C, and A, respectively.
  • If all three barycentric coordinates are non-negative, then the point P lies inside the triangle ABC. Return “Inside”. Otherwise, point P lies outside the triangle ABC. Return “Outside”.

Below is the implementation of the above approach:

C++




// c++ code addition
 
#include<iostream>
#include<vector>
using namespace std;
 
// Function to check if the point is inside
// the triangle or not
string isInsideTriangle(vector<int> A, vector<int> B, vector<int> C, vector<int> P) {
    // Calculate the barycentric coordinates
    // of point P with respect to triangle ABC
    double denominator = ((B[1] - C[1]) * (A[0] - C[0]) + (C[0] - B[0]) * (A[1] - C[1]));
    double a = ((B[1] - C[1]) * (P[0] - C[0]) + (C[0] - B[0]) * (P[1] - C[1])) / denominator;
    double b = ((C[1] - A[1]) * (P[0] - C[0]) + (A[0] - C[0]) * (P[1] - C[1])) / denominator;
    double c = 1 - a - b;
 
    // Check if all barycentric coordinates
    // are non-negative
    if (a >= 0 && b >= 0 && c >= 0) {
        return "Inside";
    } else {
        return "Outside";
    }
}
 
// Driver Code
int main() {
    vector<int> A = {0, 0};
    vector<int> B = {10, 30};
    vector<int> C = {20, 0};
    vector<int> P = {10, 15};
 
    // Call the isInsideTriangle function with
    // the given inputs
    string result = isInsideTriangle(A, B, C, P);
 
    // Print the result
    cout << result << endl;
    return 0;
}
 
// The code is contributed by Arushi Goel.


Java




import java.awt.Point;
 
class Main
{
 
  // Function to check if the point is inside
  // the triangle or not
  public static String isInsideTriangle(Point A, Point B, Point C, Point P)
  {
 
    // Calculate the barycentric coordinates
    // of point P with respect to triangle ABC
    double denominator = ((B.y - C.y) * (A.x - C.x) +
                          (C.x - B.x) * (A.y - C.y));
    double a = ((B.y - C.y) * (P.x - C.x) +
                (C.x - B.x) * (P.y - C.y)) / denominator;
    double b = ((C.y - A.y) * (P.x - C.x) +
                (A.x - C.x) * (P.y - C.y)) / denominator;
    double c = 1 - a - b;
 
    // Check if all barycentric coordinates
    // are non-negative
    if (a >= 0 && b >= 0 && c >= 0) {
      return "Inside";
    } else {
      return "Outside";
    }
  }
 
  public static void main(String[] args) {
    Point A = new Point(0, 0);
    Point B = new Point(10, 30);
    Point C = new Point(20, 0);
    Point P = new Point(10, 15);
 
    // Call the isInsideTriangle function with
    // the given inputs
    String result = isInsideTriangle(A, B, C, P);
 
    // Print the result
    System.out.println(result);
  }
}


Python3




# Python program for the above approach
 
# Function to check if the point is inside
# the triangle or not
def isInsideTriangle(A, B, C, P):
 
    # Calculate the barycentric coordinates
    # of point P with respect to triangle ABC
    denominator = ((B[1] - C[1]) * (A[0] - C[0]) +
                   (C[0] - B[0]) * (A[1] - C[1]))
    a = ((B[1] - C[1]) * (P[0] - C[0]) +
         (C[0] - B[0]) * (P[1] - C[1])) / denominator
    b = ((C[1] - A[1]) * (P[0] - C[0]) +
         (A[0] - C[0]) * (P[1] - C[1])) / denominator
    c = 1 - a - b
 
    # Check if all barycentric coordinates
    # are non-negative
    if a >= 0 and b >= 0 and c >= 0:
        return "Inside"
    else:
        return "Outside"
 
 
# Driver Code
A = (0, 0)
B = (10, 30)
C = (20, 0)
P = (10, 15)
 
# Call the isInsideTriangle function with
# the given inputs
result = isInsideTriangle(A, B, C, P)
 
# Print the result
print(result)


C#




using System;
 
public class PointInsideTriangle
{
    // Function to check if the point is inside
    // the triangle or not
    public static string IsInsideTriangle(int[] A, int[] B, int[] C, int[] P)
    {
        // Calculate the barycentric coordinates
        // of point P with respect to triangle ABC
        double denominator = ((B[1] - C[1]) * (A[0] - C[0]) + (C[0] - B[0]) * (A[1] - C[1]));
        double a = ((B[1] - C[1]) * (P[0] - C[0]) + (C[0] - B[0]) * (P[1] - C[1])) / denominator;
        double b = ((C[1] - A[1]) * (P[0] - C[0]) + (A[0] - C[0]) * (P[1] - C[1])) / denominator;
        double c = 1 - a - b;
 
        // Check if all barycentric coordinates
        // are non-negative
        if (a >= 0 && b >= 0 && c >= 0)
        {
            return "Inside";
        }
        else
        {
            return "Outside";
        }
    }
 
    // Driver Code
    public static void Main(string[] args)
    {
        int[] A = { 0, 0 };
        int[] B = { 10, 30 };
        int[] C = { 20, 0 };
        int[] P = { 10, 15 };
 
        // Call the IsInsideTriangle function with
        // the given inputs
        string result = IsInsideTriangle(A, B, C, P);
 
        // Print the result
        Console.WriteLine(result);
    }
}


Javascript




// JavaScript program for the above approach
 
// Function to check if the point is inside
// the triangle or not
function isInsideTriangle(A, B, C, P) {
// Calculate the barycentric coordinates
// of point P with respect to triangle ABC
let denominator = ((B[1] - C[1]) * (A[0] - C[0]) +
               (C[0] - B[0]) * (A[1] - C[1]));
let a = ((B[1] - C[1]) * (P[0] - C[0]) +
     (C[0] - B[0]) * (P[1] - C[1])) / denominator;
let b = ((C[1] - A[1]) * (P[0] - C[0]) +
     (A[0] - C[0]) * (P[1] - C[1])) / denominator;
let c = 1 - a - b;
 
// Check if all barycentric coordinates
// are non-negative
if (a >= 0 && b >= 0 && c >= 0) {
    return "Inside";
} else {
    return "Outside";
}
}
 
// Driver Code
let A = [0, 0];
let B = [10, 30];
let C = [20, 0];
let P = [10, 15];
 
// Call the isInsideTriangle function with
// the given inputs
let result = isInsideTriangle(A, B, C, P);
 
// Print the result
console.log(result);


Output

Inside

Time Complexity: O(1)
Auxiliary Space: O(1)

Feeling lost in the world of random DSA topics, wasting time without progress? It’s time for a change! Join our DSA course, where we’ll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!

RELATED ARTICLES

Most Popular

Recent Comments