Check whether a given point lies inside a rectangle or not

Last Updated : 29 Oct, 2023

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 : yesIllustration : `

`Input : R = [(10, 10), (10, -10),             (-10, -10), (-10, 10)],        P = (20, 20)Output : noIllustration : `

` `

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 ` `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

 ``

PHP

 ``

Output:

`no`

Time complexity: O(1)

Auxiliary Space: O(1)

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 ` `#include ` `using` `namespace` `std;`   `bool` `point_in_rect(vector >& 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 > 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)

Previous
Next