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 unique Triangles using STL | Set 1 (Using set)
- Count number of right triangles possible with a given perimeter
- Number of Triangles in an Undirected Graph
- 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