Рубрики

Количество интегральных точек между двумя точками

Для двух точек p (x1, y1) и q (x2, y2) вычислите число целых точек, лежащих на соединяющей их прямой.

Пример: если точки — это (0, 2) и (4, 0), то число лежащих на нем целых точек равно только одному, то есть (2, 1).
Аналогично, если точками являются (1, 9) и (8, 16), лежащие на нем целые точки равны 6, и они равны (2, 10), (3, 11), (4, 12), (5, 13). ), (6, 14) и (7, 15).

Мы настоятельно рекомендуем вам нажать здесь и попрактиковаться, прежде чем переходить к решению.

Простой подход
Начните с любой из указанных точек, достигните другой конечной точки с помощью петель. Для каждой точки внутри цикла проверьте, лежит ли она на линии, соединяющей данные две точки. Если да, то увеличьте счет на 1. Сложность времени для этого подхода будет O (мин (x2-x1, y2-y1)).

Оптимальный подход

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


Как работает формула GCD?

Идея состоит в том, чтобы найти уравнение прямой в простейшем виде, то есть в уравнении ax + by + c коэффициенты a, b и c становятся взаимно простыми. Мы можем сделать это путем вычисления GCD (наибольший общий делитель) для a, b и c и преобразовать a, b и c в простейшую форму.
Тогда ответ будет (разница координат y) разделен на (a) — 1. Это потому, что после вычисления ax + на + c = 0 для различных значений y, x будет числом значений y, которые делятся на а.

Ниже приведена реализация вышеуказанной идеи.

C ++

// C ++ код для поиска количества целых точек
// лежа на линии, соединяющей две заданные точки
#include <iostream>
#include <cmath>

using namespace std;

  
// Класс для представления интегральной точки на плоскости XY.

class Point

{

public:

    int x, y;

    Point(int a=0, int b=0):x(a),y(b) {}

};

  
// Сервисная функция для поиска GCD из двух чисел
// GCD a и b

int gcd(int a, int b)

{

    if (b == 0)

       return a;

    return gcd(b, a%b);

}

  
// Находит номер Интегральных точек между
// две заданные точки.

int getCount(Point p, Point q)

{

    // Если линия, соединяющая p и q, параллельна

    // ось x, тогда count - это разница y

    // ценности

    if (p.x==q.x)

        return abs(p.y - q.y) - 1;

  

    // Если линия, соединяющая p и q, параллельна

    // ось y, тогда count - это разница x

    // ценности

    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;

}

  
// Программа драйвера для тестирования выше

int 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-код для определения количества целых точек
// лежа на линии, соединяющей две заданные точки

  

class GFG 

{

  
// Класс для представления интегральной точки на плоскости XY.

static class Point

{

    int x, y;

    Point(int a, int b)

    {

        this.x = a;

        this.y = b;

    }

};

  
// Сервисная функция для поиска GCD из двух чисел
// GCD a и b

static int gcd(int a, int b)

{

    if (b == 0)

    return a;

    return gcd(b, a % b);

}

  
// Находит номер Интегральных точек между
// две заданные точки.

static int getCount(Point p, Point q)

{

    // Если линия, соединяющая p и q, параллельна

    // ось x, тогда count - это разница y

    // ценности

    if (p.x == q.x)

        return Math.abs(p.y - q.y) - 1;

  

    // Если линия, соединяющая p и q, параллельна

    // ось y, тогда count - это разница x

    // ценности

    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;

}

  
// Программа драйвера для тестирования выше

public 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));

}
}

  
// Этот код предоставлен Rajput-Ji

python3

# Python3 код для поиска номера
# целые точки, лежащие на прямой
# соединение двух заданных точек

  
# Класс для представления интегральной точки
# на плоскости XY.

class Point:

      

    def __init__(self, a, b):

        self.x = a

        self.y = b

  
# Сервисная функция для поиска GCD
# из двух чисел GCD a и b

def gcd(a, b):

  

    if b == 0:

        return a

    return gcd(b, a % b)

  
# Находит нет. интегральных точек
# между двумя заданными точками.

def getCount(p, q):

  

    # Если линия, соединяющая р и q, параллельна

    # к оси x, то есть разница

    количество значений y

    if p.x == q.x:

        return abs(p.y - q.y) - 1

  

    # Если линия, соединяющая р и q, параллельна

    # на ось y, то есть разница

    количество значений x

    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

  
Код водителя

if __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)))

  
# Этот код предоставлен Rituraj Jain

C #

// C # код для поиска количества целых точек
// лежа на линии, соединяющей две заданные точки

using System;

  

class GFG 

{

  
// Класс для представления интегральной точки на плоскости XY.

public class Point

{

    public int x, y;

    public Point(int a, int b)

    {

        this.x = a;

        this.y = b;

    }

};

  
// Сервисная функция для поиска GCD из двух чисел
// GCD a и b

static int gcd(int a, int b)

{

    if (b == 0)

    return a;

    return gcd(b, a % b);

}

  
// Находит номер Интегральных точек между
// две заданные точки.

static int getCount(Point p, Point q)

{

    // Если линия, соединяющая p и q, параллельна

    // ось x, тогда count - это разница y

    // ценности

    if (p.x == q.x)

        return Math.Abs(p.y - q.y) - 1;

  

    // Если линия, соединяющая p и q, параллельна

    // ось y, тогда count - это разница x

    // ценности

    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;

}

  
// Код драйвера

public 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));

}
}

  
/ * Этот код предоставлен PrinciRaj1992 * /



Выход:

The number of integral points between (1, 9) and (8, 16) is 6

Ссылка :
http://espressocode.top/count-integral-points-inside-a-triangle/

Эта статья предоставлена Paridhi Johari. Если вам нравится GeeksforGeeks и вы хотите внести свой вклад, вы также можете написать статью и отправить ее по почте на contrib@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой теме

Рекомендуемые посты:

Количество интегральных точек между двумя точками

0.00 (0%) 0 votes