Выравнивание систем координат

Предположим, у меня есть 2 системы координат, как показано на рисунке введите описание изображения здесь

Как я могу выровнять эти системы координат? Я знаю, что мне нужно перевести вторую систему координат вокруг X с 180 gradleациями, а затем перевести ее на (0, 0) первой системы координат, но у меня есть некоторые проблемы с тем, что это приводит к неправильным результатам. Будем очень благодарны за подробный ответ.

EDIT: Фактически (0, 0) второй системы координат находится в той же точке, что и Y первой системы координат.

Важной информацией является то, где происхождение второй системы координат, а именно (a,b) .

Как только вы это знаете, все, что вам нужно, это:

 QPointF pos1; // original position QTransform t; t.scale(1, -1); t.translate(a, -b+1); QPointF pos2 = pos1 * t; 

Вы должны найти правильные значения a, b, c, d, Ox, Oy в:

X = a * x + b * y + Ox

Y = c * x + d * y + Oy

где x, y – координаты на точке в одной системе, а X, Y – в другой.

В вашем случае a = 1, b = 0, c = 0, d = -1. Ox, Oy – это смещение между Origins.

см. https://en.wikipedia.org/wiki/Change_of_basis

Вот проблема с поворотом на 180 gradleусов, это не только влияет на направление вашей координаты Y, но и на X.

 YX <- +
 ^ => |
 |  v
 + -> XY

То, что вы, вероятно, хотели сделать, это перевести точку на Y, а затем инвертировать Y-координату. Вы можете сделать это так:

  1. Перевести Y в новое происхождение
  2. Масштаб (1, -1)
 Y + -> X
 ^ => |
 |  v
 + -> XY

Подумав еще раз, я должен задаться вопросом, почему вы в первую очередь делаете это преобразование? Это связано с различиями в координатах OpenGL и координатами Qt для своего windows?

Если это так, вы можете изменить матрицу проекций … Если вы используете орфографическую матрицу, например:

Попробуйте glOrtho (0, X, 0, Y, -1, 1); вместо традиционного glOrtho (0, X, Y, 0, -1, 1);

Если вы решите сделать это, вам, вероятно, понадобится изменить направление обмотки ваших лицевых поверхностей многоугольника. OpenGL по умолчанию использует CCW, меняет его на glFrontFace (GL_CW) и это должно предотвращать странное поведение освещения / отбраковки.