2010-03-15 3 views
5

У меня есть множество точек, такие как: (3302.34,9392.32 точки А), pointB (34322.32,11102.03) и т.д.Масштабировать 2D-координаты и сохранить их относительные евклидовые расстояния целыми?

мне нужно масштабировать их, так что каждый х- и у-координаты находится в диапазоне (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

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

ответ

3

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

3

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

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

maxval = max(max(A.x), max(A.y)) #or however you find these 
A.x = A.x/maxval 
A.y = A.y/maxval 
+0

Это не будет работать, если входные значения могут быть отрицательными. – tzaman

+0

Входные значения никогда не являются отрицательными. Я также использовал тот подход, о котором вы упомянули, но поскольку мои очки не идут от 0.0 до 20000.0 и т. Д., Но более типично 19000.0 - 20000.0, если я не вычитаю минимальное значение, все точки попадают в угол 0-1 .... Я делю все точки на одно и то же значение, хотя (maximum_value - minimum_value всегда одно и то же). Если я правильно вас понимаю, это значит, что они сохраняют свои относительные расстояния? – eiaxlid

+0

Мой подход вычитает центральную точку из каждого диапазона, поэтому у вас не будет проблемы с «углом». Вычитание минимальных произведений тоже, но тогда данные не центрируются на '(0,5, 0,5)'. Относительные расстояния должны поддерживаться до тех пор, пока вы сохраняете одинаковый масштабный коэффициент, да. – tzaman

10

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

7

Предполагая, что вы хотите весь набор данных, которые будут сосредоточены на (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

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

+0

Не уверен, что первый шаг верен. Не работает, когда minX/minY меньше 0 и некорректно, когда больше нуля. Попробуйте 'Px - = minX + ((maxX - minX)/2)' и 'Py - = minY + ((maxY - minY)/2)' – swdev

+0

@swdev, вы правы, это было не так, но правильный ответ это просто '(max + min)/2', так как мы хотим найти среднюю точку и вычесть ее. Исправлено, спасибо за математическую проверку! – tzaman

4

Шаг 1: Re-Расположить происхождение
Пусть ваш новый "происхождение" быть (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.

Смежные вопросы