Министерство Образования Республики Беларусь
УО “Витебский Государственный Технологический Университет"
Пояснительная записка
к курсовому проекту на тему “Разработка программы рисованиязамкнутых многоугольников на языке С++, с использованием библиотеки VCL"
Витебск — 2009
Содержание
Введение.
Разработка интерфейса приложения
Разработка алгоритма работы приложения, его реализация на языке С++
Заключение
Список литературы
Введение.
В записке приведено описаниепрограммы, разработанной в соответствии с заданием на курсовое проектированиепо теме “Разработка программы рисования замкнутых многоугольников на языке С++,с использованием библиотеки VCL". Программапредназначена для рисования различных правильных многоугольников.
Разработка программыпроизводилась в среде C++ Builder6, т.к данная среда удобна для разработки, интерфейсы, создаваемые 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
friend istream&operator>> (istream &input, Polygone &polygon);
private:
int n;
double size;
TPoint center;
TPoint fulcrum;
int lenX,lenY;
double angle;
public:
Polygone ();
Polygone (intn, double size, TPoint center);
Polygone (intn, double size, TPoint center, TPoint fulcrum,
double angle);
intgetAmtAngles ();
double getSize();
TPointgetCenter ();
TPointgetFulcrum ();
double getAngle();
TPoint*getPoint ();
voidsetAmtAngles (int n);
void setSize (doublesize);
voidsetCorCenter (TPoint center);
void setFulcrum(TPoint fulcrum);
void setAngle (doubleangle);
};
Класс имеет несколько закрытыхпеременных для хранения значений количества углов, размера, координат центра иточки вращения, а также угла, на который повернут многоугольник относительноточки вращения. Далее идет вполне стандартное описание конструкторов инеобходимых нам функций, предназначение большинства из них не вызываетвопросов, т.к они являются обычными геттерами и сеттерами, которые возвращаютнам значения закрытых переменных. Интересной для рассмотрения является функция getPoint (), возвращающая указатель на массив типа TPoint, хранящий в себе массив точек (вершин), многоугольника.Рассмотрим ее реализацию:
TPoint*Polygone:: getPoint () {
TPoint *point =new TPoint [this->n] ;
double alpha =ALPHA_FULL/this->n;
for (int i=0; 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
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 ();
Polygonepolygon = Polygone (n,size,TPoint (X,Y));
heap. push_back(polygon);
updateImage (Image1);
}
В первых двух строках происходитсчитывание данных из текстовых полей, в одном из которых мы указываемколичество углов, а во втором размер создаваемого многоугольника.
Следующий этап — созданиемногоугольника в памяти и занесение его в список. В последней строке происходитобновление холста. Функция обновления холста реализована следующим образом:
voidupdateImage (TImage *Image) {
int n = heap. size();
Image->Canvas->FillRect(Rect (0,0, Image->Width, Image->Height));
for (int i=0; i
Image->Canvas->Polygon(heap [i]. getPoint (),
heap [i]. getAmtAngles () — 1);
}
}
Вначале запрашиваем размермассива, в котором хранятся многоугольники, т.е. находим количество фигур наформе. Далее происходит очистка холста, и запуск цикла, который поочереднопрорисовывает все многоугольники из списка.
Выбор фигуры для перемещения иливращения реализован на принципе нахождения наименьшего расстояния до центрафигур, который осуществляется с помощью функции getNumberMinDistance (int X,int Y), входными параметрами которой являются координаты положения курсора нахолсте.
intgetNumberMinDistance (int X, int Y) {
int n = heap. size();
int number = 0;
doubleminDistance = sqrt (pow ( (X-heap [number]. getCenter (). x),2) +
pow ( (Y-heap [number].getCenter (). y),2));
for (int i=1; 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;
}
}
if (heap [number].getSize ()
return — 1;
return number;
}
Данная функция рассчитываетрасстояния до центра всех фигур, и выбирает из них наименьшее. Расстояние такжедолжно быть меньше радиуса описанной окружности для данной фигуры. Возвращаемоезначение равно номеру этой фигуры в списке. Во время перемещения фигурыпроисходит обработка события MouseMove, в котором дляперемещаемой фигуры задается новое положение центра и заново прорисовываетсяхолст.
Разработанная программа имеетвозможность сохранения коллекции многоугольников. В файл записываются данные околичестве фигур на холсте, а также данные о самих многоугольниках, такие как — количество углов, размер, координаты центра и т.д. Данный тип записи, позволяетв будущем легко открывать и импортировать необходимые коллекции фигур на холст.
Заключение
Программа, описанная в курсовомпроекте, разработана в соответствии с постановкой задачи на курсовоепроектирование по теме “Разработка программы рисования замкнутыхмногоугольников".
Интерфейс созданной программыудобен, прост, наглядно отображает ее возможности.
Тестирование подтвердило, чтопрограмма корректно выполняет обработку данных и демонстрацию результатов.
Всё это свидетельствует оработоспособности программы и позволяет сделать вывод о ее пригодности длясоздания и редактирования замкнутых многоугольников.
Список литературы
1. Язык программирования C++: Б. Страуструп.
2. Программирование в C++ Builder6: А.Я. Архангельский. -М.: изд. «Бином», 2003.
3. Самоучитель C++ Builder:Н.Б. Культин. -СПБ.: БХВ-Петербург, 2004.
4. Вычислительная геометрия и компьютерная графика на C++:М. Ласло пер. с англ.В. Львова. -М.: изд. «Бином», 1997.