Related Articles

# Count Integral points inside a Triangle

• Difficulty Level : Hard
• Last Updated : 11 Jun, 2021

Given three non-collinear integral points in XY plane, find the number of integral points inside the triangle formed by the three points. (A point in XY plane is said to be integral/lattice point if both its co-ordinates are integral).

Example:

```Input: p = (0, 0), q = (0, 5) and r = (5,0)

Output: 6

Explanation: The points (1,1) (1,2) (1,3) (2,1)
(2,2) and (3,1) are the integral
points inside the triangle.``` We can use the Pick’s theorem, which states that the following equation holds true for a simple Polygon.

```Pick's Theeorem:
A = I + (B/2) -1

A ==> Area of Polygon
B ==> Number of integral points on edges of polygon
I ==> Number of integral points inside the polygon

Using the above formula, we can deduce,
I = (2A - B + 2) / 2 ```

We can find A (area of triangle) using below Shoelace formula

`A =  1/2 * abs(x1(y2 - y3) + x2(y3 - y1) + x3(y1 - y2)) `

How to find B (number of integral points on edges of a triangle)?
We can find the number of integral points between any two vertex (V1, V2) of the triangle using the following algorithm.

```1. If the edge formed by joining V1 and V2 is parallel
to the X-axis, then the number of integral points
between the vertices is :
abs(V1.x - V2.x) - 1

2. Similarly, if edge is parallel to the Y-axis, then
the number of integral points in between is :
abs(V1.y - V2.y) - 1

3. Else, we can find the integral points between the
vertices using below formula:
GCD(abs(V1.x-V2.x), abs(V1.y-V2.y)) - 1
The above formula is a well known fact and can be
verified using simple geometry. (Hint: Shift the
edge such that one of the vertex lies at the Origin.)

https://www.geeksforgeeks.org/number-integral-points-two-points/```

Below is the implementation of the above algorithm.

## C++

 `// C++ program to find Integral points inside a triangle``#include``using` `namespace` `std;` `// Class to represent an Integral point on XY plane.``class` `Point``{``public``:``    ``int` `x, y;``    ``Point(``int` `a=0, ``int` `b=0):x(a),y(b) {}``};` `//utility function to find GCD of two numbers``// GCD of a and b``int` `gcd(``int` `a, ``int` `b)``{``    ``if` `(b == 0)``       ``return` `a;``    ``return` `gcd(b, a%b);``}` `// Finds the no. of Integral points between``// two given points.``int` `getBoundaryCount(Point p,Point q)``{``    ``// Check if line parallel to axes``    ``if` `(p.x==q.x)``        ``return` `abs``(p.y - q.y) - 1;``    ``if` `(p.y == q.y)``        ``return` `abs``(p.x - q.x) - 1;` `    ``return` `gcd(``abs``(p.x-q.x), ``abs``(p.y-q.y)) - 1;``}` `// Returns count of points inside the triangle``int` `getInternalCount(Point p, Point q, Point r)``{``    ``// 3 extra integer points for the vertices``    ``int` `BoundaryPoints = getBoundaryCount(p, q) +``                         ``getBoundaryCount(p, r) +``                         ``getBoundaryCount(q, r) + 3;` `    ``// Calculate 2*A for the triangle``    ``int` `doubleArea = ``abs``(p.x*(q.y - r.y) + q.x*(r.y - p.y)  +``                         ``r.x*(p.y - q.y));` `    ``// Use Pick's theorem to calculate the no. of Interior points``    ``return` `(doubleArea - BoundaryPoints + 2)/2;``}` `// driver function to check the program.``int` `main()``{``    ``Point p(0, 0);``    ``Point q(5, 0);``    ``Point r(0, 5);``    ``cout << ``"Number of integral points inside given triangle is "``         ``<< getInternalCount(p, q, r);``    ``return` `0;``}`

## Java

 `// Java program to find Integral points inside a triangle``// Class to represent an Integral point on XY plane.``class` `Point``{``    ``int` `x, y;` `    ``public` `Point(``int` `a, ``int` `b)``    ``{``        ``x = a;``        ``y = b;``    ``}``}` `class` `GFG``{``    ``// utility function to find GCD of two numbers``    ``// GCD of a and b``    ``static` `int` `gcd(``int` `a, ``int` `b)``    ``{``        ``if` `(b == ``0``)``            ``return` `a;``        ``return` `gcd(b, a % b);``    ``}` `    ``// Finds the no. of Integral points between``    ``// two given points.``    ``static` `int` `getBoundaryCount(Point p, Point q)``    ``{``        ``// Check if line parallel to axes``        ``if` `(p.x == q.x)``            ``return` `Math.abs(p.y - q.y) - ``1``;` `        ``if` `(p.y == q.y)``            ``return` `Math.abs(p.x - q.x) - ``1``;` `        ``return` `gcd(Math.abs(p.x - q.x),``                   ``Math.abs(p.y - q.y)) - ``1``;``    ``}` `    ``// Returns count of points inside the triangle``    ``static` `int` `getInternalCount(Point p, Point q, Point r)``    ``{` `        ``// 3 extra integer points for the vertices``        ``int` `BoundaryPoints = getBoundaryCount(p, q) +``                             ``getBoundaryCount(p, r) +``                             ``getBoundaryCount(q, r) + ``3``;` `        ``// Calculate 2*A for the triangle``        ``int` `doubleArea = Math.abs(p.x * (q.y - r.y) +``                                  ``q.x * (r.y - p.y) +``                                  ``r.x * (p.y - q.y));` `        ``// Use Pick's theorem to calculate``        ``// the no. of Interior points``        ``return` `(doubleArea - BoundaryPoints + ``2``) / ``2``;``    ``}` `    ``// Driver Code``    ``public` `static` `void` `main(String[] args)``    ``{``        ``Point p = ``new` `Point(``0``, ``0``);``        ``Point q = ``new` `Point(``5``, ``0``);``        ``Point r = ``new` `Point(``0``, ``5``);``        ``System.out.println(``"Number of integral points"` `+``                           ``" inside given triangle is "` `+``                              ``getInternalCount(p, q, r));``    ``}``}` `// This code is contributed by Vivek Kumar Singh`

## Python3

 `# Python3 program to find Integral``# points inside a triangle` `# Class to represent an Integral``# point on XY plane.``class` `Point:` `    ``def` `__init__(``self``, x, y):``        ``self``.x ``=` `x``        ``self``.y ``=` `y``        ` `# Utility function to find GCD of``# two numbers GCD of a and b``def` `gcd(a, b):` `    ``if` `(b ``=``=` `0``):``        ``return` `a``        ` `    ``return` `gcd(b, a ``%` `b)` `# Finds the no. of Integral points``# between two given points``def` `getBoundaryCount(p, q):``    ` `    ``# Check if line parallel to axes``    ``if` `(p.x ``=``=` `q.x):``        ``return` `abs``(p.y ``-` `q.y) ``-` `1``    ``if` `(p.y ``=``=` `q.y):``        ``return` `abs``(p.x ``-` `q.x) ``-` `1` `    ``return` `gcd(``abs``(p.x ``-` `q.x),``               ``abs``(p.y ``-` `q.y)) ``-` `1` `# Returns count of points inside the triangle``def` `getInternalCount(p, q, r):` `    ``# 3 extra integer points for the vertices``    ``BoundaryPoints ``=` `(getBoundaryCount(p, q) ``+``                      ``getBoundaryCount(p, r) ``+``                      ``getBoundaryCount(q, r) ``+` `3``)` `    ``# Calculate 2*A for the triangle``    ``doubleArea ``=` `abs``(p.x ``*` `(q.y ``-` `r.y) ``+``                     ``q.x ``*` `(r.y ``-` `p.y) ``+``                     ``r.x ``*` `(p.y ``-` `q.y))` `    ``# Use Pick's theorem to calculate``    ``# the no. of Interior points``    ``return` `(doubleArea ``-` `BoundaryPoints ``+` `2``) ``/``/` `2` `# Driver code``if` `__name__``=``=``"__main__"``:``    ` `    ``p ``=` `Point(``0``, ``0``)``    ``q ``=` `Point(``5``, ``0``)``    ``r ``=` `Point(``0``, ``5``)``    ` `    ``print``(``"Number of integral points "``          ``"inside given triangle is "``,``          ``getInternalCount(p, q, r))`` ` `# This code is contributed by rutvik_56`

## C#

 `// C# program to find Integral points``// inside a triangle``using` `System;` `// Class to represent an Integral point``// on XY plane.``public` `class` `Point``{``    ``public` `int` `x, y;` `    ``public` `Point(``int` `a, ``int` `b)``    ``{``        ``x = a;``        ``y = b;``    ``}``}` `class` `GFG``{``    ``// utility function to find GCD of``    ``// two numbers a and b``    ``static` `int` `gcd(``int` `a, ``int` `b)``    ``{``        ``if` `(b == 0)``            ``return` `a;``        ``return` `gcd(b, a % b);``    ``}` `    ``// Finds the no. of Integral points between``    ``// two given points.``    ``static` `int` `getBoundaryCount(Point p, Point q)``    ``{``        ``// Check if line parallel to axes``        ``if` `(p.x == q.x)``            ``return` `Math.Abs(p.y - q.y) - 1;` `        ``if` `(p.y == q.y)``            ``return` `Math.Abs(p.x - q.x) - 1;` `        ``return` `gcd(Math.Abs(p.x - q.x),``                ``Math.Abs(p.y - q.y)) - 1;``    ``}` `    ``// Returns count of points inside the triangle``    ``static` `int` `getInternalCount(Point p, Point q, Point r)``    ``{` `        ``// 3 extra integer points for the vertices``        ``int` `BoundaryPoints = getBoundaryCount(p, q) +``                             ``getBoundaryCount(p, r) +``                              ``getBoundaryCount(q, r) + 3;` `        ``// Calculate 2*A for the triangle``        ``int` `doubleArea = Math.Abs(p.x * (q.y - r.y) +``                                  ``q.x * (r.y - p.y) +``                                  ``r.x * (p.y - q.y));` `        ``// Use Pick's theorem to calculate``        ``// the no. of Interior points``        ``return` `(doubleArea - BoundaryPoints + 2) / 2;``    ``}` `    ``// Driver Code``    ``public` `static` `void` `Main(String[] args)``    ``{``        ``Point p = ``new` `Point(0, 0);``        ``Point q = ``new` `Point(5, 0);``        ``Point r = ``new` `Point(0, 5);``        ``Console.WriteLine(``"Number of integral points"` `+``                         ``" inside given triangle is "` `+``                            ``getInternalCount(p, q, r));``    ``}``}` `// This code is contributed by 29AjayKumar`

## Javascript

 ``

Output:

`Number of integral points inside given triangle is 6`

This article is contributed by Ashutosh Kumar. If you like GeeksforGeeks and would like to contribute, you can also write an article and mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.