Open In App

Check whether a given point lies inside a rectangle or not

Improve
Improve
Improve
Like Article
Like
Save Article
Save
Share
Report issue
Report

Given four points of a rectangle, and one more point P. Write a function to check whether P lies within the given rectangle or not.
Examples: 
 

Input : R = [(10, 10), (10, -10), 
(-10, -10), (-10, 10)]
P = (0, 0)
Output : yes
Illustration :

Check whether a given point lies inside a rectangle or not

Input : R = [(10, 10), (10, -10),
(-10, -10), (-10, 10)],
P = (20, 20)
Output : no
Illustration :

Check whether a given point lies inside a rectangle or not

 

Prerequisite: Check whether a given point lies inside a triangle or not
Approach : Let the coordinates of four corners be A(x1, y1), B(x2, y2), C(x3, y3) and D(x4, y4). And coordinates of the given point P be (x, y)
1) Calculate area of the given rectangle, i.e., area of the rectangle ABCD as area of triangle ABC + area of triangle ACD. 
Area A = [ x1(y2 – y3) + x2(y3 – y1) + x3(y1-y2)]/2 + [ x1(y4 – y3) + x4(y3 – y1) + x3(y1-y4)]/2 
2) Calculate area of the triangle PAB as A1. 
3) Calculate area of the triangle PBC as A2. 
4) Calculate area of the triangle PCD as A3. 
5) Calculate area of the triangle PAD as A4. 
6) If P lies inside the triangle, then A1 + A2 + A3 + A4 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 rectangle formed by A(x1, y1),
   B(x2, y2), C(x3, y3) and D(x4, y4) */
bool check(int x1, int y1, int x2, int y2, int x3,
             int y3, int x4, int y4, int x, int y)
{
    /* Calculate area of rectangle ABCD */
    float A = area(x1, y1, x2, y2, x3, y3) +
              area(x1, y1, x4, y4, x3, y3);
 
    /* Calculate area of triangle PAB */
    float A1 = area(x, y, x1, y1, x2, y2);
 
    /* Calculate area of triangle PBC */
    float A2 = area(x, y, x2, y2, x3, y3);
 
    /* Calculate area of triangle PCD */
    float A3 = area(x, y, x3, y3, x4, y4);
 
    /* Calculate area of triangle PAD */
    float A4 = area(x, y, x1, y1, x4, y4);
 
    /* Check if sum of A1, A2, A3 and A4
       is same as A */
    return (A == A1 + A2 + A3 + A4);
}
 
/* Driver program to test above function */
int main()
{
    /* Let us check whether the point P(10, 15)
      lies inside the rectangle formed by A(0, 10),
      B(10, 0) C(0, -10) D(-10, 0) */
    if (check(0, 10, 10, 0, 0, -10, -10, 0, 10, 15))
        cout << "yes";
    else
        cout << "no";
    return 0;
}


Java




class GFG
{
    /* A utility function to calculate area of
    triangle formed by (x1, y1), (x2, y2) and
    (x3, y3) */
    static float area(int x1, int y1, int x2,
                        int y2, int x3, int y3)
    {
        return (float)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 rectangle formed by A(x1, y1),
    B(x2, y2), C(x3, y3) and D(x4, y4) */
    static boolean check(int x1, int y1, int x2, int y2,
    int x3, int y3, int x4, int y4, int x, int y)
    {
         
        /* Calculate area of rectangle ABCD */
        float A = area(x1, y1, x2, y2, x3, y3)+
                area(x1, y1, x4, y4, x3, y3);
     
        /* Calculate area of triangle PAB */
        float A1 = area(x, y, x1, y1, x2, y2);
     
        /* Calculate area of triangle PBC */
        float A2 = area(x, y, x2, y2, x3, y3);
     
        /* Calculate area of triangle PCD */
        float A3 = area(x, y, x3, y3, x4, y4);
     
        /* Calculate area of triangle PAD */
        float A4 = area(x, y, x1, y1, x4, y4);
     
        /* Check if sum of A1, A2, A3 and A4
        is same as A */
        return (A == A1 + A2 + A3 + A4);
    }
     
    // Driver code
    public static void main (String[] args)
    {
         
        /* Let us check whether the point P(10, 15)
        lies inside the rectangle formed by A(0, 10),
        B(10, 0) C(0, -10) D(-10, 0) */
        if (check(0, 10, 10, 0, 0, -10, -10, 0, 10, 15))
            System.out.print("yes");
        else
            System.out.print("no");
    }
}
 
// This code is contributed by Anant Agarwal.


Python3




# 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 rectangle
# formed by A(x1, y1), B(x2, y2),
# C(x3, y3) and D(x4, y4)
def check(x1, y1, x2, y2, x3,
          y3, x4, y4, x, y):
               
    # Calculate area of rectangle ABCD
    A = (area(x1, y1, x2, y2, x3, y3) +
         area(x1, y1, x4, y4, x3, y3))
 
    # Calculate area of triangle PAB
    A1 = area(x, y, x1, y1, x2, y2)
 
    # Calculate area of triangle PBC
    A2 = area(x, y, x2, y2, x3, y3)
 
    # Calculate area of triangle PCD
    A3 = area(x, y, x3, y3, x4, y4)
 
    # Calculate area of triangle PAD
    A4 = area(x, y, x1, y1, x4, y4);
 
    # Check if sum of A1, A2, A3
    # and A4 is same as A
    return (A == A1 + A2 + A3 + A4)
 
# Driver Code
if __name__ == '__main__':
     
    # Let us check whether the point
    # P(10, 15) lies inside the
    # rectangle formed by A(0, 10),
    # B(10, 0) C(0, -10) D(-10, 0)
    if (check(0, 10, 10, 0, 0, -10,
                    -10, 0, 10, 15)):
        print("yes")
    else:
        print("no")
 
# This code is contributed by
# Surendra_Gangwar


C#




// C# program to Check whether a given
// point lies inside a rectangle or not
using System;
 
class GFG {
     
    // A utility function to calculate area
    // of triangle formed by (x1, y1),
    // (x2, y2) and (x3, y3)
    static float area(int x1, int y1, int x2,
                      int y2, int x3, int y3)
    {
        return (float)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 rectangle formed by A(x1, y1),
    // B(x2, y2), C(x3, y3) and D(x4, y4)
    static bool check(int x1, int y1, int x2,
                      int y2, int x3, int y3,
                   int x4, int y4, int x, int y)
    {
         
        // Calculate area of rectangle ABCD
        float A = area(x1, y1, x2, y2, x3, y3) +
                  area(x1, y1, x4, y4, x3, y3);
     
        // Calculate area of triangle PAB
        float A1 = area(x, y, x1, y1, x2, y2);
     
        // Calculate area of triangle PBC
        float A2 = area(x, y, x2, y2, x3, y3);
     
        // Calculate area of triangle PCD
        float A3 = area(x, y, x3, y3, x4, y4);
     
        // Calculate area of triangle PAD
        float A4 = area(x, y, x1, y1, x4, y4);
     
        // Check if sum of A1, A2, A3 
        // and A4is same as A
        return (A == A1 + A2 + A3 + A4);
    }
     
    // Driver code
    public static void Main ()
    {
         
        // Let us check whether the point
        // P(10, 15) lies inside the rectangle
        // formed by A(0, 10), B(10, 0),
        // C(0, -10), D(-10, 0)
        if (check(0, 10, 10, 0, 0, -10, -10, 0, 10, 15))
            Console.Write("yes");
        else
            Console.Write("no");
    }
}
 
// This code is contributed by Nitin Mittal.


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 rectangle formed by A(x1, y1),
B(x2, y2), C(x3, y3) and D(x4, y4) */
function check(x1, y1, x2, y2, x3,
            y3, x4, y4, x, y)
{
    /* Calculate area of rectangle ABCD */
    let A = area(x1, y1, x2, y2, x3, y3) +
            area(x1, y1, x4, y4, x3, y3);
 
    /* Calculate area of triangle PAB */
    let A1 = area(x, y, x1, y1, x2, y2);
 
    /* Calculate area of triangle PBC */
    let A2 = area(x, y, x2, y2, x3, y3);
 
    /* Calculate area of triangle PCD */
    let A3 = area(x, y, x3, y3, x4, y4);
 
    /* Calculate area of triangle PAD */
    let A4 = area(x, y, x1, y1, x4, y4);
 
    /* Check if sum of A1, A2, A3 and A4
    is same as A */
    return (A == A1 + A2 + A3 + A4);
}
 
/* Driver program to test above function */
  
    /* Let us check whether the point P(10, 15)
    lies inside the rectangle formed by A(0, 10),
    B(10, 0) C(0, -10) D(-10, 0) */
    if (check(0, 10, 10, 0, 0, -10, -10, 0, 10, 15))
        document.write("yes");
    else
        document.write("no");
         
// This code is contributed by Mayank Tyagi
 
</script>


PHP




<?php
// PHP program to check whether a
// given point lies inside a
// rectangle or not
 
// 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 point P(x, y)
lies inside the rectangle
formed by A(x1, y1),
B(x2, y2), C(x3, y3)
and D(x4, y4) */
function check($x1, $y1, $x2, $y2, $x3,
               $y3, $x4, $y4, $x, $y)
{
    // Calculate area of rectangle ABCD
    $A = area($x1, $y1, $x2, $y2, $x3, $y3) +
         area($x1, $y1, $x4, $y4, $x3, $y3);
 
    // Calculate area of triangle PAB
    $A1 = area($x, $y, $x1, $y1, $x2, $y2);
 
    // Calculate area of triangle PBC
    $A2 = area($x, $y, $x2, $y2, $x3, $y3);
 
    // Calculate area of triangle PCD
    $A3 = area($x, $y, $x3, $y3, $x4, $y4);
 
    // Calculate area of triangle PAD
    $A4 = area($x, $y, $x1, $y1, $x4, $y4);
 
    // Check if sum of A1, A2,
    // A3 and A4  is same as A
    return ($A == $A1 + $A2 + $A3 + $A4);
}
 
// Driver Code
 
// Let us check whether
// the point P(10, 15)
// lies inside the rectangle
// formed by A(0, 10),
// B(10, 0) C(0, -10)
// D(-10, 0)
if (check(0, 10, 10, 0, 0, -10,
               -10, 0, 10, 15))
    echo "yes";
     
else
    echo "no";
     
// This code is contributed by vt_m.
?>


Output: 

no

Time complexity: O(1)

Auxiliary Space: O(1)

This article is contributed by Shivam Pradhan (anuj_charm).

Approach#2: Using the Point-in-Polygon Algorithm

One way to check if a point lies inside a rectangle is to use the point-in-polygon algorithm. In this case, we can consider the rectangle as a polygon with four vertices, and check if the point P lies inside this polygon.

Algorithm

1. Define a function point_in_rect(rect, p) that takes the rectangle vertices rect and point p as input.
2. Use the ray casting algorithm to determine if the point p lies inside the rectangle polygon:
a. Initialize a count variable to zero
b. For each edge of the polygon, check if it intersects the ray extending from the point p to infinity in the positive x direction
c. If the edge intersects the ray, increment the count
d. If the count is odd, the point lies inside the polygon; otherwise, it lies outside

C++




#include <iostream>
#include <vector>
using namespace std;
 
bool point_in_rect(vector<pair<int, int> >& rect,
                   pair<int, int>& p)
{
    int n = rect.size();
    bool inside = false;
    int j = n - 1;
    for (int i = 0; i < n; i++) {
        if ((rect[i].second > p.second)
            != (rect[j].second > p.second)) {
            if (p.first
                < (rect[j].first - rect[i].first)
                          * (p.second - rect[i].second)
                          / (rect[j].second
                             - rect[i].second)
                      + rect[i].first) {
                inside = !inside;
            }
        }
        j = i;
    }
    return inside;
}
 
int main()
{
    vector<pair<int, int> > R = {
        { 10, 10 }, { 10, -10 }, { -10, -10 }, { -10, 10 }
    };
    pair<int, int> P = { 0, 0 };
    cout << point_in_rect(R, P) << endl;
 
    R = {
        { 10, 10 }, { 10, -10 }, { -10, -10 }, { -10, 10 }
    };
    P = { 20, 20 };
    cout << point_in_rect(R, P) << endl;
 
    return 0;
}


Java




import java.util.*;
 
public class Main {
    // Function to check if a point lies inside a rectangle
    static boolean pointInRect(int[][] rect, int[] p)
    {
        int n = rect.length;
        boolean inside = false;
        int j = n - 1;
        for (int i = 0; i < n; i++) {
            if ((rect[i][1] > p[1]) != (rect[j][1] > p[1])
                && (p[0]
                    < (rect[j][0] - rect[i][0])
                              * (p[1] - rect[i][1])
                              / (rect[j][1] - rect[i][1])
                          + rect[i][0])) {
                inside = !inside;
            }
            j = i;
        }
        return inside;
    }
 
    public static void main(String[] args)
    {
        // Example usage
        int[][] R = { { 10, 10 },
                      { 10, -10 },
                      { -10, -10 },
                      { -10, 10 } };
        int[] P = { 0, 0 };
        System.out.println(pointInRect(R, P));
 
        int[] P2 = { 20, 20 };
        System.out.println(pointInRect(R2, P2));
    }
}


Python3




def point_in_rect(rect, p):
    n = len(rect)
    inside = False
    j = n - 1
    for i in range(n):
        if ((rect[i][1] > p[1]) != (rect[j][1] > p[1])) and \
           (p[0] < (rect[j][0] - rect[i][0]) * (p[1] - rect[i][1]) / (rect[j][1] - rect[i][1]) + rect[i][0]):
            inside = not inside
        j = i
    return inside
 
# Example usage
R = [(10, 10), (10, -10), (-10, -10), (-10, 10)]
P = (0, 0)
print(point_in_rect(R, P))
 
R = [(10, 10), (10, -10), (-10, -10), (-10, 10)]
P = (20, 20)
print(point_in_rect(R, P))


C#




using System;
 
public class GFG {
    // Function to check if a point lies inside a rectangle
    public static bool PointInRect(int[][] rect, int[] p)
    {
        int n = rect.Length;
        bool inside = false;
        int j = n - 1;
        for (int i = 0; i < n; i++) {
            if ((rect[i][1] > p[1]) != (rect[j][1] > p[1])
                && (p[0]
                    < (rect[j][0] - rect[i][0])
                              * (p[1] - rect[i][1])
                              / (rect[j][1] - rect[i][1])
                          + rect[i][0])) {
                inside = !inside;
            }
            j = i;
        }
        return inside;
    }
 
    public static void Main()
    {
        // Create a new array
        int[][] R = new int[][] { new int[] { 10, 10 },
                                  new int[] { 10, -10 },
                                  new int[] { -10, -10 },
                                  new int[] { -10, 10 } };
 
        // Check if the point (0, 0) lies inside the
        // rectangle R
        bool inside1
            = GFG.PointInRect(R, new int[] { 0, 0 });
 
        Console.WriteLine(inside1);
       
        // Check if the point (20,20) lies inside the
        // rectangle R
        bool inside2
            = GFG.PointInRect(R, new int[] { 20, 20 });
 
        Console.WriteLine(inside2);
    }
}
//This code is contributed by Rohit Singh


Javascript




// Javascript code addition
 
function point_in_rect(rect, p) {
    const n = rect.length;
    let inside = false;
    let j = n - 1;
    for (let i = 0; i < n; i++) {
        if ((rect[i][1] > p[1]) != (rect[j][1] > p[1])) {
            if (p[0] < (rect[j][0] - rect[i][0]) * (p[1] - rect[i][1]) / (rect[j][1] - rect[i][1]) + rect[i][0]) {
                inside = !inside;
            }
        }
        j = i;
    }
    return inside;
}
 
// Example usage
let R = [[10, 10], [10, -10], [-10, -10], [-10, 10]];
let P = [0, 0];
console.log(point_in_rect(R, P));
 
R = [[10, 10], [10, -10], [-10, -10], [-10, 10]];
P = [20, 20];
console.log(point_in_rect(R, P));
 
// The code is contributed by Nidhi goel.


Output

True
False






Time Complexity: O(n), where n is the number of edges in the polygon (in this case, n=4)
Space Complexity: O(1)



Last Updated : 29 Oct, 2023
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads