2012-07-03 40 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

相關問題