2010-12-02 81 views
3

我有一個Windows(XP)應用程序需要在一個窗口內顯示一個二維矩形。該矩形不能被剪裁(即必須總是完全躺在視口內),並且必須保持其調整大小的縱橫比。目前,處理佈局的方法會扭曲矩形的長寬比以匹配窗口。我想要矩形縮放到窗口並居中在窗口中(再次,沒有剪輯)。現在的方法如下。 lWinDist和lMaxDepth是要被顯示的矩形的寬度和高度(在一英寸的48ths,如果它的事項):在調整窗口大小時保留二維對象的縱橫比

void CRoRRecView::RedoLayout(long lWinDist, long lMaxDepth) 
{ 
    CDC* pDC = GetDC() ; 

    if (pDC != NULL) 
    { 
     m_lWinDist = lWinDist; 
     GetClientRect(m_rectClient) ; 
     int nClientWidth = m_rectClient.Width(); 
     int nClientHeight = m_rectClient.Height(); 
     glViewport(0, 0, nClientWidth, nClientHeight); 

     glMatrixMode(GL_PROJECTION); 
     glLoadIdentity(); 

     m_fWinXDist = (float) lWinDist ; 
     m_fWinYDist = lMaxDepth ; 
     m_fAspectRatio = m_fWinXDist/m_fWinYDist; 

     glOrtho(0.0, m_fWinXDist, 0.0, m_fWinYDist, -1, 1) ; 

     glRotatef(180.0, 0,1,0); 
     glTranslatef((float)(-1 * lWinDist),0,0); // Translate across the x axis 

     glMatrixMode(GL_MODELVIEW); 
     glLoadIdentity(); 

     ReleaseDC(pDC) ; 
    } 
} 

回答

3

這應該規模按預期:

// g++ main.cpp -lglut -lGL 
#include <GL/glut.h> 

void display() 
{ 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    double w = glutGet(GLUT_WINDOW_WIDTH); 
    double h = glutGet(GLUT_WINDOW_HEIGHT); 
    double ar = w/h; 
    glOrtho(-2 * ar, 2 * ar, -2, 2, -1, 1); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    glColor3ub(255, 0, 0); 
    glBegin(GL_QUADS); 
    glVertex2i(-1, -1); 
    glVertex2i( 1, -1); 
    glVertex2i( 1, 1); 
    glVertex2i(-1, 1); 
    glEnd(); 

    glutSwapBuffers(); 
} 

int main(int argc, char **argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE); 
    glutInitWindowSize(640, 480); 
    glutCreateWindow("Aspect Ratio"); 
    glutDisplayFunc(display); 
    glutMainLoop(); 
    return 0; 
} 
0

嘗試這種情況:

#include <GL/glut.h> 

size_t win_w = 0; 
size_t win_h = 0; 

void display(void) 
{ 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(0, win_w, 0, win_h, -1, 1); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    glColor3ub(255,0,0); 
    glPushMatrix(); 
     glTranslatef(win_w/2,win_h/2,0); 
     glScalef(50,50,50); 
     glBegin(GL_QUADS); 
      glVertex2f(-1,-1); 
      glVertex2f(1,-1); 
      glVertex2f(1,1); 
      glVertex2f(-1,1); 
     glEnd(); 
    glPopMatrix(); 

    glFlush(); 
    glutSwapBuffers(); 
} 

void reshape(int w, int h) 
{ 
    win_w = w; 
    win_h = h; 
    glViewport(0, 0, w, h); 
} 

int main(int argc, char **argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE); 

    glutInitWindowSize(800,600); 
    glutCreateWindow("Aspect Ratio"); 

    glutDisplayFunc(display); 
    glutReshapeFunc(reshape); 
    glutMainLoop(); 
    return 0; 
} 
+1

謝謝。但是,雖然保持對象的縱橫比和居中,但窗口大小不會調整大小。也就是說,如果物體開始佔據窗口高度的3/4,則在調整大小後,它總是佔據窗口高度的3/4。 – PSU 2010-12-03 22:21:19

+0

@PSU:是的,你說得對。我有一個稍微不同的版本,做了正確的事情,我會看看我是否可以把它拉起來。 – genpfault 2010-12-04 00:26:15

1

試試這個整形功能。它將保持您的寬高比,調整對象大小,並使視口集中。

// initial window screen size 
int WIDTH = 400; 
int HEIGHT = 300; 

// reshape function, call with glutReshapeFunc(reshape) in yout main function 
void reshape(int width, int height) { 
    const float ar_origin = (float) WIDTH/(float) HEIGHT; 
    const float ar_new = (float) width/(float) height; 

    float scale_w = (float) width/(float) WIDTH; 
    float scale_h = (float) height/(float) HEIGHT; 
    if (ar_new > ar_origin) { 
     scale_w = scale_h; 
    } else { 
     scale_h = scale_w; 
    } 

    float margin_x = (width - WIDTH * scale_w)/2; 
    float margin_y = (height - HEIGHT * scale_h)/2; 

    glViewport(margin_x, margin_y, WIDTH * scale_w, HEIGHT * scale_h); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(0, WIDTH/ar_origin, 0, HEIGHT/ar_origin, 0, 1.0); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity() ; 
} 
0

我想你應該看看這個以得到正確的數字:

self.hOffset = (self.wOffset/(16.0/9.0)); 
self.xOffset = ((int)ceil((_backingWidth/2.0) - ((_backingWidth + self.wOffset)/2.0))); 
self.yOffset = ((int)ceil((_backingHeight/2.0) - ((_backingHeight + self.hOffset)/2.0))); 

glViewport(self.xOffset, self.yOffset, _backingWidth + self.wOffset, _backingHeight + self.hOffset); 

在上面的代碼,wOffset,這是圖像的寬度,或採取它的值通過改變滑塊。第一行增加高度,因爲寬度以正確的比例增加,恰好爲16:9(將寬度除以高度以得到比率效果不佳,明確指定它的效果最好)。接下來的兩行調整圖像的x,y座標,使其隨着大小的增加或減小而始終保持居中。

這是迄今爲止更簡單,更簡單的方法 - 在GPU上更輕。如果我在這裏看到的超級編碼方法有更好的理由,我無法弄清楚。祝你好運。

相關問題