Сложный путь
При этом подходе мы создаем матрицу М нужного преобразования, а также подпрограмму с названием, например, transform2DO, которая преобразует одну точку в другую:
Q - transform2D(M. Р); Эта подпрограмма дает на выходе Q = MP. Для того чтобы применить это преобразование к каждой точке V[i] в подпрограмме houseO, мы должны изменить приведенный ранее исходный код следующим образом:
cvs.moveTo(transform2D(M. V[0])): // move to the transformed point // перемещаемся к преобразованной точке cvs.1ineTo(transform2D(M. V[l])): cvs.lineTo(transform2D(M. V[2])); Теперь в подпрограммы moveToO и lineToO передаются преобразованные точки. Такой способ исправления возможен, если доступен исходный код подпрограммы houseO. Однако этот способ является в высшей степени громоздким и невозможен вовсе, если исходный код для houseO недоступен. Кроме того, нам в первую очередь нужны средства для создания матрицы М.
5.5. Использование аффинных преобразований в программах
Простой путь
Сделаем так, чтобы нужное преобразование применялось к каждой вершине автоматически. Так как мы знаем, что отображение «окно - порт просмотра» применяется к каждой вершине «молча», как часть работы функций moveToO и lineToO, то можно сделать, чтобы дополнительное преобразование применялось также «молча». С таким преобразованием мы уже сталкивались раньше под названием текущее преобразование (current transformation - СТ). Усовершенствуем функции moveToO и lineToO в классе Canvas таким образом, чтобы они вначале молча применяли к вершине-аргументу текущее преобразование СТ, а затем преобразование «окно - порт просмотра». (Кроме того, также производится отсечение границами мирового окна.)
На рис. 5.35 показано небольшое усовершенствование графического конвейера, который мы впервые ввели на рис. 5.7. При вызове функции gl Vertex2d() с аргументом V вершина У вначале преобразуется при помощи СТ в точку Q, которая затем подвергается отображению «окно - порт просмотра», после чего превращается в точку S экранного окна. (Как мы увидим позднее, «внутри» последнего процесса отображения также выполняется отсечение.)