2012-07-03 38 views
4

我有以下的坐标系中的一个点:点(50,-50)的JFrame <->的OpenGL

的Java AWT:

0,0|------------------------| 
    |      | 
    | (middle p. 400,300) | 
    |      | 
    |------------------------|800,600 

,我想将其转换为以下系统:

的OpenGL

50,50|------------------------| 
     |      | 
     |  (middle p. 0,0) | 
     |      | 
     |------------------------|-50,-50 

的我的想法我该怎么做?

回答

5

通常,您要做的是从(矩形)坐标系A转换到坐标系B

第一地图源坐标系统,A到归一化的范围[0, 1]

double nx = x/(x1 - x0); 
double ny = y/(y1 - y0); 

(x0, y0)是左上角和(x1, y1)是右下角。然后,它映射到新的坐标系:

double px = X0 + nx * (X1 - X0); 
double py = Y0 + ny * (Y1 - Y0); 

哪里(X0, Y0)是你的新的坐标系的左上角和(X1, Y1)是新坐标系的右下角。

这将适用于任何两个直角坐标系。

+0

谢谢我试过你的配方,效果非常好!太糟糕了,我还不能给点... – RandomGuy

+0

这应该适用于3D矩形的权利?我没有看到任何理由为什么它不应该通过计算相同的nz和pz为第三维工作。我错过了任何观点吗? – Wizard

+0

@ Wizard:当然,假设尺寸是笛卡尔坐标。这也可以在n维中工作。 –

2
public Point awtToOpenGL(Point p) { 
    Point newP = new Point(); 
    newP.setX(50 - (p.getX()/8)); 
    newP.setY(50 - (p.getY()/6)); 
    return newP; 
} 

[编辑]得到错误的原点。新的尝试。

由于openGL系统的宽度为100,AWT的宽度为800,我们需要将x值除以8.通过相同的逻辑,y需要除以6.由于x和y从50开始并下降我们所需要做的就是从50中减去该值。

+0

你好,非常感谢你的帮助,但是看起来它没有完全正确地工作在我应该得到的位置(50,50)我得到了(50,-50)。更确切地说,在opengl的左上顶点。 – RandomGuy

+0

是的,我的起始坐标错了。这应该工作,但。 – Keppil

+0

谢谢!你能解释一下它的工作原理吗? 8号和6号从哪里来?从800x600?再次感谢。 – RandomGuy

相关问题