Вы можете вычислить наименьшую из разностей x и y (разница в окне относительно расстояния пересечения края) следующим образом:
game_width = 640
game_height = 480
def smaller_xy(point1, point2):
xdiff = abs(point1.x - point2.x)
if xdiff > (game_width / 2):
xdiff = game_width - xdiff
ydiff = abs(point1.y - point2.y)
if ydiff > (game_height / 2):
ydiff = game_height - ydiff
return xdiff, ydiff
То есть, если расстояние в окне вx или y направления больше, чем половина размера окна в этом направлении, лучше отойти от края - и в этом случае расстояние будет размером окна в этом направлении минус исходное расстояние в окне.
Очевидно, что после разделения x и y вы можете вычислить расстояние между точками следующим образом:
import math
small_x, small_y = smaller_xy(p1, p2)
least_distance = math.sqrt(small_x**2 + small_y**2)
Однако, в зависимости от того, как определен ваш расчет силы, вы можете обнаружить, что всена самом деле нужен квадрат расстояния (просто (small_x**2 + small_y**2
)), и поэтому вы можете избежать работы по поиску sqrt
.
Чтобы перевести это значение в scipy.pdist
, обратите внимание, что pdist
может вызываться с аргументом функции в дополнение к точкам, как:
Y = pdist(X, func)
Это последняя форма вызова, показанная в описании pdist
в https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.distance.pdist.html#scipy.spatial.distance.pdist
Вы должны иметь возможность использовать эту функцию, чтобы pdist
строил свою матрицу расстояний между всеми парами точек на основе расстояний, рассчитанных функцией обратного вызова, которая применяет smaller_xy
вычисление.