Листинг 3.4. Использование функции изменения формы (reshape) для задания наибольшего согласованного порта просмотра при обработке события resize
void myReshape(GLsizei W. GLsizei H)
{
if(R > w/H) // use (global) window aspect ratio // используем форматное соотношение (глобального) окна setViewport(t). W. 0. w/R):
else
setViewport(0. H * R. 0. H):
}
Практические упражнения
3.2.3. Найти ограничивающий прямоугольник для ломаной линии Напишите подпрограмму, которая вычисляет экстент ломаной линии, записанной в массиве точек pt[i], для i = 0,2,.... п - 1.
3.3. Отсечение линий
3.2.4. Согласование порта просмотра Найдите согласованный порт просмотра для окна с форматным соотношением 0,75, если экранное окно имеет ширину 640 и высоту 480.
3.2.5. Центрирование порта просмотра (не пропускайте этот пример!)
Измените подпрограмму myReshapeO из листинга 3.4 так, чтобы порт просмотра размещался не в левом верхнем углу дисплея, а в центре экранного окна - как по горизонтали, так и по вертикали.
3.2.6. Как расплющить домик Выберите окно и порт просмотра так, чтобы изображение расплющилось до половины его настоящей высоты. Чему равны в этом случае коэффициенты А, В, Си D?
3.2.7. Вычисление преобразования Найдите коэффициенты А, В, С и D для преобразования окно - порт просмотра для окна с координатами (-600, 235, -500, 125) и порта просмотра с координатами (20, 140, 30, 260). Будут ли искажены фигуры, нарисованные в мировом окне? Измените правую границу порта просмотра так, чтобы исправить это искажение.
3.3. Отсечение линий Отсечение (clipping) является одной из основных задач графики и применяется для того, чтобы предотвратить рисование тех частей объекта, которые размещаются вне заданной области. Разработано большое количество алгоритмов отсечения. В среде OpenGL каждый объект автоматически отсекается в мировом окне с использованием особого алгоритма (в главе 7 мы подробнее рассмотрим этот алгоритм для дву- и трехмерных объектов).
Поскольку OpenGL осуществляет отсечение за вас, то может возникнуть соблазн вообще пропустить изучение этого процесса. Однако принципы, использованные при разработке отсекателя (clipper), являются фундаментальными и пригодятся в различных ситуациях. В следующих главах мы будем рассматривать целый ряд подходов к отсечению. (Кроме того, полезно знать, как должным образом осуществить отсечение, если не использовать средства, подобные OpenGL.)