Как лучше всего сравнить координаты двух узлов? - PullRequest
0 голосов
/ 11 октября 2018

У меня есть график, и каждый узел имеет свое местоположение в виде пары (x, y).Я хочу сравнить евклидово расстояние двух узлов и назначить новое свойство или тег в соответствии с их расстоянием.

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

Например: если есть node1 (1, 1) и node2(1, 2), они почти соседи и имеют сильное сходство.Но node3(51, 48) далеко от node1 и node2.

Один из способов - проверить каждый интервал расстояния между двумя узлами:

if(dist == a)
    map<pair<node, node>, taga>
if(dist == b)
    map<pair<node, node>, tagb>
if(dist == c)
    map<pair<node, node>, tagc>
.
.
.
if(dist == z)
    map<pair<node, node>, tagz>

Как лучше всего это выразитьинтервалы?Я думаю, что приведенный выше алгоритм требует много условий, если график большой и распределен по площади.

Теги могут быть весом узлов или ребер, соединяющих их, поэтому у ближайших узлов могут быть одинаковые веса.

Есть ли эффективный подход?

1 Ответ

0 голосов
/ 11 октября 2018

Если я правильно понимаю ваш вопрос, вы хотите проверить близость между двумя точками (позициями), которые могут или не могут быть далеко друг от друга.

Проверкасначала выведите эту функцию:

int get_distance(std::pair<int, int> const pos_a, std::pair<int, int> const pos_b)
{
    auto const distance_x = pos_a.first >= pos_b.first ? pos_a.first - pos_b.first : pos_b.first - pos_a.first;
    auto const distance_y = pos_a.second >= pos_b.second ? pos_a.second - pos_b.second : pos_b.second - pos_a.second;
    if (distance_x != 0 && distance_y != 0)
        return int(round(sqrt(distance_x * distance_x + distance_y * distance_y)));
    if (distance_x == 0)
        return distance_y;
    return distance_x;
}

Здесь она вычисляет расстояние между двумя точками, вычитая его с наибольшим числом (отсюда два начальных выражения), а оператором является троичныйОператор .(Нажмите на ссылку, если вы не знаете, что это такое)

Третья строка - это оператор if, оценивающий, являются ли оба полученных расстояния ненулевым , потому что если они есть, тоони находятся на одной линии по вертикали или горизонтали ...

Если оба являются ненулевыми числами, то сумма квадратного корня из квадратов обоих расстояний x и yокругляется до ближайшего целого числа и затем преобразуется в целое число (поскольку тип возвращаемого значения int )

С другой стороны, если любой из них равен a ноль число (следовательно, на той же линии), тогда расстояние X или Y будет возвращено соответственно на основе оси линии (вертикальнойили Горизонтально, следовательно, distance_x == 0 и distance_y == 0)

Теперь, для вашей другой проблемы, viz. Близость, о которой упоминалось выше, одним из способов является объявление перечислителя, который хранитзначение для такого рода вещей ...

Пример:

enum Distance
{
    DISTANCE_VERY_CLOSE = 1,
    DISTANCE_CLOSE,
    DISTANCE_RELATIVELY_CLOSE,
    DISTANCE_RELATIVELY_FAR,
    DISTANCE_FAR,
    DISTANCE_VERY_FAR,
    DISTANCE_EXTREMELY_FAR
};

Тогда этот перечислитель будет отслеживать расстояние для вас, поэтому вам просто нужно использовать этот макрос для преобразования целого числа в Distance ( Перечислитель ) ...

#define TO_DISTANCE(distance) ((distance) > 7 ? Distance(7) : Distance(distance))

Это простой макрос, который просто приводит целое число к счетчику и бросает цифру 7, если расстояние больше 7 (следовательно, DISTANCE_EXTREMELY_FAR).Однако вы можете пойти дальше и добавить больше в перечислитель, если хотите.(Только не забудьте заменить 7 на значение, которое имеет последний enum член)

Пример использования вышеуказанного метода:

int main()
{
    auto const dist = TO_DISTANCE(get_distance(std::make_pair(20, 20), std::make_pair(30, 30)));
    accuracy *= dist; // Multiplying accuracy to distance (Hence, increases)
                      // Note: The accuracy needs to be at least 1 or more for this to work...
    // You can check the "closeness" like this...
    if (dist == DISTANCE_FAR)
        std::cout << "They are far away from each other" << std::endl;
    // Some other code goes here ...
    return 0;
}

С уважением

Ruks.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...