本文介绍了在OpenGL中调整大小时保持宽高比的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我实现了以下代码:
void TestGlPlot::resizeGL(int width, int height)
{
setupViewport(width, height);
}
void TestGlPlot::setupViewport(int width, int height)
{
/* Prevent divide by zero --------------------------------------------------------------------*/
if (height == 0) height = 1;
/* Calculate aspect ratio --------------------------------------------------------------------*/
float aspectRatio = (float)width / (float)height;
/* Set viewport to cover the window ----------------------------------------------------------*/
glViewport(0, 0, width, height);
/* Set aspect ratio --------------------------------------------------------------------------*/
glMatrixMode(GL_PROJECTION); /* switch to projection matrix */
glLoadIdentity();
/*
if (width >= height)
{
gluOrtho2D(-0.5*aspectRatio, 0.5*aspectRatio, 0.0, 1.0);
}
else
{
gluOrtho2D(-0.5, 0.5, 0.0*aspectRatio, 1.0*aspectRatio);
}
glMatrixMode(GL_MODELVIEW);
*/
gluOrtho2D(-1, 1, 0.0, 1.0);
glMatrixMode(GL_MODELVIEW);
}
void TestGlPlot::paintEvent(QPaintEvent *event) {
makeCurrent();
setupViewport(width(), height());
glMatrixMode(GL_MODELVIEW);
/* Set white background ----------------------------------------------------------------------*/
glClear(GL_COLOR_BUFFER_BIT);
glClearColor(255,255,255,0);
/* Paint OpenGL events -----------------------------------------------------------------------*/
glColor4f(1.0, 0.0, 0.0, 1.0);
/* light grey */
glColor4f(0.0, 0.0, 0.0, 0.3);
gluPartialDisk(plainQuad, 0.1, 1, 20, 4, -60, 120);
/* Paint QPainter events ---------------------------------------------------------------------*/
QPainter painter(this);
/* Draw grey border around plot --------------------------------------------------------------*/
painter.setPen(QColor("#808080"));
painter.drawRect(0, 0, width()-1, height()-1);
painter.setFont(font);
/* Translate coordinate system to (0,0) center -----------------------------------------------*/
QMatrix m;
m.translate(width()*0.5, height()*0.5);
painter.setMatrix(m);
/* Left side descriptions for radius ---------------------------------------------------------*/
painter.drawText(-0.17*width(), 0.38*height(), tr("100m"));
painter.drawText(-0.27*width(), 0.28*height(), tr("200m"));
painter.drawText(-0.37*width(), 0.18*height(), tr("300m"));
painter.drawText(-0.47*width(), 0.08*height(), tr("400m"));
painter.drawText(0.45*width(), -0.01*height(), tr("60°"));
painter.drawText(0.26*width(), -0.38*height(), tr("30°"));
painter.drawText(-0.47*width(), -0.01*height(), tr("300°"));
painter.drawText(-0.28*width(), -0.38*height(), tr("330°"));
painter.end();
}
我尝试了其他方法来调整大小(保持partialDisk对象的形状而不拉伸它),但是每种方法都失败了.我还想保留单位圆的坐标处理(这样我就可以将我的测量规格化并将其绘制到极坐标图中).
i tried different methods for resize handling (keeping the shape of the partialDisk object without stretching it) but every method failed. I also want to keep the coordinate handling of the unit-circle (so i can normalize my measurements and draw them into a polar-plot).
推荐答案
要保持长宽比,通常可以选择以下几种方式:
To keep the aspect ratio, you have several options in general:
- 始终缩放到一维.例如,您仅定义要始终看到水平范围[-0.5,0.5].在这种情况下,您必须通过系数(1/aspect_viewport)校正垂直范围.
- 使用一些等效的信箱.因此,您定义了一个始终希望完全看到的感兴趣区域",但是您可能会看到更多的宽度或高度,具体取决于窗口的纵横比(在观看带信箱的电影时,这基本上等同于黑条).有两种情况需要考虑:视口的纵横比区域的纵横比大,因此视域的纵横比更大.在这种情况下,您应该绘制完整高度并将水平范围扩大(aspect_viewport/aspect_region).否则,窗口的外观将低于您所在区域的外观,因此您应使用完整宽度并按(aspect_region/aspect_viewport)放大垂直范围.请注意,在两种情况下,该因子均为> = 1.
在您的代码中,您几乎实现了方法2,但是您获得了AspectRatio< 1例错误,应该是
In your code, you almost have implemented method 2, but you got the aspectRatio < 1 case wrong, it should be
if (width >= height)
gluOrtho2D(-0.5f*aspectRatio, 0.5f*aspectRatio, 0.0f, 1.0f);
else
gluOrtho2D(-0.5f, 0.5f, 0.0, 1.0/aspectRatio);
这篇关于在OpenGL中调整大小时保持宽高比的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!