В общем пишу в Visual C++ 6.0 лабораторную по Комп геометрии и графике.
Задача: Масштабирование прямоугольника и треугольника в противофазе. При нажатии ЛКМ фигуры масштабируются. При ПКМ - в дефолтное состояние.
На данный момент fig0 уменьшается, а fig1 увеличивается. Но масштабирование начинается не от исходных размеров фигур, а от начала координат.
Во так это выглядит( фигуры большего размера - дефолтные fig0(); и fig1(); ) :
Как достичь именно масштабирования фигур, чтобы изменялись начальные размеры заданных фигур. И еще, как видно из скрина - увеличение значения координаты x ведет к движению треугольника вправо( с прямоугольником таже ситуация), что логично, но требуется достичь эффекта зума. Например у треугольника - точка 6,0 оставалась недвижимой, а остальные увеличивались.
Гугл выдал похожую тему
http://www.cyberforum.ru/graphics/thread109534.html , но тот метод, что там описан ( пересчитывание координат) был мною непонят). Прошу обьяснить как именно реализовать нужное масштабирование.
Листинг:
#include <GL/glut.h>
#include <stdlib.h>
#include <math.h>
#include <windows.h>
#define PI 3.1459
GLfloat R=880.0/640;
GLfloat w=40 ;
GLfloat h;
GLfloat q,n,e,a,s,d=0;
GLfloat l, r, b, t;
void init(void)
{
h=w/R; l=-w/2; r=w/2; b=-h/2; t=h/2;
glClearColor(0,0,0,0);
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(l, r, b, t);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void showAxis(void)
{ glColor3f(0.0f,0.0f,1.0f);
glBegin(GL_LINES);
glVertex2f(0,0);
glVertex2f(0,t);
glVertex2f(0,0);
glVertex2f(r,0);
glEnd();
}
void fig0(void)
{ glColor3f(1,1,1);
glBegin(GL_LINE_LOOP);
glVertex2f(6,6);
glVertex2f(6,9);
glVertex2f(9,9);
glVertex2f(9,6);
glEnd();
}
void fig1(void)
{
glColor3f(1,1,1);
glBegin(GL_LINE_LOOP);
glVertex2f(6,0);
glVertex2f(6,4);
glVertex2f(9,0);
glEnd();
}
void mouse(int button, int state, int x, int y)
{
if (button == GLUT_LEFT_BUTTON )
{
q+=0.1;n+=0.1;
a-=0.1;s-=0.1;
}
if(button == GLUT_RIGHT_BUTTON)
{
q=0;n=0;
a=0;s=0;
}
glutPostRedisplay();
}
void scene(void)
{
glClear(GL_COLOR_BUFFER_BIT);
showAxis();
fig0(); fig1();
glPushMatrix();
glScalef(q,n,0);
fig1();
glPopMatrix( );
glPushMatrix();
glScalef(a,s,0);
fig0();
glPopMatrix( );
glFlush();
}
void main(int argc, char **argv)
{ glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(640,480);
glutInitWindowPosition(20,20);
glutCreateWindow("scale");
glutDisplayFunc(scene);
glutMouseFunc(mouse);
init();
glutMainLoop();
}
Пользователь решил продолжить мысль 19 Октября 2010, 22:30:42:
я так понял что у меня что то не так в функции mouse(), так как без нее фигуры масштабируются почти как надо( со смещением по оси х).