У меня есть ряд точек как: пуант (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)
Это изменяет относительные расстояния (?) и поэтому делает данные бесполезными в моих целях. Существует ли способ масштабировать эти координаты при сохранении их относительных расстояний неповрежденным?
Предполагая, что вы хотите, чтобы весь ваш набор данных был сосредоточен на (0,5, 0,5)
с диапазоном (0,1)
по обеим осям, проще всего подумать о полное преобразование необходимо в три этапа:
Px - = (maxX + minX) / 2
Py - = (maxY + minY) / 2
(- 0,5, 0,5)
: масштаб = max (maxX - minX, maxY - minY)
Px / = scale
Py / = scale
(0,5, 0,5)
, чтобы перенести все, куда хотите: Px + = 0,5
Py + = 0,5
Этот подход имеет то преимущество, что он отлично работает для любых заданных входных данных, а также заполняет как можно большую часть единичного квадрата при сохранении соотношения сторон (и, следовательно, относительных расстояний).
Шаг 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
.
Вам нужно масштабировать значения 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
до изменения масштаба, то и после изменения она будет вдвое дальше. Вы сможете легко доказать это с помощью теоремы Пифагора.
Чтобы расстояния были одинаковыми, их нужно масштабировать одним и тем же коэффициентом.
Я бы забыл о вычитании минимума (Примечание: эта часть верна только если точки всегда положительны, что является моим обычным вариантом), и просто разделил бы на максимум двух максимумов:
maxval = max(max(A.x), max(A.y)) #or however you find these
A.x = A.x/maxval
A.y = A.y/maxval
Если вы имеете в виду, что вы не сохраняете соотношение сторон: просто масштабируйте до минимального ограничивающего квадрата вместо минимального ограничивающего прямоугольника. Вы должны выбрать масштабный коэффициент по обеим осям до max (dx, dy).