GLint x, у;
};
void init (void)
{
glClearColor (0.0, 0.0, 1.0, 1.0) // Цвет окна выбран синим. glMatrixMode (GL_PROJECTION); gluOrtho2D (0.0, 200.0, 0.0, 150.0);
}
void displayFcn (void)
{
glClear (GL_COLOR_BUFFER_BIT);
}
void winReshapeFcn (GLint newWidth, GLint newHeight)
{
/* Обновление точки обзора и проекционных параметров. */ glViewport (0, 0, newWidth, newHeight); glMatrixMode (GL_PROJECTION); glLoadldentity ( );
gluOrtho2D (0.0, GLdouble (newWidth), 0.0,
GLdouble (newHeight));
/* Обновления параметров размера окна. */ winWidth = newWidth; winHeight = newHeight;
void drawLineSegment (scrPt endPtl, scrPt endPt2)
{
glBegin (GL_LINES) ;
glVertex2i (endPtl.x, endPtl.y); glVertex2i (endPt2.x, endPt2.y); glEnd ( );
}
void polyline (GLint button, GLint action, GLint xMouse,
GLint yMouse)
{
static scrPt endPtl, endPt2; if (ptCtr ==0) {
if (button == GLUT_LEFT_BUTTON && action == GLUT_DOWN) { endPtl.x = xMouse; endPtl.y = winHeight - yMouse; ptCtr = 1;
}
else
if (button == GLUT_RIGHT_BUTTON) // Выход из программы, exit (0);
}
else
if (button == GLUT_LEFT_BUTTON && action == GLUT_DOWN) { endPt2.x = xMouse; endPt2.y = winHeight - yMouse; drawLineSegment (endPtl, endPt2); endPtl = endPt2;
}
else
if (button == GLUT_RIGHT_BUTTON) // Выход из программы, exit (0);
glFlush ( );
}
void main (int arge, char** argv)
{
glutlnit (Sarge, argv);
glutlnitDisplayMode (GLUT_SINGLE | GLUT_RGB); glutlnitWindowPosition (100, 100); glutlnitWindowSize (winWidth, winHeight); glutCreateWindow ("Нарисовать интерактивную ломаную"); init ( );
glutDisplayFunc (displayFcn); glutRe shapeFunc (winRe shapeFcn); glutMouseFunc (polyline); glutMainLoop ( );
}
Другая процедура GLUT, которую можно использовать для работы с мышью, - это
glutMotionFunc (fcnDoSomething); Данная процедура вызывает fcnDoSomething при движении курсора мыши в окне с активизацией одной или нескольких клавиш мыши. Функция, вызываемая в этом случае, имеет два аргумента:
void fcnDoSomething (GLint xMouse, GLint yMouse)
Здесь (xMouse, yMouse) - положение мыши в окне на экране дисплея относительно верхнего левого экрана при перемещении мыши со щелчком.
Подобным образом можно выполнить некоторые действия при движении мышью в пределах окна без щелчков.
glutPassiveMotionFunc (fcnDoSomethingElse); Как и ранее, положение мыши возвращается в fcnDoSomethingElse как координата (xMouse, yMouse) относительно верхнего левого угла окна на экране дисплея.
ФУНКЦИИ GLUT (КЛАВИАТУРА)
Для задания процедуры, вызываемой при нажатии клавиши, используется следующая функция.
glutKeyboardFunc (keyFcn) ; Заданная процедура имеет три аргумента.
void keyFcn (GLubyte key, GLint xMouse, GLint yMouse)
Параметру key присваивается символьное значение или соответствующий код ASCII. Положение мыши в окне на экране дисплея возвращается как точка (xMouse, уМоиэе) относительно верхнего левого угла окна. При нажатии обозначенной клавиши на основе положения мыши можно инициировать некоторое действие, независимо от того, нажата ли еще какая-то кнопка мыши.
В приведенном ниже коде представлена простая процедура рисования кривых с использованием ввода с клавиатуры. Построенная от руки кривая генерируется движением мыши в окне дисплея при нажатой клавише <с>. В результате получается последовательность красных точек в каждой записанной точке, по которой прошлась мышь. Медленно двигая мышью, можно получить сплошную кривую линию. В данном примере щелчки мышью не производят никакого эффекта. Пример выхода этой программы показан на рис. 11.14.