Count Integral points inside a Triangle - GeeksforGeeks

11 Jan, 2022
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 Theorem:
 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.) 

Please refer below link for detailed explanation.
https://www.geeksforgeeks.org/number-integral-points-two-points/
Below is the implementation of the above algorithm. 
C++
Java
Python3
C#
Javascript
// C++ program to find Integral points inside a triangle#include<bits/stdc++.h>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 bint 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 triangleint 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 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 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 bdef gcd(a, b):     if (b == 0):        return a             return gcd(b, a % b) # Finds the no. of Integral points# between two given pointsdef 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 triangledef 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 codeif __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# program to find Integral points// inside a triangleusing 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
<script> // JavaScript program to find Integral points inside a triangle// Class to represent an Integral point on XY plane. class Point{    constructor(a,b)    {        this.x=a;        this.y=b;    }} // utility function to find GCD of two numbers    // GCD of a and bfunction gcd(a,b){    if (b == 0)            return a;        return gcd(b, a % b);} // Finds the no. of Integral points between    // two given points.function getBoundaryCount(p,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 trianglefunction getInternalCount(p,q,r){    // 3 extra integer points for the vertices        let BoundaryPoints = getBoundaryCount(p, q) +                             getBoundaryCount(p, r) +                             getBoundaryCount(q, r) + 3;          // Calculate 2*A for the triangle        let 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 Codelet p = new Point(0, 0);let q = new Point(5, 0);let r = new Point(0, 5);document.write("Number of integral points" +                           " inside given triangle is " +                              getInternalCount(p, q, r));   // This code is contributed by rag2127 </script>
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.Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above 
Vivekkumar Singh
29AjayKumar
nitish6174
rutvik_56
rag2127
varshagumber28
triangle
Geometric
Mathematical
Mathematical
Geometric
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Program for distance between two points on earth
Line Clipping | Set 1 (Cohen–Sutherland Algorithm)
Optimum location of point to minimize total distance
Program to find area of a triangle
Given n line segments, find if any two segments intersect
Program for Fibonacci numbers
C++ Data Types
Write a program to print all permutations of a given string
Set in C++ Standard Template Library (STL)
Coin Change | DP-7