Если я правильно понимаю ваш вопрос, вы хотите проверить близость между двумя точками (позициями), которые могут или не могут быть далеко друг от друга.
Проверкасначала выведите эту функцию:
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.