Как конвертировать между двумя разными 2D системами координат?

10

Я пытаюсь преобразовать координату из одной системы координат в другую, чтобы нарисовать ее на изображении.

В основном система координат назначения выглядит следующим образом:

X range: 0 to 1066
Y range: 0 to 1600

(просто стандартное изображение, которое я рисую размером 1066 x 1600)

Позиция, которую я пытаюсь нарисовать на изображении, имеет точно такой же размер, но система координат отличается. Диапазон всех координат составляет 1066x1600.

Но пример с координатами:

(111.33f, 1408.41f)
(-212.87f, 1225.16f)

Диапазон этой системы координат:

X range: -533.333 to 533.333
Y range: 533.333 to 2133.333

Я чувствую, что это ОЧЕНЬ простая математика, но по какой-то причине я не понимаю.

Как я могу преобразовать предоставленные координаты в первую систему координат?

Geesu
источник
3
Если две системы координат имеют одинаковые базовые векторы, вы можете просто использовать коэффициент масштабирования. Если у них нет одинаковых базовых векторов, необходимо изменить базу .
thalador

Ответы:

7

Вы можете нормализовать первое значение, это даст вам значение в диапазоне [0,1]. Вы можете думать об этом как о проценте Х, процентном значении, которое соответствует значению между минимальным и максимальным значениями. Затем вы можете найти, где этот процент принадлежит в вашей системе координат назначения, посмотрев, какое значение составляет X процентов через систему назначения. Я буду использовать Java-код в качестве примера языка, я уверен, что концепции достаточно ясны для перевода на любой язык.

Так что нормализуйте

public static float normalize(float value, float min, float max) {
    return Math.abs((value - min) / (max - min));
}

Используя ваш пример, вы должны ввести:

xPercent = normalize(x,0,1066);

Затем найдите, где он лежит в системе назначения. С чем-то вроде

destX = xPercent*(Math.abs(max-min)) + min;

Или использовать ваши ценности:

destX = xPercent*(Math.abs(533.33--533.33)) + -533.33;

Так, например, со значением x, равным 1000, вы должны сопоставить его с вашей системой координат назначения 467.29.

В качестве альтернативы , если системы координат всегда будут одинаковыми, вы можете предварительно рассчитать соотношение между ними.

Так:

xRatio = (Math.abs(srcMax-srcMin))/(Math.abs(destMax-destMin));

destX = x*xRatio+destMin;
MichaelHouse
источник
Почему Java (C #)? Он не просил Java-код :)
Кравемир
6
Это привести пример. Его не нужно использовать как есть, и концепция достаточно ясна.
MichaelHouse
Но если я сделаю это: destX = xPercent * (Math.abs (533.33--533.33)) + -533.33; Я всегда получаю отрицательное значение, и система координат результата находится в диапазоне 0-1066. Должен ли я переключать все координаты?
Geesu
Поменял их, и я все еще получаю dump.tanaris4.com/sota.png, как в другом посте, может быть, у меня вообще есть другая проблема (связанная с C # и рисованием). Спасибо, парни!
Geesu
Понял, по какой-то причине мне пришлось сделать xPercent = 1.0f - xPercent
Geesu
4

Это простая математика:

res = ( src - src_min ) / ( src_max - src_min ) * ( res_max - res_min ) + res_min

src - исходная система координат

res - система координации результатов

Редактировать - объяснение математики

( src - src_min ) / ( src_max - src_min )переводит его в систему координат, начинающуюся с нуля с равной длиной исходной системы координат (0.0, src_max - src_min ). Затем он масштабирует значение в систему координат (0.0, 1.0).

* ( res_max - res_min ) это масштабирует значение до системы координат, начинающейся с нуля с длиной системы координат результата (0.0, dst_max - dst_min)

+ res_min переводит значение в результирующую систему координат (dst_min, dst_max)

kravemir
источник
Я тоже так думал, но он не отображается должным образом: dump.tanaris4.com/sota.png Конечная координата должна попасть туда, где внизу находится белый круг
Geesu
1
Это совсем не объясняет их математику, почему бы и нет? :)
MichaelHouse
@ Byte56 Для меня достаточно формулы, чтобы понять что-то, особенно если она использует только арифметические операции, но я добавила объяснение людям, которым это нужно :)
kravemir
1
@Geesu Тогда вы, вероятно, делаете что-то еще плохое (рендеринг матриц?).
Кравемир
2
Спасибо за обновление этого. Я вообще думаю, что лучше дать ответ, который пытается объяснить почему. В противном случае вы просто даете ответ на этот вопрос, а не как решить этот вопрос и подобные проблемы. Это типа "дай человеку рыбу, научи человека ловить рыбу".
MichaelHouse
3

Основное уравнение для преобразования 2D-координат (в алгебре, без вращения):

TargetCoordinate = TranslateFactor + ScalingFactor*SourceCoordinate

заданы две точки в TargetCoordinate (T1, T2), которые соответствуют двум точкам в SourceCoordinate (S1, S2) TranslateFactorи ScalingFactorданы путем решения:

T1 = TranslateFactor + ScalingFactor*S1
T2 = TranslateFactor + ScalingFactor*S2

какой результат:

TranslateFactor = (T2*S1 - T1*S2) / (S1 - S2)
ScalingFactor   = (T2 - T1) / (S2 - S1)

В вашем случае для координаты х

S1 = 0    -> T1 = -533.333
S2 = 1066 -> T2 = 53.333

И поэтому,

TranslateFactor = -533.333
ScalingFactor   = 1.000625
=> TargetCoordinate = (-533.333) + (1.000625)*SourceCoordinate

координату у следуйте той же процедуре

tkokasih
источник
S1 и S2 не могут иметь одинаковую координату x / y, что приводит к делению на ноль.
zwcloud
0

Делая несколько предположений:

  • Вы (в конечном счете) интересуетесь имплементацией матрицы, для удобства и власти; а также
  • Вы знакомы с однородными координатами.

Тогда вопрос переносится на: Какова матрица однородного преобразования для моего изменения базиса?

Чтобы ответить на этот вопрос, нам нужны ответы на три дополнительных вопроса:

  1. Куда переехал мой источник?
  2. Что случилось с моей осью X? Пусть (M11, M12) - координаты точки
  3. Что случилось с моей осью Y?

Определите ответы на эти три вопроса следующим образом:

  1. (M31, M32) - это координаты нового начала координат в исходной системе координат.
  2. (M11, M12) - координаты нового единичного x-вектора в исходной системе координат.
  3. (M21, M22) - координаты нового единичного y-вектора в исходной системе координат.

Тогда матрица однородного преобразования имеет вид:

( M11, M12,  0 )
( M21, M22,  0 )
( M31, M32,  1 )

Мое соглашение здесь состоит в том, что точки представлены векторами строк, что является обычным соглашением компьютерной графики; математики и физики часто используют противоположное.

Питер Гиркенс
источник
Система координат может быть описана такой матрицей: M11 = Xaxis.X, M12 = Xaxis.Y, M21 = Yaxis.X, M22 = Yaxis.Y, M31 = origin.X, M32 = origin.Y. Учитывая матрицу системы координат A и матрицу системы координат B, P * A * Inverse (B), где P - представление точки в виде координат в A, дает представление точки в виде координат в B.
Джим Балтер