Единое окно доступа к образовательным ресурсам

Примеры выполнения самостоятельных работ по компьютерной геометрии и графике: Методические указания к самостоятельным работам

Голосов: 2

В данных методических указаниях к самостоятельным работам собраны примеры программирования трехмерных геометрических моделей по дисциплине "Компьютерная геометрия и графика". Методические указания предназначены для студентов 1 курса специальности 654700- "Информационные системы" и соответствуют рабочей программе дисциплины "Компьютерная геометрия и графика".

Приведенный ниже текст получен путем автоматического извлечения из оригинального PDF-документа и предназначен для предварительного просмотра.
Изображения (картинки, формулы, графики) отсутствуют.
                Федеральное агентство по образованию
___________________________________________________________
      Санкт-Петербургский государственный университет
       информационных технологий, механики и оптики




                        Г.Г. Хайдаров
Примеры выполнения самостоятельных работ
   по компьютерной геометрии и графике
       Методические указания к самостоятельным работам




                      Санкт-Петербург
                            2006


УДК 681.3
Хайдаров Г.Г. Примеры выполнения самостоятельных работ по компьютерной
геометрии и графике,: Метод. указания. СПб., СПбГУ ИТМО, 2005. -52 с.


     В данных методических указаниях к самостоятельным работам собраны
примеры программирования трехмерных геометрических моделей по
дисциплине «Компьютерная геометрия и графика».
     Методические указания предназначены для студентов 1 курса
специальности 654700- информационные системы и соответствуют рабочей
программе дисциплины «Компьютерная геометрия и графика».
Ил. 32, табл.10, библиогр. 17 назв.


      Рецензент: А.В. Меженин, ст. преп., кафедра      инженерной    и
                 компьютерной графики СПбГУ ИТМО




Утверждены на заседании учебно-методической комиссии         факультета
информационных технологий и программирования 19.04.2005 г.


© Санкт-Петербургский государственный университет информационных
технологий, механики и оптики, 2006
© Г.Г. Хайдаров, 2006




                                                                      2


                                    Введение
Под названием дисциплины «Компьютерная геометрия и графика» (КГГ) на практике часто
понимают ряд смежных дисциплин, связанных с компьютерным дизайном, компьютерным
черчением, геометрическим моделированием, и программированием «быстрой» графики.
Мы будем употреблять это название в соответствии с требованиями государственного
образовательного стандарта высшего профессионального образования к обязательной
дисциплине 2 – го семестра (1 курса) университетов, готовящих студентов по компьютерным
специальностям. В первую очередь по специальностям, связанным с информационными
технологиями и программированием, а также с автоматизацией.
Прототипом данной дисциплины был курс под названием «Машинная графика» [1],
опубликованный в 1991 году. Другим прототипом был курс под названием «Вычислительная
и компьютерная геометрия», который появился в ВУЗах страны с 1991 года. Курс
дисциплины под названием «Компьютерная графика» был опубликован в России с 1996 года
и предназначался для студентов Московского государственного университета имени М.В.
Ломоносова [2,3]. В настоящее время только в сети русскоязычного интернета опубликовано
около 20 курсов данного направления. В основном это сайты крупных университетов России.
Сейчас почти в каждом крупном книжном магазине на полках стоят книги по курсу
«Компьютерная графика» [4].
Данные     самостоятельные     работы    основаны    на   дисциплинах:    информатика,
программирование, высшая математика, основы инженерной графики. Для применения
программирования в данном курсе можно порекомендовать следующие книги по основам
языка C++ [5-8] и по C++ Builder [9-12]. Однако в данном курсе от студентов требуется
комплексное применение знаний этих дисциплин, что вызывает определенные трудности.
Для преодоления этих трудностей написаны данные методические указания с примерами
выполнения самостоятельных работ на языке программирования C++. Автор начал работы
по созданию данного курса с 1991 года [13-17]. До настоящего времени курс преподавался
школьникам в центре компьютерных технологий отдела техники ГДТЮ (Аничков дворец) и
для студентов третьего курса факультета информатики и управления в СПбГТИ(ТУ).
Данные методические указания включают минимальный набор примеров собранных вместе
по дисциплине «Компьютерная геометрия и графика». Они, несомненно, помогут студентам
сориентироваться в типовом программировании трехмерных геометрических моделей.

      1. Сравнение синтаксиса графических
   функций языка C++ в зависимости от среды
              программирования
Для того чтобы студент мог свободно пользоваться литературой с описанием листингов
программ на языке C++, проведем сравнение графических функций на языке C++ в средах
Borland C++ 3.0 (под DOS), в Borland C++ Builder (под Windows) и в MS Visual C++ на
примере функции рисования прямоугольника (rectangle).
В среде DOS названия графических функций пишутся прописными латинскими буквами, что
принципиально для языка C++, в отличие от языка Pascal. Заглавная и прописная буквы в
языке C++ воспринимаются как два разных символа. Рассмотрим строку кода C++ для
рисования прямоугольника (функция rectangle) на дисплее компьютера после
инициализации графического режима его работы.
  rectangle(X1, Y1, X2, Y2);


                                                                                      3


Параметры X1, Y1 указывают на верхний левый, а X2, Y2 — на правый нижний угол
прямоугольника.
В 1997 году появился визуальный вариант среды для языка C++, который также был создан
компанией Borland и получил название C++ Builder. Позже свой взгляд на визуализацию C++
был предложен компанией Microsoft, которая, вслед за Visual Basic, выпустила среду
разработки Visual C++. Таким образом, сейчас распространены два визуальных языка C++.
Трудно отдать предпочтение C++ Builder или Visual C++. Достоинствами C++ Builder
являются автоматическое создание классов с большим выбором готовых свойств созданного
класса и вызов функции (метода) по указателю. Достоинствами Visual C++ являются тесное
взаимодействие с операционной системой Windows через функции Win32 API.
Рассмотрим строку кода С++ Builder для рисования прямоугольника (Rectangle) на
поверхности «холста» (Canvas) формы (Form1) приложения.
  Form1–>Canvas–>Rectangle(X1, Y1, X2, Y2);
Здесь функция Rectangle рисует прямоугольник, используя выбранное перо, и закрашивает
его внутренность с помощью выбранной кисти. Функция возвращает значение: не нуль, если
прямоугольник нарисован; нуль — в противном случае.
Рассмотрим фрагмент кода Visual C++ для рисования прямоугольника на форме приложения
с функцией Win32 API:
  Rectangle(HDC, X1, Y1, X2, Y2);
Здесь функция Rectangle рисует прямоугольник, используя выбранное перо, и закашивает
его внутренность с помощью выбранной кисти. Параметры функции: HDC — идентификатор
контекста устройства (или дескриптор окна), X1, Y1 и X2, Y2 — координаты верхнего левого
и правого нижнего угла прямоугольника. Функция возвращает не нулевое значение, если
прямоугольник нарисован и нуль — в противном случае. Функция находится в файле
gdi32.dll.
Сравнивая два последних синтаксиса функций можно заметить различие в их описании
места вывода прямоугольника. В большинстве случаев достаточно определить местом
вывода графических функций рабочую форму приложения (Form1->Canvas->) — тогда нет
смысла в каждой функции описывать дополнительный параметр HDC, как это и реализовано
в C++ Builder. Но, если вы хотите создать фокус, например, перевернуть на вашем дисплее
изображение «рабочего стола», то для реализации необходимо использовать функции Win32
API. В этом нетипичном для C++ Builder случае необходимо будет подумать, как определять
указатель на контекст дисплея. В любом случае обязательно надо получить и использовать
идентификатор (дескриптор) контекста устройства вне зависимости, на чем вы пишите
программу: на C++ Builder или Visual C++.
Чтобы закончить сравнение C++ Builder и Visual C++ с точки зрения автора отмечу лишь
одно положительное свойство C++ Builder. В нем учащемуся приходится постоянно видеть
синтаксис написания производных классов.
Наибольшие трудности при освоении дисциплины «Компьютерная
геометрия и графика» для студентов первого курса представляет раздел,
связанный    с методами трехмерного представления, математического
описания   и   программирования    трехмерных    объектов    в  среде
программирования    под    Windows.    В   данный     раздел   входят
самостоятельные работы с номерами 1 - 3 включительно.
Кроме того, в данных методических указаниях подробно рассмотрены
лабораторные работы 1 и 2, как подготовительные к работе в среде
программирования C++ Builder под Windows. Студент, чувствующий себя

                                                                                       4


уверенно в программировании C++ под Windows, может не читать
следующие два раздела.



         2. Функции базовой графики языка C++
Для того чтобы студент мог свободно читать тексты программ на языке C++ желательно
ознакомиться с тем положительным опытом программирования графики, накопленным с
DOS средах. Все лучшее созданное там было перенесено в Windows программирование.
Дадим сравнение программирования графики в DOS и Windows средах.
                     2.1 Базовая графика в среде Borland С++ 3.1
В настоящее время во всех современных компьютерах применяется графический режим
вывода информации, а операционная система Windows не знает символьного режима. В
языке программирования C++ с реализацией под операционную систему DOS графические
функции хранятся в библиотеке graphics.lib, а прототипы (объявления) этих функций
находятся в файле graphics.h. Мы будем рассматривать графические функции не в отрыве от
практического применения, но наоборот обратим особое внимание на логику составления
графических программ. Это понадобится вам при изучении технологии DirectDraw в C++
Builder под Windows, так как в технологии DirectDraw для обеспечения быстрого вывода
изображения на дисплей переняты лучшие воплощения графических функций для
операционной системы DOS.
                     2.1.1 Инициализация графического режима
Самым первым вопросом работы с графикой является проверка работоспособности
графического режима в вашей среде программирования. Следующий пример (листинг 4.1)
написан именно с данной целью. Скомпилируйте его.
Листинг 2.1. Демонстрация работы графического режима
  // proba1.cpp
  #include <graphics.h>
  #include <stdlib.h>
  #include <stdio.h>
  #include <conio.h>
  int main(void)
  {/* 1. Автоматическое определение наибольшего графического
  режима: gdriver = DETECT */
  int gdriver = DETECT, gmode, errorcode;
  /* Инициализация графического режима */
  initgraph(&gdriver, &gmode, "");
  /* Результат инициализации */
  errorcode = graphresult();
  if (errorcode != grOk) /* Если ошибка */
  {printf("Ошибка инициализации: %s\n", grapherrormsg(errorcode));
  printf("Нажмите любую клавишу");
  getch(); exit(1); /* Завершить программу */
                                                                                      5


  }
  /* 2. Рисование линии из правого верхнего угла в левый нижний */
  line(0, 0, getmaxx(), getmaxy());
  /* 3. Закрытие графического режима */
  getch(); closegraph();
  return 0;
  }
Если вы не внесли опечаток в текст программы, тогда файл proba1.exe начнет работать. По
диагонали экрана должна рисоваться на черном фоне белая линия из правого верхнего угла в
левый нижний угол.
                         2.1.2 Типовые ошибки инициализации
Возможны три причины, по которым программа proba1.exe с графикой будет работать не
так, как мы предположили.
Первая — отсутствие в рабочей папке с исполняемым файлом proba1.exe файла драйвера
egavga.bgi. Результатом работы программы будет сообщение:
Ошибка инициализации: Device driver file not found <EGAVGA.BGI>
Нажми любую клавишу (Press any key to halt)
Это как-то даже неуместно называть проблемой. Из папки BGI среды программирования
файл egavga.bgi переписывается в вашу рабочую папку и все.
Другой вариант. Файл egavga.bgi «лежит» в папке рядом с файлом proba1.exe, но линия не
рисуется. Если программа proba1.exe начинает вытворять неизвестно что (или выдает
другую ошибку или по экрану начинает «бегать» курсор), тогда смело сотрите старый
драйвер egavga.bgi и поищите у знакомых или на дисках новую версию. «Ломаные»
драйверы встречаются не так редко.
Третья причина — это экзотический «баг». Она встречается в основном в компьютерных
сетях. По неизвестной причине файл драйвера egavga.bgi отказывается работать до тех пор,
пока с этого файла не снять атрибут «только для чтения». Надеюсь, что вы не работаете с
удаленного компьютера в сети, поскольку там есть еще ряд особенностей работы среды
программирования, связанных c загрузкой среды с другого компьютера и атрибутами
«только для чтения».
                             2.1.3 Графические примитивы
Основу мы уже заложили: знаем, как переключиться в графический режим, где применить
функции и как правильно завершить работу графической части. Теперь займемся
непосредственно разбором примеров с рисованием графических функций. Самые простые
функции называются графическими примитивами. Условно примитивы можно разделить на
группы: примитивы рисования контуров и площадные фигуры. К примитивам контуров
относятся: линии (line), прямоугольники (rectangle), дуги (arc), окружности (circle),
эллипсы (ellipse), многоугольники (drawpoly) и прочие не закрашиваемые внутри фигуры.
Площадными, закрашиваемыми внутри фигурами являются прямоугольники (bar, bar3d),
круговые и эллиптические секторы (pieslice, sector). Если у вас фигура замкнута, но не
залита, например, многоугольник (drawpoly), то его всегда можно закрасить внутри с
помощью функций закраски (floodfill, setfillstyle). Для выбора цвета рисования применяется
функция задания текущего (по умолчанию) цвета графических примитивов (setcolor). Для
определения цвета точки по ее координатам на экране существует функция getpixel, а для

                                                                                         6


вывода точки заданным цветом на экран — setpixel. Вот и весь смысл работы с выводом
графических примитивов. Данная логика интуитивно понятна обычному школьнику.
Подробное описание и параметры графических функций можно найти в любом справочнике
по C++. Если у вас под рукой нет справочника, тогда наберите в редакторе среды
программирования интересующее вас имя функции, наведите на него курсор и нажмите
комбинацию клавиш Ctrl+F1. На экране появится описание функции и внизу подсказки
ссылка на пример программы с выбранной графической функцией. Например, если вы
введете имя функции rectangle и нажмете нужные клавиши, появится подсказка по функции
рисования прямоугольника с характерным примером применения. Но кое-что вы можете
увидеть и в примере из листинга 2.2, в котором воедино собраны некоторые
распространенные функции для работы с примитивами.
Листинг 2.2. Демонстрация работы графических функций
  // rectangl.cpp
  #include <graphics.h>
  #include <stdlib.h>
  #include <stdio.h>
  #include <conio.h>
  void main(void)
  {int gdriver = DETECT, gmode, errorcode;
  int xr=50,yr=20,left, top, right, bottom;
  int stangle=0, endangle=360, xradius=40, yradius=25;
  int radius=25;
  int stangle_arc = 90, endangle_arc = 225;
  int xb=0, yb=200, midx, midy;
  // 1 Инициализация графического режима
  initgraph(&gdriver, &gmode, ""); errorcode = graphresult();
  if (errorcode != grOk) {
  printf("Ошибка: %s\n", grapherrormsg(errorcode));
  printf("Нажмите любую клавишу"); getch(); exit(1); }
  // 2 Рисование
  setcolor(WHITE);
  outtextxy(xr,yr+100,
  "rectangle            ellipse          circle           arc");
  left = xr +0; top = yr +0;
  right = xr+100; bottom = yr+50;
  rectangle(left,top,right,bottom);
  ellipse(xr+150, yr+25, stangle, endangle, xradius, yradius);
  circle(xr+250, yr+25, radius);
  arc(xr+350, yr+25, stangle_arc, endangle_arc, radius);
  midx = xb; midy = yb;

                                                                                    7


  outtextxy(xb+100, yb+60, "bar + setfillstyle");
  outtextxy(xb+100, yb+200, "sector + setfillstyle");
  for (int i=SOLID_FILL; i<USER_FILL; i++)
  { setfillstyle(i, YELLOW);
  bar(midx+i*50, midy, midx+40+i*50,midy+40);
  sector(midx+i*50+35, midy+150, stangle_arc, endangle_arc,
  xradius, yradius);
  }
  // 3 Закрытие графического режима
  getch(); closegraph(); }
В этой простой программе обратите внимание на перечисление типов закраски площадных
фигур в цикле for (int i=SOLID_FILL; i<USER_FILL; i++) от I=1 до I=11. Всего существует
13 типов стандартных заливок замкнутых областей, назначение которых перечислено в
табл. 4.1.

Таблица 2.1. Типы стандартных заливок замкнутых областей
I=0     ENUM_FILL            Заливка цветом фона
I=1     SOLID_FILL           Заливка       текущим          цветом
                             (установленным setcolor())
I=2     LINE_FILL            Горизонтальная штриховка
I=3     LTSLASH_FILL         Штриховка тонкими линиями под углом
                             45° влево
I=4     SLASH_FILL           Штриховка толстыми       линиями   под
                             углом 45° влево
I=5     BKSLASH_FILL         Штриховка толстыми       линиями   под
                             углом 45° вправо
I=6     LTBKSLASH_FILL       Штриховка линиями под углом 45°
                             вправо
I=7     HATCH_FILL           Штриховка в клетку
I=8     XHATCH_FILL          Штриховка в клетку под углом 45°
I=9     INTERLEAVE_FILL Частая штриховка в клетку под 45°
I=10    WIDEDOT_FILL         Заполнение редкими точками
I=11    CLOSEDOT_FILL        Заполнение частыми точками
I=12    USER_FILL            По шаблону программиста
На рис. 2.2 показана экранная копия работы программы rectang1.cpp, иллюстрирующая
перечисленные способы заполнения внутренних областей.




                                                                                      8


                Рисунок 2.1. Демонстрация работы графических функций

По вопросам анимации графики, применения других графических драйверов, инициализации
графического режима через BIOS читателям следует обратиться к литературе [5-9].
                       2.2 Базовая графика в среде C++ Builder
Базовая графика холста (Canvas) C++ Builder, предназначенная для рисования графических
примитивов на поверхности «холста» формы, вобрала в себя все лучшие достижения
графики DOS. Плюс качественно упростилась работа с цветными графическими режимами.
Например, с 24-битовой глубиной цвета. Однако это не означает, что, взмахнув волшебной
палочкой, вы можете добиться любого желаемого графического эффекта — ускорение
разработки вы получите только за счет стандартных средств среды C++ Builder. Именно эти
стандартные варианты работы и будут рассмотрены в данной главе.
                            2.2.1 Функции Canvas-графики
В Windows насчитывается несколько десятков графических функций. Их названия частично
совпадают с DOS-именами аналогичных средств. Особое внимание надо обратить на
заглавные первые буквы в названиях этих функций, что принципиально при наборе
программ в C++. Для обзора предлагаемых возможностей для работы с графикой войдите в
меню Help (справка) главного меню C++ Builder и выберите пункт Index. Наберите слово
Canvas и в результате поиска укажите слово Methods, то есть, говоря в строгом
соответствии с терминологией C++ — функции для работы с графикой. Вам будет
предложен в алфавитном порядке набор функций для работы с графикой: Arc, BrushCopy,
Chord, CopyRect, Draw, DrawFocusRect, Ellipse, FillRect, FloodFill, FrameRect, LineTo,
Lock, MoveTo, Pie, PolyBezier, PolyBezierTo, Polygon, Polyline, Rectangle, Refresh,
RoundRect, StretchDraw, TextExtent, TextHeight, TextOut, TextRect, TextWidth, TryLock,
Unlock. Видите, часть этих названий такие же, что и в DOS.
                                                                                      9


             Рисунок 2.2. Экранная копия работы программы из примера 2.3

На рис. 2.2. показана экранная копия работы программы, воспроизведением которой мы
сейчас займемся. В визуальную часть программу входит, кроме формы Form1, один
объект — кнопка Button1. Вывод графических примитивов происходит на поверхность
формы. Эту поверхность принято называть холстом, то есть Canvas. В данном примере
рисуется линия, полилиния по массиву структур точек (Point) и многоугольник (Polygon).
Цвет задает свойство «пера» для рисования — Pen->Color. Заливка определяется свойством
кисти для рисования Brush->Color. Во время работы готовой программы при нажатии
кнопки Button1 происходят:
  рисование линии. Невидимое перо перемещается в точку с координатами X=5, Y=10.
  Далее опущенное на холст перо движется в точку с координатами X=5, Y=100;
  рисование полилинии. Невидимое перо перемещается в точку с координатами начальной
  (нулевой) точки points[0].x = 40 и points[0].y = 10. Далее опущенное на холст перо
  движется по координатам массива точек от 0 до 5;
  рисование замкнутого многоугольника. Перо перемещается в точку с координатами
  начальной (нулевой) точки points2[0].x = 40 и points[0]2.y = 10, затем движется по
  координатам массива точек от 0 до 3 и далее до нулевой точки, замыкая многоугольник.
  Для многоугольника, как площадной фигуры, возможна внутренняя заливка костью
  Brush.

Листинг 2.3. Простейшие графические функции
  // -- Uch8_n01.cpp --
  #include <vcl.h>
  #pragma hdrstop
  #include "Uch8_n01.h"
  //--------------------------------------
  #pragma package(smart_init)
  #pragma resource "*.dfm"
  TForm1 *Form1;
  //--------------------------------------
  __fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner){ }
  //--------------------------------------
  void __fastcall TForm1::Button1Click(TObject *Sender)
  { // Линия
  Canvas->Pen->Color = clWhite;

                                                                                    10



    
Яндекс цитирования Яндекс.Метрика