Number of Integral Points between Two Points

24 May, 2022
Given two points p (x1, y1) and q (x2, y2), calculate the number of integral points lying on the line joining them.Example : If points are (0, 2) and (4, 0), then the number of integral points lying on it is only one and that is (2, 1). Similarly, if points are (1, 9) and (8, 16), the integral points lying on it are 6 and they are (2, 10), (3, 11), (4, 12), (5, 13), (6, 14) and (7, 15).    
 Simple Approach Start from any of the given points, reach the other end point by using loops. For every point inside the loop, check if it lies on the line that joins given two points. If yes, then increment the count by 1. Time Complexity for this approach will be O(min(x2-x1, y2-y1)).  Optimal Approach 
1. If the edge formed by joining p and q is parallel 
   to the X-axis, then the number of integral points 
   between the vertices is : 
        abs(p.y - q.y)-1

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

3. Else, we can find the integral points between the
   vertices using below formula:
     GCD(abs(p.x - q.x), abs(p.y - q.y)) - 1
How does the GCD formula work? The idea is to find the equation of the line in simplest form, i.e., in equation ax + by +c, coefficients a, b and c become co-prime. We can do this by calculating the GCD (greatest common divisor) of a, b and c and convert a, b and c in the simplest form. Then, the answer will be (difference of y coordinates) divided by (a) – 1. This is because after calculating ax + by + c = 0, for different y values, x will be number of y values which are exactly divisible by a.Below is the implementation of above idea. 
C++
Java
Python3
C#
Javascript
// C++ code to find the number of integral points// lying on the line joining the two given points#include <iostream>#include <cmath>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 getCount(Point p, Point q){    // If line joining p and q is parallel to    // x axis, then count is difference of y    // values    if (p.x==q.x)        return abs(p.y - q.y) - 1;     // If line joining p and q is parallel to    // y axis, then count is difference of x    // values    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;} // Driver program to test aboveint main(){    Point p(1, 9);    Point q(8, 16);     cout << "The number of integral points between "         << "(" << p.x << ", " << p.y << ") and ("         << q.x << ", " << q.y << ") is "         << getCount(p, q);     return 0;}
// Java code to find the number of integral points// lying on the line joining the two given points class GFG{ // Class to represent an Integral point on XY plane.static class Point{    int x, y;    Point(int a, int b)    {        this.x = a;        this.y = b;    }}; // Utility function to find GCD of two numbers// GCD of a and bstatic 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 getCount(Point p, Point q){    // If line joining p and q is parallel to    // x axis, then count is difference of y    // values    if (p.x == q.x)        return Math.abs(p.y - q.y) - 1;     // If line joining p and q is parallel to    // y axis, then count is difference of x    // values    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;} // Driver program to test abovepublic static void main(String[] args){    Point p = new Point(1, 9);    Point q = new Point(8, 16);     System.out.println("The number of integral points between "        + "(" + p.x + ", " + p.y + ") and ("        + q.x + ", " + q.y + ") is "        + getCount(p, q));}} // This code contributed by Rajput-Ji
# Python3 code to find the number of# integral points lying on the line# joining the two given points # Class to represent an Integral point# on XY plane.class Point:         def __init__(self, a, b):        self.x = a        self.y = b # 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 points.def getCount(p, q):     # If line joining p and q is parallel    # to x axis, then count is difference    # of y values    if p.x == q.x:        return abs(p.y - q.y) - 1     # If line joining p and q is parallel    # to y axis, then count is difference    # of x values    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 # Driver Codeif __name__ == "__main__":     p = Point(1, 9)    q = Point(8, 16)     print("The number of integral points",          "between ({}, {}) and ({}, {}) is {}" .           format(p.x, p.y, q.x, q.y, getCount(p, q))) # This code is contributed by Rituraj Jain
// C# code to find the number of integral points// lying on the line joining the two given pointsusing System; class GFG{ // Class to represent an Integral point on XY plane.public class Point{    public int x, y;    public Point(int a, int b)    {        this.x = a;        this.y = b;    }}; // Utility function to find GCD of two numbers// GCD of a and bstatic 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 getCount(Point p, Point q){    // If line joining p and q is parallel to    // x axis, then count is difference of y    // values    if (p.x == q.x)        return Math.Abs(p.y - q.y) - 1;     // If line joining p and q is parallel to    // y axis, then count is difference of x    // values    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;} // Driver codepublic static void Main(String[] args){    Point p = new Point(1, 9);    Point q = new Point(8, 16);     Console.WriteLine("The number of integral points between "        + "(" + p.x + ", " + p.y + ") and ("        + q.x + ", " + q.y + ") is "        + getCount(p, q));}} /* This code contributed by PrinciRaj1992 */
<script>// javascript code to find the number of integral points// lying on the line joining the two given points    // 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 b    function gcd(a , b) {        if (b == 0)            return a;        return gcd(b, a % b);    }     // Finds the no. of Integral points between    // two given points.    function getCount( p,  q)    {             // If line joining p and q is parallel to        // x axis, then count is difference of y        // values        if (p.x == q.x)            return Math.abs(p.y - q.y) - 1;         // If line joining p and q is parallel to        // y axis, then count is difference of x        // values        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;    }     // Driver program to test above            p = new Point(1, 9);         q = new Point(8, 16);         document.write("The number of integral points between " + "(" + p.x + ", " + p.y + ") and (" + q.x + ", "                + q.y + ") is " + getCount(p, q)); // This code is contributed by gauravrajput1</script>
Output:  
The number of integral points between (1, 9) and (8, 16) is 6
Time Complexity: O(log(min(a,b))), as we are using recursion to find the GCD.
Auxiliary Space: O(1), as we are not using any extra space.Reference : https://www.geeksforgeeks.org/count-integral-points-inside-a-triangle/This article has been contributed by Paridhi Johari. 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 
nikhil52
rituraj_jain
Rajput-Ji
princiraj1992
GauravRajput1
ankita_saini
rohitsingh07052
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
Optimum location of point to minimize total distance
Line Clipping | Set 1 (Cohen–Sutherland Algorithm)
Program for Point of Intersection of Two Lines
Window to Viewport Transformation in Computer Graphics with Implementation
Program for Fibonacci numbers
Set in C++ Standard Template Library (STL)
Write a program to print all permutations of a given string
C++ Data Types
Merge two sorted arrays