# Number of triangles that can be formed with given N points

Given X and Y coordinates of N points on a Cartesian plane. The task is to find the number of possible triangles with the non-zero area that can be formed by joining each point to every other point.

**Examples:**

Input: P[] = {{0, 0}, {2, 0}, {1, 1}, {2, 2}}Output: 3 Possible triangles can be [(0, 0}, (2, 0), (1, 1)], [(0, 0), (2, 0), (2, 2)] and [(1, 1), (2, 2), (2, 0)]Input: P[] = {{0, 0}, {2, 0}, {1, 1}}Output: 1

A **Naive approach** has been already discussed in Number of possible Triangles in a Cartesian coordinate system

**Efficient Approach**: Consider a point Z and find its slope with every other point. Now, if two points are having the same slope with point Z that means the 3 points are collinear and they cannot form a triangle. Hence, the number of triangles having Z as one of its points is the number of ways of choosing 2 points from the remaining points and then subtracting the number of ways of choosing 2 points from points having the same slope with Z. Since Z can be any point among N points, we have to iterate one more loop.

Below is the implementation of above approach:

`// C++ implementation of the above approach ` `#include <bits/stdc++.h> ` `using` `namespace` `std; ` ` ` `// This function returns the required number ` `// of triangles ` `int` `countTriangles(pair<` `int` `, ` `int` `> P[], ` `int` `N) ` `{ ` ` ` `// Hash Map to store the frequency of ` ` ` `// slope corresponding to a point (X, Y) ` ` ` `map<pair<` `int` `, ` `int` `>, ` `int` `> mp; ` ` ` `int` `ans = 0; ` ` ` ` ` `// Iterate over all possible points ` ` ` `for` `(` `int` `i = 0; i < N; i++) { ` ` ` `mp.clear(); ` ` ` ` ` `// Calculate slope of all elements ` ` ` `// with current element ` ` ` `for` `(` `int` `j = i + 1; j < N; j++) { ` ` ` `int` `X = P[i].first - P[j].first; ` ` ` `int` `Y = P[i].second - P[j].second; ` ` ` ` ` `// find the slope with reduced ` ` ` `// fraction ` ` ` `int` `g = __gcd(X, Y); ` ` ` `X /= g; ` ` ` `Y /= g; ` ` ` `mp[{ X, Y }]++; ` ` ` `} ` ` ` `int` `num = N - (i + 1); ` ` ` ` ` `// Total number of ways to form a triangle ` ` ` `// having one point as current element ` ` ` `ans += (num * (num - 1)) / 2; ` ` ` ` ` `// Subtracting the total number of ways to ` ` ` `// form a triangle having the same slope or are ` ` ` `// collinear ` ` ` `for` `(` `auto` `j : mp) ` ` ` `ans -= (j.second * (j.second - 1)) / 2; ` ` ` `} ` ` ` `return` `ans; ` `} ` ` ` `// Driver Code to test above function ` `int` `main() ` `{ ` ` ` `pair<` `int` `, ` `int` `> P[] = { { 0, 0 }, { 2, 0 }, { 1, 1 }, { 2, 2 } }; ` ` ` `int` `N = ` `sizeof` `(P) / ` `sizeof` `(P[0]); ` ` ` `cout << countTriangles(P, N) << endl; ` ` ` `return` `0; ` `} ` |

*chevron_right*

*filter_none*

**Output:**

3

## Recommended Posts:

- Number of triangles formed from a set of points on three lines
- Number of Triangles that can be formed given a set of lines in Euclidean Plane
- Number of triangles in a plane if no more than two points are collinear
- Count of triangles with total n points with m collinear
- Minimum number of points to be removed to get remaining points on one side of axis
- Prime points (Points that split a number into two primes)
- Number of Integral Points between Two Points
- Number of triangles after N moves
- Count the number of possible triangles
- Count number of right triangles possible with a given perimeter
- Number of Triangles in an Undirected Graph
- Count number of unique Triangles using STL | Set 1 (Using set)
- Number of Isosceles triangles in a binary tree
- Number of possible Triangles in a Cartesian coordinate system
- Number of Triangles in Directed and Undirected Graphs

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.