Разработка программы рисования замкнутых многоугольников на языке С++, с использованием библиотеки VCL
Министерство Образования Республики Беларусь
УО “Витебский Государственный Технологический Университет"
Пояснительная записка
к курсовому проекту на тему “Разработка программы рисования
замкнутых многоугольников на языке С++, с использованием библиотеки VCL"
Витебск - 2009
Содержание
Введение.
Разработка
интерфейса приложения
Разработка
алгоритма работы приложения, его реализация на языке С++
Заключение
Список
литературы
В записке приведено описание
программы, разработанной в соответствии с заданием на курсовое проектирование
по теме “Разработка программы рисования замкнутых многоугольников на языке С++,
с использованием библиотеки VCL". Программа предназначена
для рисования различных правильных многоугольников.
Разработка программы
производилась в среде C++ Builder
6, т.к данная среда удобна для разработки, интерфейсы, создаваемые C++ Builder 6 наглядны и просты для
использования.
Результаты тестирования
подтверждают, что программа правильно выполняет все реализованные, в
соответствии с заданием, функции.
Под графическим интерфейсом
пользователя (Graphical User Interface - GUI) подразумевается тип экранного
представления, при котором пользователь может выбирать команды, запускать
задачи и просматривать списки файлов, указывая на пиктограммы или пункты в
списках меню, показанных на экране. Действия могут, как правило, выполняться с
помощью мыши, либо нажатием клавиш на клавиатуре. Типичным примером
графического интерфейса пользователя является Windows.
C++Builder предоставляет
разработчику приложения широкие возможности быстрого и качественного
проектирования графического интерфейса пользователя - различных окон, кнопок,
меню и т.д.
Интерфейс программы
разрабатывался в стиле простейшего графического редактора.
На панели инструментов
расположатся элементы для работы непосредственно с холстом. Так, в результате,
нескольких проб, собираем форму которая нас удовлетворяет.
Исследование классов библиотеки VCL,
используемых в приложении.
Библиотека визуальных компонентов
- VCL-библиотека (Visual Component Library) - является репозитарием компонентов, используемых
для создания приложений с помощью C++ Builder.
Компонентом называется объект, используемый для создания программы, - флажок,
комбинированный список или рисунок. Эти компоненты выбираются с помощью щелчка
левой кнопкой мыши и перемещаются в рабочую область. Компоненты VCL-библиотеки представляют собой код, который скомпилирован
для выполнения определенных операций, что избавляет разработчика от
необходимости всякий раз создавать его заново.
Все компоненты обладают
свойствами, которыми можно управлять с помощью кода или пакета C++ Builder. Свойства компонента
определяют способ его работы, внешний вид, набор функциональных возможностей и т.д.
Компоненты используемые для
построения нашего интерфейса можно представить в виде следующего списка:
TForm - форма,
окно, которое в большинстве случаев является пользовательским интерфейсом
создаваемого приложения.
TMainMenu - не визуальный компонент, главное меню.
TOpenDialog - предназначен для создания окна диалога "Открыть файл".
TSaveDialog - предназначен для создания окна диалога "Сохранить
файл".
TPanel - является контейнером для группирования органов управления.
TLabel - отображение текста, который не изменяется пользователем. Никакого
оформления текста не предусмотрено, кроме цвета метки и текста.
TEdit - отображение, ввод и редактирование однострочных текстов.
TUpDown - кнопка-счетчик, в сочетании с компонентами TEdit и другими позволяющая вводить цифровую информацию.
TRadioGroup - комбинация группового окна GroupBox
с набором радиокнопок RadioButton; служит специально
для создания групп радиокнопок. Можно размещать в компоненте несколько
радиокнопок, но никакие другие органы управления не разрешены.
TRadioButton - предлагают пользователю набор альтернатив, из которых
выбирается одна. Набор реализуется требуемым количеством радиокнопок,
размещенных в одном контейнере.
TImage - используется для отображения графики: пиктограмм, битовых
матриц и метафайлов.
TStatusBar - представляет собой ряд панелей, отображающих полосу
состояния в стиле Windows. Обычно эта полоса
размещается внизу формы.
Целью данной работы является
разработка программы рисования замкнутых многоугольников с помощью
объектно-ориентированного языка программирования, с использованием его
графических функций и методов.
В разработанной программе
реализованы следующие возможности:
помещение фигуры на холст (количество
граней задается численно, положение на холсте - с помощью мыши);
вращение фигур на холсте (положение
на холсте центра вращения указывается с помощью мыши, угол задается численно);
перемещение фигур на холсте с
помощью;
очистку холста от фигур;
сохранение в файл коллекции
фигур;
загрузка коллекции фигур из
файла в двух вариантах: дополнение, или полная замена уже имеющейся на холсте
коллекции (предусмотрена фильтрация файлов нужного типа в диалоге "Открытие
файла").
Созданная программа в процессе
деятельности может быть представлена рядом состояний, которые осуществляют те
или иные действия. В программе можно выделить некоторое начальное и конечное
состояние. Анализ системы следует начать с жизненного цикла: вначале работы
программы пользователь создает или открывает (импортирует) коллекцию фигур,
далее следует выбор одного из действий: создание, перемещение и поворот фигуры:
создание фигуры - пользователю
необходимо сначала задать количество углов и размер, после чего произвести
щелчок левой кнопкой мыши по холсту, в результате чего на указанном месте
появится заданный многоугольник;
перемещение фигуры -
пользователю необходимо просто навести курсор на фигуру, которую он хочет
переместить и нажать левую кнопку мыши, после чего переместить курсор в нужную
позицию и отпустить кнопку.
вращение фигуры - пользователю
необходимо сначала задать угол поворота, после чего произвести щелчок левой
кнопкой мыши по фигуре в месте, где пользователь хочет расположить центр
вращения.
После выполнения одного, либо
нескольких из вышеописанных действий пользователь может завершить работу,
предварительно сохранив в файл коллекцию фигур.
Для реализации поставленных
задач был написан класс Polygone, которым описываются
все многоугольники на форме. Класс реализован следующим образом:
class Polygone {
friend ostream &operator<<
(ostream &output, Polygone polygon);
friend istream
&operator>> (istream &input, Polygone &polygon);
private:
int n;
double size;
TPoint center;
TPoint fulcrum;
int lenX,lenY;
double angle;
public:
Polygone ();
Polygone (int
n, double size, TPoint center);
Polygone (int
n, double size, TPoint center, TPoint fulcrum,
double angle);
int
getAmtAngles ();
double getSize
();
TPoint
getCenter ();
TPoint
getFulcrum ();
double getAngle
();
void setAmtAngles
(int n);
void setSize (double
size);
void
setCorCenter (TPoint center);
void setFulcrum
(TPoint fulcrum);
void setAngle (double
angle);
};
Класс имеет несколько закрытых
переменных для хранения значений количества углов, размера, координат центра и
точки вращения, а также угла, на который повернут многоугольник относительно
точки вращения. Далее идет вполне стандартное описание конструкторов и
необходимых нам функций, предназначение большинства из них не вызывает
вопросов, т.к они являются обычными геттерами и сеттерами, которые возвращают
нам значения закрытых переменных. Интересной для рассмотрения является функция getPoint (), возвращающая указатель на массив типа TPoint, хранящий в себе массив точек (вершин), многоугольника.
Рассмотрим ее реализацию:
TPoint
*Polygone:: getPoint () {
TPoint *point =
new TPoint [this->n] ;
double alpha =
ALPHA_FULL/this->n;
for (int i=0; i<n;
i++) {
int x =
this->center. x + this->size*cos (alpha*M_PI/ALPHA_HALF);
int y =
this->center. y + this->size*sin (alpha*M_PI/ALPHA_HALF);
point [i] =
Point (x,y);
alpha +=
ALPHA_FULL/n;
}
if (angle) {
for (int i=0; i<n;
i++) {
double R = sqrt
(pow (this->fulcrum. x-point [i]. x,2) +
pow (this->fulcrum.
y-point [i]. y,2));
double beta = (ALPHA_HALF/M_PI)
*acos ( (point [i]. x-
this->fulcrum.
x) /R);
if (this->fulcrum.
y>point [i]. y)
beta =
ALPHA_FULL - beta;
double gamma =
beta - this->angle;
int x =
this->fulcrum. x + R*cos (gamma*M_PI/ALPHA_HALF);
int y =
this->fulcrum. y + R*sin (gamma*M_PI/ALPHA_HALF);
point [i] =
Point (x,y);
}
}
return point;
}
Для нахождения вершин
многоугольника воспользуемся полярной системой координат с центром в центре
многоугольника.
В первой строке данной функции
происходит создание массива типа TPoint, размерностью,
равной количества углов у многоугольника. Начиная со следующей строки,
находится полярный угол и запускается цикл, в котором находятся вершины
многоугольника в системе с центром в центре многоугольника, с использованием
полярных координат, к этим координатам прибавляется смещение центра
относительно начала координат.
Далее, если имеется угол, на
который необходимо повернуть фигуру, то запускается цикл, в котором, находится
длинна вектора с началом в точке центра вращения, обратным преобразованием
находится полярный угол между вектором и плоскостью вращения. К найденному углу
прибавляется угол, на который необходимо повернуть многоугольник, и
осуществляется преобразование, из полярных координат в декартовы координаты.
Фигуры в памяти хранятся с
использованием класса vector. Класс vector
является очень удобным методом для хранения неизвестного числа переменных в
памяти. При создании нового многоугольника объект класса Polygone
добавляется в список, хранящийся в памяти.
Создание многоугольника
происходит при нажатии левой кнопки мыши на холсте, в обработчике события
происходит обработка следующего кода:
if (RadioButton1->Checked)
{
int n =
Edit1->Text. ToInt ();
int size =
Edit2->Text. ToInt ();
Polygone
polygon = Polygone (n,size,TPoint (X,Y));
heap. push_back
(polygon);
updateImage (Image1);
}
В первых двух строках происходит
считывание данных из текстовых полей, в одном из которых мы указываем
количество углов, а во втором размер создаваемого многоугольника.
Следующий этап - создание
многоугольника в памяти и занесение его в список. В последней строке происходит
обновление холста. Функция обновления холста реализована следующим образом:
void
updateImage (TImage *Image) {
int n = heap. size
();
Image->Canvas->FillRect
(Rect (0,0, Image->Width, Image->Height));
for (int i=0; i<n;
i++) {
Image->Canvas->Polygon
(heap [i]. getPoint (),
heap [i]. getAmtAngles () - 1);
}
}
Вначале запрашиваем размер
массива, в котором хранятся многоугольники, т.е. находим количество фигур на
форме. Далее происходит очистка холста, и запуск цикла, который поочередно
прорисовывает все многоугольники из списка.
Выбор фигуры для перемещения или
вращения реализован на принципе нахождения наименьшего расстояния до центра фигур,
который осуществляется с помощью функции getNumberMinDistance (int X, int Y),
входными параметрами которой являются координаты положения курсора на холсте.
int
getNumberMinDistance (int X, int Y) {
int n = heap. size
();
int number = 0;
double
minDistance = sqrt (pow ( (X-heap [number]. getCenter (). x),2) +
pow ( (Y-heap [number].
getCenter (). y),2));
for (int i=1; i<n;
i++) {
double distance
= sqrt (pow ( (X-heap [i]. getCenter (). x),2) +
pow ( (Y-heap [i].
getCenter (). y),2));
if (minDistance>distance)
{
minDistance =
distance;
number = i;
}
}
return - 1;
return number;
}
Данная функция рассчитывает
расстояния до центра всех фигур, и выбирает из них наименьшее. Расстояние также
должно быть меньше радиуса описанной окружности для данной фигуры. Возвращаемое
значение равно номеру этой фигуры в списке. Во время перемещения фигуры
происходит обработка события MouseMove, в котором для
перемещаемой фигуры задается новое положение центра и заново прорисовывается
холст.
Разработанная программа имеет
возможность сохранения коллекции многоугольников. В файл записываются данные о
количестве фигур на холсте, а также данные о самих многоугольниках, такие как -
количество углов, размер, координаты центра и т.д. Данный тип записи, позволяет
в будущем легко открывать и импортировать необходимые коллекции фигур на холст.
Программа, описанная в курсовом
проекте, разработана в соответствии с постановкой задачи на курсовое
проектирование по теме “Разработка программы рисования замкнутых
многоугольников".
Интерфейс созданной программы
удобен, прост, наглядно отображает ее возможности.
Тестирование подтвердило, что
программа корректно выполняет обработку данных и демонстрацию результатов.
Всё это свидетельствует о
работоспособности программы и позволяет сделать вывод о ее пригодности для
создания и редактирования замкнутых многоугольников.
1.
Язык программирования C++: Б. Страуструп.
2.
Программирование в C++ Builder
6: А.Я. Архангельский. -М.: изд. "Бином", 2003.
3.
Самоучитель C++ Builder:
Н.Б. Культин. -СПБ.: БХВ-Петербург, 2004.
4.
Вычислительная геометрия и компьютерная графика на C++:
М. Ласло пер. с англ.В. Львова. -М.: изд. "Бином", 1997.