C++ 对齐坐标系

C++ 对齐坐标系,c++,qt,opengl,transformation,C++,Qt,Opengl,Transformation,假设我有两个坐标系,如所附图片所示 如何对齐此坐标系?我知道我需要将第二个坐标系转换为180度的X坐标系,然后将其转换为第一个坐标系的(0,0),但我遇到了一些麻烦,因为这样做会得到错误的结果。非常感谢您的详细答复 编辑:实际上,第二个坐标系的(0,0)与第一个坐标系的Y位于同一点上。您必须在以下坐标系中找到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

假设我有两个坐标系,如所附图片所示

如何对齐此坐标系?我知道我需要将第二个坐标系转换为180度的X坐标系,然后将其转换为第一个坐标系的(0,0),但我遇到了一些麻烦,因为这样做会得到错误的结果。非常感谢您的详细答复


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

您必须在以下坐标系中找到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是两个原点之间的偏移量


请参见

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

Y X <--+ ^ => | | v +--> X Y Y X| |五 +-->xy 您可能想做的是平移Y点,然后反转Y坐标。您可以这样做:

  • 将Y转换为新原点
  • 比例(1,-1)
  • Y+-->X ^ => | |五 +-->xy
    经过深思熟虑,我不禁要问,你为什么要首先进行这种转变?这是因为OpenGL坐标和Qt用于其窗口的坐标不同吗

    如果是这种情况,你可以改变你的投影矩阵。。。例如,如果使用正交矩阵:

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


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

    重要的信息是第二个坐标系的原点在哪里-即
    (a,b)

    一旦你知道了这一点,你所需要的就是:

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

    谢谢你的回答,但我不确定它是否适合我。如果我理解清楚的话,你写的方程实际上是旋转矩阵和平移矩阵(在这个例子中是向量)。其中a=cos(180),b=-sin(180),c=sin(180),d=cos(180)。但问题是,例如,当将此应用于glwidget时,在widget中绘制的任何内容都是在第一个坐标系中给出的(尽管鼠标坐标是在第二个坐标系中得到的),如果我跟踪鼠标位置,并单击第一个坐标系的(1,1),输出将不是(1,1)。您错过了同质部分(每个轴都可能)。您的值是a=d=-1,这是一个旋转。在我的例子中,y轴是镜像的(没有旋转)。在这种情况下,你真的只是移动Y的原点并翻转Y坐标吗?你应该能够乘以一个适当的平移矩阵和一个Y为-1的比例矩阵。旋转180度也会反转你的X坐标,根据图表判断,你只想反转Y。或者,你可以旋转,然后将X倒转回去;没有参考点来显示两个图中的原点是如何真正相关的。@Andon M.Coleman我需要将第二个坐标系的(0,0)放到第一个坐标系的(0,0)上,并将Y绕X旋转,这样结果只有第一个坐标系(因此第二个坐标系中的任何点都将与第一个坐标系中的点相同)。请注意,旋转无法解决此问题。实际上,这里有两个问题。Y坐标系正在改变方向,但X(应该)保持不变。如果旋转180度,则点位于(-Y,X)将脱离屏幕。您需要使用(-Y,-X)。
    QPointF pos1; // original position
    QTransform t;
    t.scale(1, -1);
    t.translate(a, -b+1);
    QPointF pos2 = pos1 * t;