Масштабировать 2D-координаты и сохранять их относительные евклидовы расстояния нетронутыми? - PullRequest
6 голосов
/ 15 марта 2010

У меня есть набор точек, таких как: точка A (3302,34,9392,32), точка B (34322,32,11102,03) и т. Д.

Мне нужно масштабировать их так, чтобы каждая x- и y-координата находилась в диапазоне (0.0 - 1.0). Я попытался сделать это, сначала найдя наибольшее значение x в наборе данных (Maximum_x_value) и наибольшее значение Y в наборе (imum_y_value). Затем я сделал следующее:

pointA.x = (pointA.x - minimum_x_value) / (maximum_x_value - minimum_x_value)
pointA.y = (pointA.y - minimum_y_value) / (maximum_y_value - minimum_y_value)

Это изменяет относительные расстояния (?) И, следовательно, делает данные бесполезными для моих целей. Есть ли способ масштабировать эти координаты, сохраняя их относительные расстояния без изменений?

Ответы [ 5 ]

10 голосов
/ 15 марта 2010

Вам необходимо масштабировать значения x и y на одинаковую величину! Я бы предложил масштабировать по большему из двух диапазонов (либо x, либо y). В псевдокоде у вас будет что-то вроде

scale = max(maximum_x_value - minimum_x_value,
            maximum_y_value - minimum_y_value)

Тогда все расстояния между точками будут масштабированы на scale, что, как я полагаю, вы запрашиваете, поэтому, если точка p_1 была вдвое дальше от точки p_2, чем от p_3 до масштабирования , это будет вдвое больше, чем после масштабирования. Вы должны легко доказать это себе, используя теорему Пифагора.

8 голосов
/ 15 марта 2010

Если вы хотите, чтобы весь набор данных был центрирован на (0.5, 0.5) с диапазоном (0,1) по обеим осям, проще всего представить общее преобразование, необходимое в три этапа:

  1. Центрируйте данные о происхождении:
    P.x -= (maxX + minX) / 2
    P.y -= (maxY + minY) / 2
  2. Уменьшите его на одинаковую величину в обоих измерениях так, чтобы больший из двух диапазонов стал (-0.5, 0.5):
    scale = max(maxX - minX, maxY - minY)
    P.x /= scale
    P.y /= scale
  3. Переведите точки на (0.5, 0.5), чтобы привести все, где вы хотите:
    P.x += 0.5
    P.y += 0.5

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

4 голосов
/ 15 марта 2010

Шаг 1: Переместите местоположение источника
Пусть ваше новое «происхождение» будет (minimum_x_value, minimum_y_value). Сдвиньте все свои точки данных, вычитая minimum_x_value из всех x-координат и вычитая minimum_y_value из всех y-координат.

Шаг 2: нормализовать оставшиеся данные
Уменьшите оставшиеся данные, чтобы они уместились в окне 0,0-1,0. Найдите max_coord как наибольшее из вашего максимального значения x или вашего максимального значения y. Разделите все x- и y-координаты на max_coord.

3 голосов
/ 15 марта 2010

Вы должны масштабировать их с тем же коэффициентом, чтобы сохранить одинаковые расстояния.

Я бы забыл о вычитании минимума (Примечание: эта часть верна, только если точки всегда положительные, что является моим обычным вариантом использования), и просто разделил бы на максимум двух максимумов:

maxval = max(max(A.x), max(A.y)) #or however you find these
A.x = A.x/maxval
A.y = A.y/maxval
3 голосов
/ 15 марта 2010

Если вы имеете в виду, что не соблюдаете пропорции: просто масштабируйте до минимального ограничивающего квадрата вместо минимального ограничивающего прямоугольника. Вы должны выбрать масштабный коэффициент по обеим осям до максимального значения (dx, dy).

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