对齐坐标系

时间:2013-08-31 17:54:55

标签: c++ qt opengl transformation

假设我有2个坐标系,如附图enter image description here

所示

如何对齐此坐标系?我知道我需要将第二个坐标系围绕X转换为180个梯度,然后将其转换为第一个坐标系的(0,0),但是我遇到了一些麻烦,因为它得到了错误的结果。真的很感激任何详细的答案。

编辑:实际上(0,0)的第二个坐标系与第一个坐标系的Y在同一个点上。

3 个答案:

答案 0 :(得分:2)

重要的信息是第二个坐标系的起源 - 即(a,b)

一旦你知道,你只需要:

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

答案 1 :(得分:0)

你必须在:

中找到正确的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

答案 2 :(得分:0)

这是旋转180度的问题,它不仅会影响Y坐标的方向,还会影响X.

Y             X <--+
^        =>        |
|                  v
+--> X             Y

你可能想做的是将点转换为Y然后反转你的Y坐标。你可以这样做:

  1. 将Y翻译为新的来源
  2. 比例(1,-1)
  3. Y             +--> X
    ^        =>   |
    |             v
    +--> X        Y
    


    经过深思熟虑,我不得不怀疑,你为什么要首先进行这种转变?是因为OpenGL坐标的差异和Qt用于窗口的坐标?

    如果是这种情况,您实际上可以更改投影矩阵...例如:如果您使用的是正交矩阵:

    尝试glOrtho (0, X, 0, Y, -1, 1);而不是传统的glOrtho (0, X, Y, 0, -1, 1);

    如果您选择这样做,您可能需要更改多边形“正面”的缠绕方向。 OpenGL默认为CCW,将其更改为glFrontFace (GL_CW),这可以防止奇怪的光照/剔除行为。