Разработка программы рисования замкнутых многоугольников на языке С++, с использованием библиотеки VCL
TPoint getCenter ();
TPoint getFulcrum ();
double getAngle ();
TPoint *getPoint ();
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;
}
}
if (heap [number]. getSize () <minDistance)
return - 1;
return number;
}
Данная функция рассчитывает расстояния до центра всех фигур, и выбирает из них наименьшее. Расстояние также должно быть меньше радиуса описанной окружности для данной фигуры. Возвращаемое значение равно номеру этой фигуры в списке. Во время перемещения фигуры происходит обработка события MouseMove, в котором для перемещаемой фигуры задается новое положение центра и заново прорисовывается холст.
Разработанная программа имеет возможность сохранения коллекции многоугольников. В файл записываются данные о количестве фигур на холсте, а также данные о самих многоугольниках, такие как - количество углов, размер, координаты центра и т.д. Данный тип записи, позволяет в будущем легко открывать и импортировать необходимые коллекции фигур на холст.
Заключение
Программа, описанная в курсовом проекте, разработана в соответствии с постановкой задачи на курсовое проектирование по теме “Разработка программы рисования замкнутых многоугольников".
Интерфейс созданной программы удобен, прост, наглядно отображает ее возможности.
Тестирование подтвердило, что программа корректно выполняет обработку данных и демонстрацию результатов.
Всё это свидетельствует о работоспособности программы и позволяет сделать вывод о ее пригодности для создания и редактирования замкнутых многоугольников.
Список литературы
1. Язык программирования C++: Б. Страуструп.
2. Программирование в C++ Builder 6: А.Я. Архангельский. -М.: изд. "Бином", 2003.
3. Самоучитель C++ Builder: Н.Б. Культин. -СПБ.: БХВ-Петербург, 2004.
4. Вычислительная геометрия и компьютерная графика на C++: М. Ласло пер. с англ.В. Львова. -М.: изд. "Бином", 1997.
Другие рефераты на тему «Программирование, компьютеры и кибернетика»:
Поиск рефератов
Последние рефераты раздела
- Основные этапы объектно-ориентированного проектирования
- Основные структуры языка Java
- Основные принципы разработки графического пользовательского интерфейса
- Основы дискретной математики
- Программное обеспечение системы принятия решений адаптивного робота
- Программное обеспечение
- Проблемы сохранности информации в процессе предпринимательской деятельности