Определение ближайших точек к одной координате (двухмерной)
Имеется сетка 10 на 10, а также рандомная точка, которая может быть как в центре созданной сетки, так и в углу или у её "стенки"
Как можно определить ближайшие к этой рандомной координате [i, j] точки, которые её окружают? К примеру, имеется точка [5, 6]. Ближайшие точки, которые её окружают (к ней примыкают), будут ([4, 5], [5, 5], [6, 5], [4, 6], [6, 6], [4, 7], [5, 7], [6, 7]). Если точка в углу - [10, 1], то окружающие её будут ([10, 2], [9, 1], [9, 2]), если у стенки - [5, 10], то ([4, 9], [5, 9], [6, 9], [6, 10], [4, 10])
Предполагаю, что это можно сделать с помощью евклидового расстояние и функции min() c параметром key, но как именно- не могу понять.
Ответы (2 шт):
Условие наверняка как-то попроще можно записать, но сходу не придумал:
def near_points(x, y, arr):
return [(a,b) for a,b in arr if abs(a-x) <= 1 and abs(b-y) <= 1 and (x != a or y != b)]
points = [(x,y) for x in range(1,11) for y in range(1,11)]
print(near_points(5, 6, points))
print(near_points(10, 1, points))
print(near_points(5, 10, points))
Вывод:
[(4, 5), (4, 6), (4, 7), (5, 5), (5, 7), (6, 5), (6, 6), (6, 7)]
[(9, 1), (9, 2), (10, 2)]
[(4, 9), (4, 10), (5, 9), (6, 9), (6, 10)]
P.S. Упростить выражение можно так, но будет ли так быстрее и понятнее - не уверен:
if 0 < (a-x) ** 2 + (b-y) ** 2 <= 2
А с функцией min тут не получится, потому что она выдаёт только одно значение. Можно было бы поискать минимальное расстояние через неё, но вы его и так знаете - это 1 по одной из координат (и 1 или 0 по другой).
function getSurroundingPoints(p, m, n) {
const res = [];
for (let i = Math.max(1, p[0] - 1); i <= Math.min(p[0] + 1, m); i++)
for (let j = Math.max(1, p[1] - 1); j <= Math.min(p[1] + 1, n); j++)
if (i != p[0] || j != p[1])
res.push([i, j])
return res;
}
console.log(JSON.stringify(getSurroundingPoints([5, 6], 10, 10)));
console.log(JSON.stringify(getSurroundingPoints([10, 1], 10, 10)));
console.log(JSON.stringify(getSurroundingPoints([5, 10], 10, 10)));