Научная статья на тему 'ПРОГРАММНАЯ РЕАЛИЗАЦИЯ НАХОЖДЕНИЯ ПЕРИМЕТРА И ПЛОЩАДИ ФИГУРЫ С ПОМОЩЬЮ АППРОКСИМАЦИИ'

ПРОГРАММНАЯ РЕАЛИЗАЦИЯ НАХОЖДЕНИЯ ПЕРИМЕТРА И ПЛОЩАДИ ФИГУРЫ С ПОМОЩЬЮ АППРОКСИМАЦИИ Текст научной статьи по специальности «Компьютерные и информационные науки»

CC BY
51
7
i Надоели баннеры? Вы всегда можете отключить рекламу.
Ключевые слова
АППРОКСИМАЦИЯ / АЛГОРИТМ ДУГЛАСА-ПЕКЕРА / ФОРМУЛА ПЛОЩАДИ ГАУССА / С++

Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Бабенко Александр Андреевич, Бабенко Анастасия Александровна

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

i Надоели баннеры? Вы всегда можете отключить рекламу.
iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

SOFTWARE IMPLEMENTATION OF FINDING THE PERIMETER AND THE AREA OF THE FIGURE USING APPROXIMATION

The article implements a program for finding the perimeter and area using approximation. The Douglas-Pecker algorithm was used to approximate a given figure.

Текст научной работы на тему «ПРОГРАММНАЯ РЕАЛИЗАЦИЯ НАХОЖДЕНИЯ ПЕРИМЕТРА И ПЛОЩАДИ ФИГУРЫ С ПОМОЩЬЮ АППРОКСИМАЦИИ»

Бабенко А. А.

студент аспирантуры 2-го года обучения

НИУ «БелГУ» Россия, г.Белгород Бабенко А.А.

студент аспирантуры 1-го года обучения

НИУ «БелГУ» Россия, г.Белгород

ПРОГРАММНАЯ РЕАЛИЗАЦИЯ НАХОЖДЕНИЯ ПЕРИМЕТРА И

ПЛОЩАДИ ФИГУРЫ С ПОМОЩЬЮ АППРОКСИМАЦИИ

Аннотация: В статье реализована программа нахождения периметра и площади с использованием аппроксимации. Для аппроксимации заданной фигуры был использован алгоритм Дугласа-Пекера.

Ключевые слова: аппроксимация, алгоритм Дугласа-Пекера, формула площади Гаусса, С++ .

Babenko A.A.

2st year postgraduate student NRU "BelGU" Russia, Belgorod Babenko A.A.

1st year postgraduate student NRU ""BelGU" Russia, Belgorod

SOFTWARE IMPLEMENTATION OF FINDING THE PERIMETER

AND THE AREA OF THE FIGURE USING APPROXIMATION

Abstract: The article implements a program for finding the perimeter and area using approximation. The Douglas-Pecker algorithm was used to approximate a given figure.

Keywords: approximation, the Douglas-Pecker algorithm, the Gauss area formula, C++ .

Для аппроксимации заданной фигуры был использован алгоритм Дугласа-Пекера. Алгоритм Дугласа-Пекера — это алгоритм, позволяющий уменьшить число точек кривой, аппроксимированной большей серией точек. Суть алгоритма состоит в том, чтобы по данной ломаной, аппроксимирующей кривую, построить ломаную с меньшим числом точек. Алгоритм определяет расхождение, которое вычисляется по

максимальному расстоянию между исходной и упрощённой кривыми. Упрощенная кривая состоит из подмножества точек, которые определяются из исходной кривой. Для нахождения периметра фигура разбивалась на отрезки, и вычислялись их длины с помощью расстояния Евклида между двумя точками. Существующие множество методов нахождения площади, но для конкретной задачи будут использоваться два следующих метода: формула площади Гаусса и нахождение площади по подобию многоугольников. Для написания программы была выбрана среда программирования Visual Studio 2019 C++, основанная на языке программирования C++. Данная среда выгодно отличается эффективностью и надежностью

Программная реализация нахождения периметра и площади с использованием аппроксимации:

1.Нахождения максимального расстояния

Листинг кода на С++нахождения максимального расстояния: double calculateDistance(const Point& pt, const Point& lineStart, const Point& lineEnd) {

double dx = lineEnd.first - lineStart.first; double dy = lineEnd.second - lineStart.second; double mag = pow(pow(dx, 2.0) + pow(dy, 2.0), 0.5); if (mag > 0.0) { dx /= mag; dy /= mag;}

double pvx = pt.first - lineStart.first; double pvy = pt.second - lineStart.second; double pvdot = dx * pvx + dy * pvy; double dsx = pvdot * dx; double dsy = pvdot * dy;//Вычесть его из pv double ax = pvx - dsx; double ay = pvy - dsy; return pow(pow(ax, 2.0) + pow(ay, 2.0), 0.5); } double dmax = 0.0; size_t index = 0; size_t end = pointList.size() - 1; for (size_t i = 1; i < end; i++) {

double d = calculateDistance(pointList[i], pointList[0], pointList[end]);

if (d > dmax) {

index = i; dmax = d;} }

Рисунок 1 - Блок схема нахождения максимального расстояния

2. Алгоритм аппроксимации методом Дугласа-Пекера

Листинг кода на С++ алгоритма Дугласа-Пекера:

if (dmax > epsilon) { //Если максимальное расстояние больше 8, упростить кривую vector<Point> recResults1; vector<Point> recResults2; vector<Point> firstLine(pointList.begin(), pointList.begin() + index + 1); vector<Point> lastLine(pointList.begin() + index, pointList.end()); mainAlgorithm(firstLine, epsilon, recResults1); mainAlgorithm(lastLine, epsilon, recResults2);

//Построить список с результатами out.assign(recResults1.begin(), recResults1.end() - 1); out.insert(out.end(), recResults2.begin(), recResults2.end());

if (out.size() < 2) throw runtime_error(мПроблема с построением списка вывода");

}

else {//Иначе вернуть точки start и end

out.clearQ; out.push_back(pointList[0]); out.push_back(pointList[end]); }}

Рисунок 2 - Блок схема алгоритма Дугласа-Пекера

3. Нахождение я периметра и площади

Листинг кода на С++ нахождения периметра for (size_t i = 0; i < pointList1.size(); i++) { if (i != pointList1.size() - 1) {

P1 += sqrt(pow((pointList1[i + 1].first - pointList1[i].first), 2.0) + pow((pointList1[i + 1].second - pointList1[i].second), 2.0));

S1 += 0.5 * abs(pointList1[i].first * pointList1[i + 1].second - pointList1[i + 1].first * pointList 1[i]. second);} else{

P1 += sqrt(pow((pointList1[0].first - pointList1[i].first), 2.0) + pow((pointList1[0].second - pointList1[i].second), 2.0));

51 += 0.5 * abs(pointList1[i].first * pointList1[0].second - pointList1[0].first * pointList 1[i]. second);}}

for (size_t i = 0; i < pointListOut.size(); i++) { if (i != pointListOut.size() - 1) {

P2 += sqrt(pow((pointListOut[i + 1].first - pointListOut[i].first), 2.0) + pow((pointListOut[i + 1].second - pointListOut[i].second), 2.0));} else{

P2 += sqrt(pow((pointListOut[0] .first - pointListOut[i].first), 2.0) + pow((pointListOut[0].second - pointListOut[i].second), 2.0));}}

52 = S1 * pow(P2,2.0) / pow(P1,2.0); cout « "Периметр P1 = " « P1 « endl; cout « "Периметр P2 = " « P2 « endl; cout « "Площадь S1 = " « S1 « endl; cout « "Площадь S2 = " « S2 « endl;

Рисунок 3 - Блок нахождения периметра и площади Тестирование алгоритма Дугласа-Пекера

Фигура для аппроксимации представлена на рис. 4.

Рис. 4. Входное изображение Периметр и площадь фигуры при 8=0,5, рис.5.

I Консоль отладки Microsoft Visual Studio

Введите погрешность epsilon = 0.5 Входные данные :

х1(0,-1б), х2(-2,-16), хЗ(-5,-14), х4(-8,-8), х5(-8,-5), х6(-б,-1), х7(-2,2), х8(-2,7), х9(-4,10), х10(-7Д1), х!1(-7,-1 2), х12(-б,13), х13(б,13), х14{7,12), х15(7,11), х1б(4,10), х17(2,7), х18(2,2), х19(б,-1), х20(8,-5), х21(8,-8), х22(5,-14), х2В(2,-16)j

Аппроксимированная кривая :

х1(0,-16), х2(-2,-16), хЗ(-5,-14)j х4(-8,-8), х5(-8,-5), х6(-6,-1), х7(-2,2), х8(-2,7), х9(-4,10), х10(-7,11), xll(-7,-l 2), х12(-6,13), х13(б,13), х14(7,12), х15(7Д1), х1б(4,10), х17(2,7), х!8(2,2), х!9(б,-1), х20(8,-5), х21(83-8), х22(53-14), х23(2,-16),

Периметр PI = 5В.902 Периметр Р2 = 1В5.542 Площадь S1 = 72 Площадь S2 = 381.257

Рисунок 5 - Периметр и площадь фигуры при 8=0,5 Периметр и площадь фигуры при 8=2, рис.6._

I Консоль отладки Microsoft Visual Studio

Введите погрешность epsilon = 2

- □ X

Входные данные :

х1(0,-1б), х2(-2,-16), хЗ(-5,-14), х4(-8,-S), х5(-8,-5), хб(-6,-1), х7(-2,2), х8(-2,7), х9(-4,10), х1Э(-7,11), xll(-7,-l 2), х12(-6,13)д х13(6,13), х14(7Д2), х15(7,11), х16(4,1в), х17(2,7), х18(2,2), х19(6,-1), х20(8,-5), х21(8,-8), х22(5,-14), х23(2,-16),

Аппроксимированная кривая :

xl(0,-16), х2(-5,-14), хВ(-8,-8), х4(-2,2), х5(-2,7), х6(-7,11), х7(-7,-12), х8(-6,13), х9(7,12), х10(2,7), xll(2,2), xl 2(8,-8), х13(2,-16),

Периметр Р1 = 58.902 Периметр Р2 = 131.95 Площадь S1 = 72 Площадь 52 = 361.318

Рисунок 6 - Периметр и площадь фигуры при 8=2

Фигура после аппроксимации с 8=0,5 представлена на рис. 23.

Рисунок 7 - Фигура после аппроксимации с 8=0,5

Использованные источники:

1. Дейтел Х.М. Как программировать на С++: Пятое издание / Х.М. Дейтел, - С.Пб. ООО «Бином-Пресс», 2011. - 1456 с.

2. Понарин Я.П. Элементарная геометрия. Том 1. Планиметрия, преобразования плоскости / Я.П. Понарин, - М.: МЦНМО, 2004. — 312 с.

3. Семина Е.В. Основы алгоритмизации и структурного программирования на C++: учебно-методическое пособие / Е.В. Семина, А.В. Артемов, - Орел, 2014. - 48 с.

i Надоели баннеры? Вы всегда можете отключить рекламу.