Given two 2D arrays rectangle[][] and triangle[][], representing the coordinates of vertices of a rectangle and a triangle respectively, and another array points[][] consisting of N coordinates, the task is to count the number of points that lies inside both the rectangle and the triangle.
Examples:
Input: rectangle[][] = {{1, 1}, {6, 1}, {6, 6}, {1, 6}}, triangle[][] = {{4, 4}, {0, 4}, {0, -2}}, points[][] = {{6, 5}, {2, 2}, {2, 1}, {5, 5}} Output: 2 Explanation:

From the above image, it is clear that the coordinates (2, 1) and (2, 2) lie inside both the given rectangle and triangle. Therefore, the count is 2.
Input: rectangle[][] = {{-2, -2}, {2, -2}, {2, 2}, {-2, 2}}, triangle[][] = {{0, 0}, {1, 1}, {-1, -1}}, points[][] = {{0, 2}, {-2, -2}, {2, -2}} Output: 2
Approach: The given problem can be solved based on the following observation:
Any three vertices of a rectangle can be connected to form a triangle. Therefore, the number of triangles possible from a given rectangle is 4.
Therefore, to solve the problem, the idea is to check if the given point lies inside the given triangle and any one of the four triangles obtained from the rectangle or not. Follow the steps below to solve the problem:
- Initialize four lists, say triangle1, triangle2, triangle3 and triangle4, to store the coordinates of the vertices of the four triangles possible from a rectangle.
- Populate the above initialized lists by considering three vertices of the rectangle at a time.
- Initialize a variable, say ans as 0, to store the number of points that lies inside the triangle as well as the rectangle.
- Traverse the array points[][] and check if there exists any point that lies inside any of the four obtained triangles as well as inside the given triangle or not. If found to be true, then increment ans by 1.
- After completing the above steps, print the value of ans as the resultant count.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int getArea( int x1, int y1, int x2, int y2, int x3, int y3)
{
return abs ((x1 * (y2 - y3) +
x2 * (y3 - y1) +
x3 * (y1 - y2)) / 2);
}
int isInside(vector<vector< int >> triangle, vector< int > point)
{
vector< int > A = triangle[0];
vector< int > B = triangle[1];
vector< int > C = triangle[2];
int x = point[0];
int y = point[1];
int ABC = getArea(A[0], A[1],
B[0], B[1],
C[0], C[1]);
int BPC = getArea(x, y, B[0],
B[1], C[0],
C[1]);
int APC = getArea(A[0], A[1], x,
y, C[0], C[1]);
int APB = getArea(A[0], A[1], B[0],
B[1], x, y);
return ABC == (APC + APB + BPC);
}
void countPoints(vector<vector< int >> rectangle,vector<vector< int >> triangle,vector<vector< int >> points){
int n = rectangle.size();
vector<vector< int >> triangle1;
for ( int i = 1; i < n; i++) triangle1.push_back(rectangle[i]);
vector<vector< int >> triangle2;
for ( int i = 0; i < 3; i++) triangle2.push_back(rectangle[i]);
vector<vector< int >> triangle3;
for ( int i = 0; i < 2; i++) triangle3.push_back(rectangle[i]);
triangle3.push_back(rectangle[3]);
vector<vector< int >> triangle4;
for ( int i = n - 2; i < n; i++) triangle4.push_back(rectangle[i]);
triangle4.push_back(rectangle[0]);
int ans = 0;
for ( auto point:points)
{
int condOne = isInside(triangle1, point);
int condTwo = isInside(triangle2, point);
int condThree = isInside(triangle3, point);
int condFour = isInside(triangle4, point);
int condFive = isInside(triangle, point);
if ((condOne || condTwo || condThree || condFour) && condFive)
ans += 1;
}
cout << ans;
}
int main()
{
vector<vector< int >> rectangle = {{6, 5}, {2, 2}, {2, 1}, {5, 5}};
vector<vector< int >> points = {{1, 1}, {6, 1}, {6, 6}, {1, 6}};
vector<vector< int >> triangle = {{4, 4}, {0, 4}, {0, -2}};
countPoints(points, triangle, rectangle);
return 0;
}
|
Java
import java.io.*;
import java.util.*;
class GFG{
static int getArea( 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 );
}
static int isInside(ArrayList<ArrayList<Integer>> triangle,
ArrayList<Integer> point)
{
ArrayList<Integer> A = triangle.get( 0 );
ArrayList<Integer> B = triangle.get( 1 );
ArrayList<Integer> C = triangle.get( 2 );
int x = point.get( 0 );
int y = point.get( 1 );
int ABC = getArea(A.get( 0 ), A.get( 1 ),
B.get( 0 ), B.get( 1 ),
C.get( 0 ), C.get( 1 ));
int BPC = getArea(x, y, B.get( 0 ),
B.get( 1 ), C.get( 0 ),
C.get( 1 ));
int APC = getArea(A.get( 0 ), A.get( 1 ), x,
y, C.get( 0 ), C.get( 1 ));
int APB = getArea(A.get( 0 ), A.get( 1 ), B.get( 0 ),
B.get( 1 ), x, y);
return ABC == (APC + APB + BPC) ? 1 : 0 ;
}
static void countPoints(ArrayList<ArrayList<Integer>> rectangle,
ArrayList<ArrayList<Integer>> triangle,
ArrayList<ArrayList<Integer>> points)
{
int n = rectangle.size();
ArrayList<ArrayList<Integer>> triangle1 = new ArrayList<ArrayList<Integer>>();
for ( int i = 1 ; i < n; i++)
triangle1.add(rectangle.get(i));
ArrayList<ArrayList<Integer>> triangle2 = new ArrayList<ArrayList<Integer>>();
for ( int i = 0 ; i < 3 ; i++)
{
triangle2.add(rectangle.get(i));
}
ArrayList<ArrayList<Integer>> triangle3 = new ArrayList<ArrayList<Integer>>();
for ( int i = 0 ; i < 2 ; i++)
{
triangle3.add(rectangle.get(i));
}
triangle3.add(rectangle.get( 3 ));
ArrayList<ArrayList<Integer>> triangle4 = new ArrayList<ArrayList<Integer>>();
for ( int i = n - 2 ; i < n; i++)
{
triangle4.add(rectangle.get(i));
}
triangle4.add(rectangle.get( 0 ));
int ans = 0 ;
for (ArrayList<Integer> point:points)
{
int condOne = isInside(triangle1, point);
int condTwo = isInside(triangle2, point);
int condThree = isInside(triangle3, point);
int condFour = isInside(triangle4, point);
int condFive = isInside(triangle, point);
if ((condOne != 0 || condTwo != 0 ||
condThree != 0 || condFour != 0 ) &&
condFive != 0 )
ans += 1 ;
}
System.out.println(ans);
}
public static void main (String[] args)
{
ArrayList<ArrayList<Integer>> rectangle = new ArrayList<ArrayList<Integer>>();
ArrayList<ArrayList<Integer>> points = new ArrayList<ArrayList<Integer>>();
ArrayList<ArrayList<Integer>> triangle = new ArrayList<ArrayList<Integer>>();
rectangle.add( new ArrayList<Integer>(Arrays.asList( 6 , 5 )));
rectangle.add( new ArrayList<Integer>(Arrays.asList( 2 , 2 )));
rectangle.add( new ArrayList<Integer>(Arrays.asList( 2 , 1 )));
rectangle.add( new ArrayList<Integer>(Arrays.asList( 5 , 5 )));
points.add( new ArrayList<Integer>(Arrays.asList( 1 , 1 )));
points.add( new ArrayList<Integer>(Arrays.asList( 6 , 1 )));
points.add( new ArrayList<Integer>(Arrays.asList( 6 , 6 )));
points.add( new ArrayList<Integer>(Arrays.asList( 1 , 6 )));
triangle.add( new ArrayList<Integer>(Arrays.asList( 4 , 4 )));
triangle.add( new ArrayList<Integer>(Arrays.asList( 0 , 4 )));
triangle.add( new ArrayList<Integer>(Arrays.asList( 0 , - 2 )));
countPoints(points, triangle, rectangle);
}
}
|
Python3
def getArea(x1, y1, x2, y2, x3, y3):
return abs ((x1 * (y2 - y3) +
x2 * (y3 - y1) +
x3 * (y1 - y2)) / 2 )
def isInside(triangle, point):
A, B, C = triangle
x, y = point
ABC = getArea(A[ 0 ], A[ 1 ],
B[ 0 ], B[ 1 ],
C[ 0 ], C[ 1 ])
BPC = getArea(x, y, B[ 0 ],
B[ 1 ], C[ 0 ],
C[ 1 ])
APC = getArea(A[ 0 ], A[ 1 ], x,
y, C[ 0 ], C[ 1 ])
APB = getArea(A[ 0 ], A[ 1 ], B[ 0 ],
B[ 1 ], x, y)
return ABC = = (APC + APB + BPC)
def countPoints(rectangle, triangle, points):
triangle1 = rectangle[ 1 :]
triangle2 = rectangle[: 3 ]
triangle3 = rectangle[: 2 ]
triangle3.append(rectangle[ 3 ])
triangle4 = rectangle[ - 2 :]
triangle4.append(rectangle[ 0 ])
ans = 0
for point in points:
condOne = isInside(triangle1, point)
condTwo = isInside(triangle2, point)
condThree = isInside(triangle3, point)
condFour = isInside(triangle4, point)
condFive = isInside(triangle, point)
if (condOne or condTwo or condThree \
or condFour) and condFive:
ans + = 1
print (ans)
rectangle = [[ 6 , 5 ], [ 2 , 2 ], [ 2 , 1 ], [ 5 , 5 ]]
points = [[ 1 , 1 ], [ 6 , 1 ], [ 6 , 6 ], [ 1 , 6 ]]
triangle = [[ 4 , 4 ], [ 0 , 4 ], [ 0 , - 2 ]]
countPoints(points, triangle, rectangle)
|
C#
using System;
using System.Collections.Generic;
public class GFG
{
static int getArea( 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);
}
static int isInside(List<List< int >> triangle,
List< int > point)
{
List< int > A = triangle[0];
List< int > B = triangle[1];
List< int > C = triangle[2];
int x = point[0];
int y = point[1];
int ABC = getArea(A[0], A[1],
B[0], B[1],
C[0], C[1]);
int BPC = getArea(x, y, B[0],
B[1], C[0],
C[1]);
int APC = getArea(A[0], A[1], x,
y, C[0], C[1]);
int APB = getArea(A[0], A[1], B[0],
B[1], x, y);
return ABC == (APC + APB + BPC) ? 1 :0;
}
static void countPoints(List<List< int >> rectangle,
List<List< int >> triangle,
List<List< int >> points)
{
int n = rectangle.Count;
List<List< int >> triangle1 = new List<List< int >>();
for ( int i = 1; i < n; i++)
triangle1.Add(rectangle[i]);
List<List< int >> triangle2 = new List<List< int >>();
for ( int i = 0; i < 3; i++)
{
triangle2.Add(rectangle[i]);
}
List<List< int >> triangle3 = new List<List< int >>();
for ( int i = 0; i < 2; i++)
{
triangle3.Add(rectangle[i]);
}
triangle3.Add(rectangle[3]);
List<List< int >> triangle4 = new List<List< int >>();
for ( int i = n - 2; i < n; i++)
{
triangle4.Add(rectangle[i]);
}
triangle4.Add(rectangle[0]);
int ans = 0;
foreach (List< int > point in points)
{
int condOne = isInside(triangle1, point);
int condTwo = isInside(triangle2, point);
int condThree = isInside(triangle3, point);
int condFour = isInside(triangle4, point);
int condFive = isInside(triangle, point);
if ((condOne != 0 || condTwo != 0 ||
condThree != 0 || condFour != 0) &&
condFive != 0)
ans += 1;
}
Console.WriteLine(ans);
}
static public void Main ()
{
List<List< int >> rectangle = new List<List< int >>();
List<List< int >> points = new List<List< int >>();
List<List< int >> triangle = new List<List< int >>();
rectangle.Add( new List< int >(){6, 5});
rectangle.Add( new List< int >(){2, 2});
rectangle.Add( new List< int >(){2, 1});
rectangle.Add( new List< int >(){5, 5});
points.Add( new List< int >(){1, 1});
points.Add( new List< int >(){6, 1});
points.Add( new List< int >(){6, 6});
points.Add( new List< int >(){1, 6});
triangle.Add( new List< int >(){4, 4});
triangle.Add( new List< int >(){0, 4});
triangle.Add( new List< int >(){0, -2});
countPoints(points, triangle, rectangle);
}
}
|
Javascript
<script>
function getArea(x1,y1,x2,y2,x3,y3)
{
return Math.abs((x1 * (y2 - y3) +
x2 * (y3 - y1) +
x3 * (y1 - y2)) / 2);
}
function isInside(triangle,point)
{
let A = triangle[0];
let B = triangle[1];
let C = triangle[2];
let x = point[0];
let y = point[1];
let ABC = getArea(A[0], A[1],
B[0], B[1],
C[0], C[1]);
let BPC = getArea(x, y, B[0],
B[1], C[0],
C[1]);
let APC = getArea(A[0], A[1], x,
y, C[0], C[1]);
let APB = getArea(A[0], A[1], B[0],
B[1], x, y);
return ABC == (APC + APB + BPC) ? 1 :0;
}
function countPoints(rectangle,triangle,points)
{
let n = rectangle.length;
let triangle1 = [];
for (let i = 1; i < n; i++)
triangle1.push(rectangle[i]);
let triangle2 = [];
for (let i = 0; i < 3; i++)
{
triangle2.push(rectangle[i]);
}
let triangle3 = [];
for (let i = 0; i < 2; i++)
{
triangle3.push(rectangle[i]);
}
triangle3.push(rectangle[3]);
let triangle4 = [];
for (let i = n - 2; i < n; i++)
{
triangle4.push(rectangle[i]);
}
triangle4.push(rectangle[0]);
let ans = 0;
for (let point=0;point<points.length;point++)
{
let condOne = isInside(triangle1, points[point]);
let condTwo = isInside(triangle2, points[point]);
let condThree = isInside(triangle3, points[point]);
let condFour = isInside(triangle4, points[point]);
let condFive = isInside(triangle, points[point]);
if ((condOne != 0 || condTwo != 0 ||
condThree != 0 || condFour != 0) &&
condFive != 0)
ans += 1;
}
document.write(ans+ "<br>" );
}
let rectangle =[];
let points = [];
let triangle = [];
rectangle.push([6, 5]);
rectangle.push([2, 2]);
rectangle.push([2, 1]);
rectangle.push([5, 5]);
points.push([1, 1]);
points.push([6, 1]);
points.push([6, 6]);
points.push([1, 6]);
triangle.push([4, 4]);
triangle.push([0, 4]);
triangle.push([0, -2]);
countPoints(points, triangle, rectangle);
</script>
|
Time Complexity: O(N) Auxiliary Space: O(1)
|