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*

`# Python3 implementation of the above approach ` `from` `collections ` `import` `defaultdict `
`from` `math ` `import` `gcd `
` ` `# This function returns the ` `# required number of triangles ` `def` `countTriangles(P, N): `
` ` ` ` `# Hash Map to store the frequency of `
` ` `# slope corresponding to a point (X, Y) `
` ` `mp ` `=` `defaultdict(` `lambda` `:` `0` `) `
` ` `ans ` `=` `0`
` ` ` ` `# Iterate over all possible points `
` ` `for` `i ` `in` `range` `(` `0` `, N): `
` ` `mp.clear() `
` ` ` ` `# Calculate slope of all elements `
` ` `# with current element `
` ` `for` `j ` `in` `range` `(i ` `+` `1` `, N): `
` ` `X ` `=` `P[i][` `0` `] ` `-` `P[j][` `0` `] `
` ` `Y ` `=` `P[i][` `1` `] ` `-` `P[j][` `1` `] `
` ` ` ` `# find the slope with reduced `
` ` `# fraction `
` ` `g ` `=` `gcd(X, Y) `
` ` `X ` `/` `/` `=` `g `
` ` `Y ` `/` `/` `=` `g `
` ` `mp[(X, Y)] ` `+` `=` `1`
` ` ` ` `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` `j ` `in` `mp: `
` ` `ans ` `-` `=` `(mp[j] ` `*` `(mp[j] ` `-` `1` `)) ` `/` `/` `2`
` ` ` ` `return` `ans `
` ` `# Driver Code ` `if` `__name__ ` `=` `=` `"__main__"` `: `
` ` ` ` `P ` `=` `[[` `0` `, ` `0` `], [` `2` `, ` `0` `], [` `1` `, ` `1` `], [` `2` `, ` `2` `]] `
` ` `N ` `=` `len` `(P) `
` ` `print` `(countTriangles(P, N)) `
` ` `# This code is contributed by Rituraj Jain ` |

*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
- Maximum count of Equilateral Triangles that can be formed within given Equilateral Triangle
- Python - Find the maximum number of triangles with given points on three lines
- Number of triangles in a plane if no more than two points are collinear
- Total number of triangles formed when there are H horizontal and V vertical lines
- Number of triangles formed by joining vertices of n-sided polygon with one side common
- Number of triangles formed by joining vertices of n-sided polygon with two common sides and no common sides
- Check whether a straight line can be formed using N co-ordinate points
- Forming triangles using points on a square
- Count of triangles with total n points with m collinear
- Count of obtuse angles in a circle with 'k' equidistant points between 2 given points
- Find the point on X-axis from given N points having least Sum of Distances from all other points
- Number of Integral Points between Two Points
- Prime points (Points that split a number into two primes)
- Minimum number of points to be removed to get remaining points on one side of axis
- Number of ways a convex polygon of n+2 sides can split into triangles by connecting vertices
- Count of Right-Angled Triangle formed from given N points whose base or perpendicular are parallel to X or Y axis
- Area of the largest rectangle formed by lines parallel to X and Y axis from given set of points
- Number of quadrilateral formed with N distinct points on circumference of Circle

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.