Приветствую, немного загрузился с одним вопросом:
Определил себе некую область, на ней нарисовал белый прямоугольник(это типа полотно для будущего рисования). Сдвинул систему координат в нижний левый угол. Добавил масштабирование. Соответственно, теперь при изменении масштаба, когда мой прямоугольник не влазит в экран, мне надо добавить перемещение окна, т.е viewport-а в границах моей области(чтобы он не выходил за её границы) Вроде всё просто, используем glTranslatef(...) но не понимаю, как это правильно сделать, что-то не идёт это у меня :( Подскажите, может примерами покидаетесь. Ну или хотя бы на пальцах объясните :)
mPaperSize = new FXSize(8268, 11693); // 210x297 mm
mAreaSize = new FXSize(mPaperSize->w*2, mPaperSize->h*2);
void MainWindow::render()
{
mGLCanvas->makeCurrent();
glViewport(0, 0, mGLCanvas->getWidth(), mGLCanvas->getHeight());
glClearColor(0.85, 0.85, 0.85, 1.0);
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
// mAreaSize - моя область для рисования, на котором рисуется полотно,
// чтобы оставить некоторый отступ от полотна до края области
glOrtho(0, mAreaSize->w, 0, mAreaSize->h, -100, 100);
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
glScalef(mScaleFactor, mScaleFactor, mScaleFactor);
// начало положения листа
int x = 50;
int origin_x = mAreaSize->w/2 - mPaperSize->w/2;
int origin_y = mAreaSize->h/2 - mPaperSize->h/2;
FXPoint points[4] = { FXPoint(origin_x, origin_y),
FXPoint(origin_x + mPaperSize->w, origin_y),
FXPoint(origin_x + mPaperSize->w, origin_y + mPaperSize->h),
FXPoint(origin_x, origin_y + mPaperSize->h) };
// чтобы было видно начало системы координат
glBegin(GL_LINES);
glVertex2i(1, 1);
glVertex2i(1, 250);
glVertex2i(1, 1);
glVertex2i(100, 1);
glEnd();
glColor3f(1.0, 1.0, 1.0); //paper blank
glBegin(GL_QUADS);
glVertex2i(points[0].x-x, points[0].y+x*2);
glVertex2i(points[1].x-x, points[1].y+x*2);
glVertex2i(points[2].x-x, points[2].y+x*2);
glVertex2i(points[3].x-x, points[3].y+x*2);
glEnd();
glColor3f(0.0, 0.0, 0.0); // edging
glBegin(GL_LINE_LOOP);
glVertex2i(points[0].x-x, points[0].y+x*2);
glVertex2i(points[1].x-x, points[1].y+x*2);
glVertex2i(points[2].x-x, points[2].y+x*2);
glVertex2i(points[3].x-x, points[3].y+x*2);
glEnd();
mGLCanvas->swapBuffers();
mGLCanvas->makeNonCurrent();
}
// при масштабировании просто меняю коэффициент и перерисовываю
long MainWindow::onMouseWheel(FXObject*, FXSelector, void* ptr)
{
FXEvent *ev = (FXEvent*)ptr;
if(ev->code > 0)
mScaleFactor += 0.1;
else
mScaleFactor -= 0.1;
updateStatusBar();
render();
return 1;
}
Так же есть ещё один вопрос, как устанавливать коэффициент масштабирования? Т.е его лучше брать просто каким-то фиксированным, например 10, 100, 1000... или как-то высчитывать в соответствии с масштабом?