Як конвертувати між двома різними двовимірними системами координат?


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

Я відчуваю, що це ДУЖЕ проста математика, але я чомусь не отримую цього.

Як можна перетворити надані координати в першу систему координат?


3
Якщо дві системи координат мають однакові базові вектори, ви можете просто використовувати коефіцієнт масштабування. Якщо вони не мають однакових базових векторів, необхідна зміна бази .
таладор

Відповіді:


7

Ви можете нормалізувати перше значення, це дасть вам значення в діапазоні [0,1]. Ви можете вважати це як відсоток X, відсоток значення співпадає між мінімальними та максимальними значеннями. Тоді ви можете дізнатися, де цей відсоток належить у вашій системі координат призначення, побачивши, яке значення становить 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;

Чому Java (C #)? Він не запитував код Java :)
kravemir

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 - джерельна система координат

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

Правка - пояснення математики

( 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)


Я також це подумав, але він не відображається належним чином: dump.tanaris4.com/sota.png Кінцева координата повинна потрапити там, де біле коло знаходиться внизу
Geesu

1
Це зовсім не пояснює їх математиці, чому ні? :)
MichaelHouse

@ Byte56 Для мене достатньо формули, щоб зрозуміти щось особливо, якщо воно використовує лише арифметичні операції, але я додав пояснення людям, які цього потребують :)
kravemir

1
@Geesu Тоді ти, мабуть, робиш щось інше погане (рендеринг матриць?).
kravemir

2
Дякуємо за оновлення. Я взагалі думаю, що краще дати відповідь, яка намагається пояснити, чому. Інакше ви просто даєте відповідь на це питання, а не як вирішити це питання та подібні проблеми. Це тип "дай людині рибу, навчи чоловіка ловити рибу".
MichaelHouse

3

Основне рівняння для двовимірної трансформації координат (в алгебрі без обертання):

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)

У вашому випадку для координати x

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

І, таким чином,

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

y координати дотримуйтесь тієї ж процедури


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 = початок.X, M32 = походження.Y. З огляду на матрицю системи координат A і матрицю системи координат B, P * A * Зворотний (B), де P - подання точки як координати в A, отримує подання точки як координати в B.
Джим Балтер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.