Масштабировать 2D координаты и сохранить их относительные евклидовы расстояния в целости?

У меня есть ряд точек как: пуант (3302.34,9392.32), pointB (34322.32,11102.03), и т.д.

Я должен масштабировать их так, каждый x-и y-координата находятся в диапазоне (0.0 - 1.0). Я пытался делать это первым нахождением самого большого значения x в наборе данных (maximum_x_value) и самого большого значения y в наборе (minimum_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)

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

6
задан eiaxlid 15 March 2010 в 19:53
поделиться

5 ответов

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

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

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

8
ответ дан 8 December 2019 в 03:39
поделиться

Шаг 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 .

4
ответ дан 8 December 2019 в 03:39
поделиться

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

10
ответ дан 8 December 2019 в 03:39
поделиться

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

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

maxval = max(max(A.x), max(A.y)) #or however you find these
A.x = A.x/maxval
A.y = A.y/maxval
3
ответ дан 8 December 2019 в 03:39
поделиться

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

3
ответ дан 8 December 2019 в 03:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: