Open In App

Number of possible Triangles in a Cartesian coordinate system

Last Updated : 30 Aug, 2022
Summarize
Comments
Improve
Suggest changes
Share
Like Article
Like
Report

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:
{\displaystyle Area = \pm \frac{1}{2}\begin{bmatrix} x1 & y1 & 1\\ x2 & y2 & 1\\ x3 & y3 & 1 \end{bmatrix}}     
We can solve this by taking all possible combination of 3 points and finding the determinant.

C++
// C++ program to count number of triangles that can
// be formed with given points in 2D
#include <bits/stdc++.h>
using namespace std;

// A point in 2D
struct Point
{
   int x, y;
};

// Returns determinant value of three points in 2D
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);
}

// Returns count of possible triangles with given array
// of points in 2D.
int countPoints(Point arr[], int n)
{
    int result = 0;  // Initialize result

    // Consider all triplets of points given in inputs
    // Increment the result when determinant of a triplet
    // is not 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;
}

// Driver code
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
// Java program to count number 
// of triangles that can be formed 
// with given points in 2D

class GFG{
// Returns determinant value 
// of three points in 2D
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));
}

// Returns count of possible 
// triangles with given array
// of points in 2D.
static int countPoints(int [][]Point, int n)
{
    int result = 0; // Initialize result

    // Consider all triplets of 
    // points given in inputs
    // Increment the result when 
    // determinant of a triplet is not 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;
}

// Driver code
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));
}
}
// This code is contributed by
// mits
Python3
# Python program to count number 
# of triangles that can be formed 
# with given points in 2D

# Returns determinant value 
# of three points in 2D
def det(x1, y1, x2, y2, x3, y3):
    return (x1 * (y2 - y3) - y1 * 
            (x2 - x3) + 1 * (x2 *
             y3 - y2 * x3))

# Returns count of possible 
# triangles with given array
# of points in 2D.
def countPoints(Point, n):

    result = 0 # Initialize result

    # Consider all triplets of 
    # points given in inputs
    # Increment the result when 
    # determinant of a triplet is not 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

# Driver code
Point = [[0, 0], [1, 1], 
         [2, 0], [2, 2]]
n = len(Point)
print(countPoints(Point, n))

# This code is contributed by
# Sanjit_Prasad
C#
// C# program to count number 
// of triangles that can be formed 
// with given points in 2D
using System;

class GFG{
// Returns determinant value 
// of three points in 2D
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));
}

// Returns count of possible 
// triangles with given array
// of points in 2D.
static int countPoints(int[,] Point, int n)
{
    int result = 0; // Initialize result

    // Consider all triplets of 
    // points given in inputs
    // Increment the result when 
    // determinant of a triplet is not 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;
}

// Driver code
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));
}
}
// This code is contributed by mits
PHP
<?php
// PHP program to count number 
// of triangles that can be formed 
// with given points in 2D

// Returns determinant value 
// of three points in 2D
function det($x1, $y1, $x2,
             $y2, $x3, $y3)
{
    return ($x1 * ($y2 - $y3) - $y1 *
           ($x2 - $x3) + 1 * ($x2 *
            $y3 - $y2 * $x3));
}

// Returns count of possible 
// triangles with given array
// of points in 2D.
function countPoints($Point, $n)
{
    $result = 0; // Initialize result

    // Consider all triplets of 
    // points given in inputs
    // Increment the result when 
    // determinant of a triplet is not 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;
}

// Driver code
$Point = array(array(0, 0),
               array(1, 1), 
               array(2, 0), 
               array(2, 2));
$n = count($Point);
echo countPoints($Point, $n);

// This code is contributed by
// mits
?>
JavaScript
<script>

// JavaScript program to count number 
// of triangles that can be formed 
// with given points in 2D

// Returns determinant value 
// of three points in 2D
function det(x1, y1, x2, y2, x3, y3)
{
    return (x1 * (y2 - y3) - 
            y1 * (x2 - x3) + 
             1 * (x2 * y3 - y2 * x3));
}
  
// Returns count of possible 
// triangles with given array
// of points in 2D.
function countPoints(Point, n)
{
    
    // Initialize result
    let result = 0; 
  
    // Consider all triplets of 
    // points given in inputs
    // Increment the result when 
    // determinant of a triplet is not 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;
}

// Driver Code
let Point = [ [ 0, 0 ], [ 1, 1 ],
              [ 2, 0 ], [ 2, 2 ] ];
let n = Point.length;

document.write(countPoints(Point, n));

// This code is contributed by souravghosh0416

</script>

Output: 

3


Time Complexity: O(n^{3})     .

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.
 


Next Article
Article Tags :
Practice Tags :

Similar Reads