Number of possible Triangles in a Cartesian coordinate system
Given n points in a Cartesian coordinate system. Count the number of triangles formed.
Examples:
Input : point[] = {(0, 0), (1, 1), (2, 0), (2, 2)
Output : 3
Three triangles can be formed from above points.
A simple solution is to check if the determinant of the three points selected is non-zero or not. The following determinant gives the area of a Triangle (Also known as Cramer’s rule).
Area of the triangle with corners at (x1, y1), (x2, y2) and (x3, y3) is given by:
We can solve this by taking all possible combination of 3 points and finding the determinant.
C++
#include <bits/stdc++.h>
using namespace std;
struct Point
{
int x, y;
};
int det( int x1, int y1, int x2, int y2, int x3, int y3)
{
return x1*(y2 - y3) - y1*(x2 - x3) + 1*(x2*y3 - y2*x3);
}
int countPoints(Point arr[], int n)
{
int result = 0;
for ( int i=0; i<n; i++)
for ( int j=i+1; j<n; j++)
for ( int k=j+1; k<n; k++)
if (det(arr[i].x, arr[i].y, arr[j].x,
arr[j].y, arr[k].x, arr[k].y))
result++;
return result;
}
int main()
{
Point arr[] = {{0, 0}, {1, 1}, {2, 0}, {2, 2}};
int n = sizeof (arr)/ sizeof (arr[0]);
cout << countPoints(arr, n);
return 0;
}
|
Java
class GFG{
static int det( int x1, int y1, int x2, int y2, int x3, int y3)
{
return (x1 * (y2 - y3) - y1 *
(x2 - x3) + 1 * (x2 *
y3 - y2 * x3));
}
static int countPoints( int [][]Point, int n)
{
int result = 0 ;
for ( int i = 0 ; i < n; i++)
for ( int j = i + 1 ; j < n; j++)
for ( int k = j + 1 ; k < n; k++)
if (det(Point[i][ 0 ], Point[i][ 1 ],
Point[j][ 0 ], Point[j][ 1 ],
Point[k][ 0 ], Point[k][ 1 ])>= 0 )
result = result + 1 ;
return result;
}
public static void main(String[] args)
{
int Point[][] = {{ 0 , 0 },{ 1 , 1 },{ 2 , 0 },{ 2 , 2 }};
int n = Point.length;
System.out.println(countPoints(Point, n));
}
}
|
Python3
def det(x1, y1, x2, y2, x3, y3):
return (x1 * (y2 - y3) - y1 *
(x2 - x3) + 1 * (x2 *
y3 - y2 * x3))
def countPoints(Point, n):
result = 0
for i in range (n):
for j in range (i + 1 , n):
for k in range (j + 1 , n):
if (det(Point[i][ 0 ], Point[i][ 1 ],
Point[j][ 0 ], Point[j][ 1 ],
Point[k][ 0 ], Point[k][ 1 ])):
result = result + 1
return result
Point = [[ 0 , 0 ], [ 1 , 1 ],
[ 2 , 0 ], [ 2 , 2 ]]
n = len (Point)
print (countPoints(Point, n))
|
C#
using System;
class GFG{
static int det( int x1, int y1, int x2, int y2, int x3, int y3)
{
return (x1 * (y2 - y3) - y1 *
(x2 - x3) + 1 * (x2 *
y3 - y2 * x3));
}
static int countPoints( int [,] Point, int n)
{
int result = 0;
for ( int i = 0; i < n; i++)
for ( int j = i + 1; j < n; j++)
for ( int k = j + 1; k < n; k++)
if (det(Point[i,0], Point[i,1], Point[j,0], Point[j,1],Point[k,0], Point[k,1])>=0)
result = result + 1;
return result;
}
public static void Main()
{
int [,] Point = new int [,] { { 0, 0 }, { 1, 1 }, { 2, 0 }, { 2, 2 } };
int n = Point.Length/Point.Rank;
Console.WriteLine(countPoints(Point, n));
}
}
|
PHP
<?php
function det( $x1 , $y1 , $x2 ,
$y2 , $x3 , $y3 )
{
return ( $x1 * ( $y2 - $y3 ) - $y1 *
( $x2 - $x3 ) + 1 * ( $x2 *
$y3 - $y2 * $x3 ));
}
function countPoints( $Point , $n )
{
$result = 0;
for ( $i = 0; $i < $n ; $i ++)
for ( $j = $i + 1; $j < $n ; $j ++)
for ( $k = $j + 1; $k < $n ; $k ++)
if (det( $Point [ $i ][0], $Point [ $i ][1],
$Point [ $j ][0], $Point [ $j ][1],
$Point [ $k ][0], $Point [ $k ][1]))
$result = $result + 1;
return $result ;
}
$Point = array ( array (0, 0),
array (1, 1),
array (2, 0),
array (2, 2));
$n = count ( $Point );
echo countPoints( $Point , $n );
?>
|
Javascript
<script>
function det(x1, y1, x2, y2, x3, y3)
{
return (x1 * (y2 - y3) -
y1 * (x2 - x3) +
1 * (x2 * y3 - y2 * x3));
}
function countPoints(Point, n)
{
let result = 0;
for (let i = 0; i < n; i++)
for (let j = i + 1; j < n; j++)
for (let k = j + 1; k < n; k++)
if (det(Point[i][0], Point[i][1],
Point[j][0], Point[j][1],
Point[k][0], Point[k][1]) >= 0)
result = result + 1;
return result;
}
let Point = [ [ 0, 0 ], [ 1, 1 ],
[ 2, 0 ], [ 2, 2 ] ];
let n = Point.length;
document.write(countPoints(Point, n));
</script>
|
Output:
3
Time Complexity: .
Auxiliary Space: O(1) because it is using constant space
Optimization :
We can optimize the above solution to work in O(n2) using the fact that three points cannot form a triangle if they are collinear. We can use hashing to store slopes of all pairs and find all triangles in O(n2) time.
Last Updated :
30 Aug, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...