if(button -= GLUT_LEFT_BUTTON && state GLUT_D0WN)
{
corner[numCorners] .x - x:
corner[numCorners] .y - screenHeight - y; // flip у coordinate // зеркально отражаем координату у
numCorners++: // have another point // имеем другую точку
if (numCorners == 2)
{
glRecti(corner[0].x. corner[0].y. corner[l].x. corner[l].y):
numCorners =0: // back to 0 corners // назад к corners - 0 }
}
else if(button - GLUT_RIGHT && state - GLUT_D0WN) glClear(GL_COLOR_BUFFER_BIT): // clear the window // очищаем окно
glFlushO:
}
Подпрограмма, приведенная в листинге 2.15, сохраняет угловые точки в статическом (static) массиве corner[], который сделан статическим с тем, чтобы значения хранились в нем между последовательными вызовами подпрограммы. Переменная numCorners хранит информацию о том, сколько углов на данный момент обработано; как только это число достигает двух, прямоугольник рисуется, a numCorners сбрасывается в нуль.
При другом методе задания прямоугольника используется резиновый прямоугольник (rubber rectangle), размеры которого увеличиваются и уменьшаются по мере того, как пользователь перемещает мышь. Подробнее это рассматривается в разделе «Логические комбинации пиксельных карт» главы 10.
Начальная стадия: рисование фигур
Пример 2.4.3. Управление «ковром Серпинского» с помощью мыши Нетрудно расширить возможности описанной ранее подпрограммы «ковер Серпинского» так, чтобы пользователь мог задавать все три вершины исходного треугольника с помощью мыши. Используем ту же схему, что и в предыдущем примере: поместим три точки в массив corners[] (углы) и затем, имея в наличии эти три точки, нарисуем ковер Серпинского. Тогда ядро подпрограммы myMouseC) будет выглядеть следующим образом:
static GlintPoint corners[3]: static int numCorners - 0:
if(button - GLUTLEFT BUTTON && state - GLUT DOWN) {
corner[numCorners].x - x;
corner[numCorners].y - screenHeight - y: // flip у coordinate // зеркально отражаем координату у
if(++numCorners - 3)
{
Sierpinski(corners): // draw the gasket // рисуем ковер