Myślę, że sprawdziłbym każdy punkt w macierzy i ustaliłam jej masę na podstawie jej sąsiadów. Masa za punkty spadnie z kwadratem odległości. Następnie możesz wybrać cztery najlepsze punkty w minimalnej odległości od siebie.
Oto trochę kodu Pythona, który pobiłem razem, aby zilustrować podejście do znalezienia masy dla każdego punktu. Niektóre konfiguracja za pomocą przykładową macierz:
matrix = [[1.0 if x == "X" else 0.0 for x in y] for y in """.XX......
.XXX..X..
.....XXX.
......X..
.XX......
.X.......
.X.......
....XX...
....XX...""".split("\n")]
HEIGHT = len(matrix)
WIDTH = len(matrix[0])
Y_RADIUS = HEIGHT/2
X_RADIUS = WIDTH/2
do obliczania masy dla danego punktu:
def distance(x1, y1, x2, y2):
'Manhattan distance http://en.wikipedia.org/wiki/Manhattan_distance'
return abs(y1 - y2) + abs(x1 - x2)
def mass(m, x, y):
_mass = m[y][x]
for _y in range(max(0, y - Y_RADIUS), min(HEIGHT, y + Y_RADIUS)):
for _x in range(max(0, x - X_RADIUS), min(WIDTH, x + X_RADIUS)):
d = max(1, distance(x, y, _x, _y))
_mass += m[_y][_x]/(d * d)
return _mass
Uwaga: Używam Manhattan dystansach (aka Cityblock, aka Taxicab Geometry) tutaj, bo don Uważa się, że dokładność przy użyciu odległości euklidesowych jest warta kosztu wywołania sqrt().
Iterując naszym matrycy budowy wykaz krotki jak (x, y, widmo mas (x, y))
point_mass = []
for y in range(0, HEIGHT):
for x in range(0, WIDTH):
point_mass.append((x, y, mass(matrix, x, y)))
Sortowanie listy na masę dla każdego punktu:
from operator import itemgetter
point_mass.sort(key=itemgetter(2), reverse=True)
Patrząc w górę 9 punktów w tym uporządkowanym wykazie:
(6, 2, 6.1580555555555554)
(2, 1, 5.4861111111111107)
(1, 1, 4.6736111111111107)
(1, 4, 4.5938888888888885)
(2, 0, 4.54)
(4, 7, 4.4480555555555554)
(1, 5, 4.4480555555555554)
(5, 7, 4.4059637188208614)
(4, 8, 4.3659637188208613)
Jeśli chcemy pracować od najwyższej do najniższej i filte R z dala punktów, które są zbyt blisko już widział punktów dostaniemy (robię to ręcznie odkąd zabrakło czasu, aby to zrobić w kodzie ...):
(6, 2, 6.1580555555555554)
(2, 1, 5.4861111111111107)
(1, 4, 4.5938888888888885)
(4, 7, 4.4480555555555554)
który jest całkiem intuicyjny wynik od samego patrzenia na twoją matrycę (zwróć uwagę, że współrzędne są zerowe w porównaniu do twojego przykładu).