Листинг 3.8. Конструктор OpenGL-версии класса Canvas //«««««< Canvas constructor »»»» Canvas:: CanvasCint width, int height, char* windowTitle) {
char* argv[l]: // dummy argument list for glutlnitO // фиктивный список аргументов для glutlnitO
char dummyString[8]:
argv[0] - dummyString; // hook up the pointer // подключаем указатель
int argc -1; // to satisfy glutlnitO // для соответствия требованиям glutlnitO
3.4. Разработка класса Canvas
glutlnitC&argc. argv);
glutInitDisplayMode(GlUT_SINGlE | GLUT_RGB):
glutInitWindowSize(width. height):
glutInitWindowPosition(20. 20):
glutCreateWindow(windowTitle); // open the screen window // открываем экранное окно
setWindow(0. (float)width. 0. (float)height): // default world window // мировое окно по умоляанию
setViewportCO. width. 0. height): // default viewport // порт просмотра no умолчанию
CP.setCO.Of. O.Of); // initialize the CP to (0. 0) // инициализируем CP в (0. 0) }
В листинге 3.9 показана реализация некоторых из оставшихся функций-членов класса Canvas (другие функции отрабатываются в упражнениях). Функция moveToO просто обновляет CP (current position - текущие координаты); 1 ineTo() посылает CP в качестве первой вершины и новую точку (х, у) в качестве второй. Отметим, что нам здесь не требуется явно использовать преобразование окно - порт просмотра, поскольку OpenGL автоматически применяет его. Функция setW1ndow() передает свои аргументы функции glu0rtho2D() (после необходимого приведения их типов) и загружает их в window класса Canvas.
Листинг 3.9. Реализация некоторых функций-членов класса Canvas
//«««««« moveTo »»»»»» void Canvas:: moveTo(float x. float y) {
CP.setCx. y);
}
//«««««« 1 i neTo »»»»»» void Canvas:: lineTo(float x. float y) {
glBegin (GLJ.INES);
glVertex2f ((GLfloat) CP.x. (GLfloat) CP.y); glvertex2f ((GLfloat) x. (GLfloat) y): // draw the line // рисуем линию