Пояснительная записка (1234703), страница 5
Текст из файла (страница 5)
}
nn++;
current.push_back(h);
if(fabs(h) == fabs(arc/2)){
current.push_back(arc);
}
if(h != 0){
mathPrevious.push_back(h/2);
mathPrevious.push_back(arc*3/4);
}
}
else if(h - 3*angle <= arc){
if(tt == 0){
angle = fabs((arc - h)/3);
}
if(fabs(h - angle) > fabs(arc - pi/18000)) break;
current.push_back(h);
mathPrevious.push_back(h - angle/2);
if(tt == 2){
current.push_back(arc);
}
tt++;
}
else{
current.push_back(h);
mathPrevious.push_back(h - angle/2);
}
p.setPen(QPen(Qt::black, 4, Qt::SolidLine));
p.drawPoint(width()/2 + x*cos(h), height()/2 + x*sin(h));
if(i == 0){
}
}
Код, реализующий вычисление углов, также можно разделить на 3 части, каждая из которых состоит условия. В первом условии вычисляются углы для области, угол которой меньше угла, зависящего от шага:
.
Во втором условии вычисляются углы для области, угол которой больше значения переменной angle, но меньше, значения той же переменной, умноженной на два:
.
В третьем условии вычисляются углы для той области, которая образуется между границей области третьим с конца узлом (то самое условие, благодаря которому исключается возможность появления острых треугольников см. глава 2):
.
Далее высчитываются все прочие углы, не попавшие в данные условия. После вычисления всех углов, располагающихся на данной линии уровня происходит их отрисовка.
3.4 Реализация алгоритма соединения узлов
Чтобы реализовать алгоритм соединения узлов использовался следующий код:
int hh = 0;
double backZ = 0;
for(int j = 0; j < halfPrevious.size(); j++){// CYCLE FOR TRIANGULATING NODES
if(i == 0) break;
QVector <double> minimum;
double min = 100;
double minZ = 0;
for(int z = 0; z < current.size(); z++){// CYCLE FOR CALCULATING MIN
minimum.push_back(fabs(halfPrevious[j] - current[z]));
if(min > minimum[z]){
min = minimum[z];
minZ = z;
}
}
int g = minZ;
p.setPen(QPen(Qt::red, 1, Qt::SolidLine));
if( abs( minZ - backZ ) > 1 ) {
p.drawLine(width()/2 + xPrevious*cos(previous[hh]), height()/2 + xPrevious*sin(previous[hh]), width()/2 + x*cos(current[minZ - 1]), height()/2 + x*sin(current[minZ - 1]));
}
backZ = minZ;
p.drawLine();
p.drawLine();
hh++;
}
Реализация алгоритма соединения узлов происходит следующим образом:
– прежде всего задается цикл с счетчиком j, в котором хранятся значения биссектрис двух соседних пар узлов предыдущей линии уровня.
for(int j = 0; j < halfPrevious.size(); j++){
...
}
– в объявленном цикле задается вектор, в котором будут храниться значения минимумов
QVector <double> minimum;
– далее объявляется цикл с счетчиком z, в котором хранятся значения углов, на которых располагаются узлы для текущей линии уровня.
for(int z = 0; z < current.size(); z++){
...
}
В данном цикле перебираются все значения углов, от каждого значения отнимается текущее значение счетчика j, находится минимальная разница и записывается в вектор minimum.
– проверяется условие на взаимодействие каждого узла предыдущей линии уровня с каким-либо узлом текущей линии уровня (см. глава 2).
int g = minZ;
if(abs( minZ - backZ ) > 1){
...
}
backZ = minZ;
– рисуются линии от каждой пары соседних узлов предыдущей линии уровня с тем узлом текущей линии уровня, в котором вычислена минимальная разница между счетчиками j и z.
ЗАКЛЮЧЕНИЕ
В настоящее время во многих отраслях таких как строительство, в горнодобывающей промышленности, в машиностроении, аэро- и гидро динамике возникает необходимость решения определенных задач с помощью метода конечных элементов.
Суть МКЭ заключается в разбиении конкретной области на определенное число элементов [34]. Каждый элемент называется конечным элементом, а совокупность всех элементов – сеткой.
В ходе выполнения ВКР была реализована программа, которая позволяет строить вычислительную сетку со сгущением к вершине входящего угла. В функционал программы входят возможности изменения радиуса исследуемой области, изменения угла исследуемой области, а благодаря такой возможности как изменение количества линий уровня можно изменять точность вычислений, в зависимости от надобности.
Программа была реализована на языке С++ с использованием объектно-ориентированного программирования (ООП). В качестве компилятора был выбран Qt.
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
1 Сиддхартха Рао Освой самостоятельно С++ за 21 день: Учеб. пособие. – 7-е изд., 2013. – 401 с.
2 Парата С. Язык программирования С++. Лекции и упражнения. 5-е издание. – М.: Издательский дома «Вильямс», 2007. – 237 с.
3 Herb S., Andrei A. C++ Coding Standarts // Tutorial. 2010. Vol. 1.
4 Bjarne S. Programming. Principles and Practice Using C++ // Tutorial. 2014. Vol. 2. N.1.
5 Эккель Б. Философия С++. Введение в стандартый С++. Том 1. 2-е издание. – СПб.: Изд-во Питер, 2004.
6 Stanley B.L., Josee L., Barbara M. C++ Primer // Turorial. 2013. Vol. 5.
7 Scott M. Effective C++. 55 Specific Ways to Improve Your Programs and Designs // Adv. Eng. Software. 2008. Vol. 1.
8 David V., Nicolai M. J. C++ Templates The Complete Guide // Tutorial. 2010. Vol. 5.
9 Anthony W. C++ Concuerrency in action. Practical Multithreading // Tutorial. 2012. Vol. 1.
10 Макс Шлее Профессиональное программирование на С++. Qt 4.5. (В подлиннике). – СПб.: Изд-во БХВ-Петербург, 2012. – 832 с.
11 Марк Саммерфилд Qt Профессиональное программирование (High tech). – СПб.: Изд-во Символ-Плюс, 2011.
12 Боровский А.Н. Практическое программирование на С++. Qt 4.7. / А.Н. Боровский. – СПб.: Изд-во БХВ-Петербург, 2012. – 315 с.
13 Бланшет М., Саммерфилд М. Программирование GUI на С++. Qt 4.8 / Второе изд. – М.: Изд-во Кудиц-пресс, 2008. – 714 с.
14 Вержибичкий, В.М. Основы численных методом / В.М. Вержибицикий. – М.: Высшая школа, 2002. – 333 с.
15 Корн, Г. Справочник по математике (для научных работников и инженеров) / Г.Корн, Т. Корн. – М.: Наука, 1973. 219 с.
16 Ю.В. Немировский, С.Ф. Пятаев Автоматизированная триангуляция многосвязных областей со сгущением и разрежением узлов
17 Построение вычислительной сетки: [Электронный ресурс]. URL: http://dolivanov.ru/node/64 (Дата обращения: 10.06.2016).
18 Скворцов А.В. Алгоритмы построения и анализа триангуляции // А.В. Скворцов, Н.С. Мирза. – Томск: Изд-во Том. ун-та, 2006.
19 Вычислительная геометрия: Триангуляция: [Электронный ресурс]. URL: http://rain.ifmo.ru/cat/data/theory/math/triangulation-2008 (Дата обращения 15.06.2016).
20 Скворцов А.В. Триангуляция Делоне и ее применение // А.В. Скворцов. – Томск: Изд-во Том. Ут-та, 2002.
21 Shapiro M. A note on Lee and Schachter’s algorithm for Delaunay triangula-tion // Inter. Jour. of Comp. and Inf. Sciences. 1981. Vol. 10. N. 6.
22 Lawson C. Software for C surface interpolation // Mathematical Software III. NY: Academic Press. 1977.
23 Lee D., Schachter B. Two algorithms for constructing a Delaunay triangula-tion // Int. Jour. Comp. and Inf. Sc. 1980. Vol. 9. N. 3.
24 Скворцов А.В., Костюк Ю.Л. Эффективные алгоритмы построения триангуляции Делоне// Геоинформатика. Теория и практика. Вып. 1. Томск: Изд-во Том. ун-та, 1998. – 592 с.
25 Sloan S.W. A fast algorithm for constructing Delaunay triangulations in the plane // Adv. Eng. Software. 1987. Vol. 9. N. 1.
26 Watson D.F. Computing the n-dimensional Delaunay tessellation with appli-cation to Voronoi polytopes // The Computer Journal. 1981. Vol. 24. N. 2.
27 Guibas L., Stolfi J. Primitives for the manipulation of general subdivisions and the computation of Voronoi diagrams // ACM Transactions on Graphics. Vol. 4. N. 2. 1985.
28 Разделяй-и-властвуй [Электронный ресурс]. URL:
http://algolist.manual.ru/maths/geom/convhull/divide_conquer.php (Дата обращения 18.06.2016).
29 McCullagh M.J., Ross C.G. Delaunay triangulation of a random data set for isarithmic mapping // The Cartographic Journal. 1980. Vol. 17. N. 2.
30 Обзор алгоритмов триангуляции неявно заданной поверхности [Электронный ресурс]. URL:
https://ea1d20cee84f16acd35e7269e98d85dd78c284cb.googledrive.com/host (Дата обращения 2.06.2016).
31 Построение триангуляции Делоне (модели TIN) [Электронный ресурс]. URL: http://lektsii.com/1-74022.html (Дата обращения 10.06.2016).
32 Lewis B., Robinson J. Triangulation of planar regions with applications // The Computer Journal. 1978. Vol. 21. N. 4.
33 Теорема коснусв. Доказательство теоремы косинусов [Электронный ресурс]. URL: https://www.calc.ru/Teorema-Kosinusov-Dokazatelstvo-Teoremy-Kosinusov.html (Дата обращения 18.06.2016).
34 Метод конечных элементов в композитной отрасли [Электронный ресурс]. URL: http://mastermodel.ru/articles/metod-konechnyh-elementov-v-kompozitnoy-otrasli (Дата обращения 19.06.2016).
35 Гопкало, В.Н. Выпускная квалификационная работа. Общие требования и правила оформления: методическое пособие. / В.Н. Гопкало, О.А. Графский – Хабаровск: изд-во ДВГУПС, 2014. – 41 с.
ПРИЛОЖЕНИЕ А
(справочное)
Реализация алгоритма плоской триангуляции
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "QPainter"
#include "QVector"
#include "math.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::paintEvent(QPaintEvent *)
{
QPainter p(this);
double x = 0;
double xPrevious = 0;
double pi = acos(-1.0);
double length = ui->lineEdit->text().toDouble();
double arc1 = ui->lineEdit_2->text().toDouble();
double count = ui->lineEdit_3->text().toInt();
double arc = -arc1*pi/180;
double angle = 0;
double n = 1;
double m = 0;
double power = 0;
double t = 1;
double step = 0;
QVector <double> previous;
QVector <double> mathPrevious;
QVector <double> halfPrevious;
QVector <double> current;
previous.clear();
mathPrevious.clear();
halfPrevious.clear();
current.clear();
for(int i = 0; i < count; i++){// CYCLE FOR DRAWING AND TRIANGULATING EACH LINE OF LEVEL
halfPrevious = mathPrevious;
mathPrevious.clear();
previous = current;
current.clear();
int tt = 0;
int nn = 0;
power = pow(count, 2);
m = length/power;
xPrevious = x;
x = m*n;
t++;
n = pow(t, 2);
step = (x - m*pow(t - 2, 2));
angle = acos((2*pow(x, 2) - pow(step, 2))/(2*pow(x, 2)));
p.setPen(QPen(Qt::red, 1, Qt::SolidLine));
//p.drawArc(width()/2 - x, height()/2 - x, 2*x, 2*x, 0, arc1*16);
p.drawLine(width()/2, height()/2, width()/2 + x, height()/2);
p.drawLine(width()/2, height()/2, width()/2 + x*cos(arc), height()/2 + x*sin(arc));
p.setPen(QPen(Qt::black, 4, Qt::SolidLine));
p.drawPoint(width()/2 + x*cos(arc), height()/2 + x*sin(arc));
p.drawPoint(width()/2, height()/2);
p.drawPoint(width()/2 + x, height()/2);
for(double h = 0; h > arc; h -= angle){// CYCLE FOR CONNECTING NODES, LOCATED ON THE SAME LINE OF LEVEL AND MATH ANGLES
if (h == arc) break;
p.setPen(QPen(Qt::red, 1, Qt::SolidLine));
if(fabs(angle) >= fabs(arc)){
angle = fabs(arc);
p.drawLine(width()/2 + x*cos(h), height()/2 + x*sin(h), width()/2 + x*cos(arc), height()/2 + x*sin(arc));
current.push_back(h);
current.push_back(arc);
mathPrevious.push_back(arc/2);
}
else if(fabs(angle) <= fabs(arc) && fabs(arc) <= fabs(2*pi/3)){
if(nn == 0){
angle = fabs(arc/2);
}















