Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 38

КУРСОВА РОБОТА

КР.КІ– 43.00.000 П3
Група КІ-22-2
Перегіняк Христина
2023
Івано-Франківський Національний Технічний
Університет Нафти і Газу

Кафедра комп’ютерних систем і мереж

КУРСОВА РОБОТА
з дисципліни ОБ’ЄКТНО ОРІЄНТОВАНЕ ПРОГРАМУВАННЯ

Тема: Розрахунок периметру фронтальної/горизонтальної проекцій: тетраедр,


4-на призма, куля.

ПОЯСНЮВАЛЬНА ЗАПИСКА

КР.КІ - 43.00.000.ПЗ

Студентка гр.КІ-22-2 (Перегіняк Х. В.)


(підпис)

Допускається до захисту
Керівник курсової роботи

_________________________________________
(посада) (підпис) (дата) (розшифровка підпису)

м. Івано-Франківськ
2023
Івано-Франківський Національний Технічний Університет Нафти і Газу
Інститут інформаційних технологій
Кафедра комп'ютерних систем і мереж
Дисципліна - Об'єктно-орієнтоване програмування
Спеціальність - Комп'ютерна інженерія
Курс - 2, Група – КІ-22-2, Семестр – 3

ЗАВДАННЯ
НА КУРСОВУ РОБОТУ

Студентці Перегіняк Христині Василівні

1. Тема роботи: Розробити програму з інтерфейсом зчитування наборів даних


для розрахунку периметру фронтальної/ горизонтальної проекцій: тетраедр, 4-
на призма, куля.
2. Термін здачі студентом закінченої роботи – 14 грудня 2023 року
3. Зміст пояснювальної записки:
- поняття периметру проекцій, формули, проекції тетраедру, 4-ної призми,
кулі;
- опис даних для представлення фігур: тетраедру, 4-ної призми, кулі,
позначення операцій розрахунку в форматі txt файлу та розробка алгоритмів і
блок-схем розрахунку периметру;
- розробка ієрархії класів на основі похідного класу shape для фігур: тетраедр,
4-на призма, куля;
- перевірка роботи розроблених функцій/методів за допомогою Unit-тестів;
4. Дата видачі завдання – 12 вересня 2023 року
КАЛЕНДАРНИЙ ПЛАН

Номер і назва етапів курсової роботи Термін виконання Примітка

1. Підготовка до виконання курсової роботи,


12.09.2023 – 20.09.2023
вибір літератури
2. Формули розрахунку периметру фігур
фронтальної та горизонтальної проекцій та
21.09.2023 – 04.10.2023
розробка структури файлу, блок-схем,
алгоритмів
3. Розробка структури txt файлу програми на
05.10.2023 – 20.10.2023
мові С++
4. Результати Unit–тестів, функціонування
21.10.2023 – 10.11.2023
програми, опис інтерфейсу, вхідні дані
5. Оформлення пояснювальної записки
11.11.2023 – 02.12.2023

6. Підготовка до здачі та здача курсової


02.12.2023 – 14.12.2023
роботи

Студентка Перегіняк Х. В.
(підпис) (розшифровка підпису)

Керівник проекту Мельничук С. І


(підпис) (розшифровка підпису)
Анотація

Робота присвячена розробці програми з інтерфейсом зчитування наборів


даних для розрахунку периметру фронтальної/ горизонтальної проекцій:
тетраедр, 4-на призма, куля.
У першій частині курсової роботи наведені дані які необхідні для
розрахунку периметрів фронтальної та горизонтальної проекцій, структура
запису вхідних даних у файл.
Друга частина роботи включає опис завдання за допомогою діаграм UML,
представлення алгоритмів та побудову діаграм класів, що ілюструють ієрархію
класів та визначають модифікатори доступу. Розглянуто варіанти використання
програми через Use-Case діаграму.
Третя частина містить реалізацію програми, в якій описано базовий клас
та представлено приклади похідних класів. Проведено тестування методів
розрахунку, включаючи unit-тести, які підтвердили коректну роботу програми.
Дана курсова робота виконана на мові програмування C++
використанням IDE Microsoft Visual Studio 2022.
Ключові слова: клас, метод, код, програмне забезпечення, фронтальна
проекція, горизонтальна проекція, тетраедр, чотирикутна призма, куля.
Summary

The work is devoted to the development of a program with an interface for


reading data sets for calculating the perimeter of frontal/horizontal projections: tetra-
hedron, 4-axis prism, sphere.
The first part of the course work contains the data required to calculate the
perimeters of the frontal and horizontal projections, the structure of writing input data
to the file.
The second part of the work includes a description of the task using UML di-
agrams, presentation of algorithms and construction of class diagrams illustrating the
class hierarchy and defining access modifiers. The article describes the options for
using the application through a Use-Case diagram.
The third part contains the implementation of the program, which describes
the base class and provides examples of derived classes. The calculation methods
were tested, including unit tests, which confirmed the correct operation of the pro-
gram. This course work was written in the C++ programming language using the
Microsoft Visual Studio 2022 IDE.
Keywords: class, method, code, software, frontal projection, horizontal pro-
jection, tetrahedron, quadrilateral prism, sphere
ЗМІСТ
1. Розділ 1 Теоретичні відомості 2
1.1. Поняття периметру та проекцій 2
1.2. Розрахунок довжин проекцій 6
1.3. Опис структури txt файлу 8
2. Розділ 2 Розробка структурного забезпечення 10
2.1. Побудова блок-схем 10
2.2. Побудова use-case діаграми 12
2.3. Побудова діаграми класів 14
3. Розділ 3 Реалізація і демонстрація коду програми 15
3.1. Розробка допоміжної структури 15
3.2. Розробка базового класу 16
3.3. Розробка похідних класів 19
3.4. Демонстрація роботи програми 22
3.5. Розробка Unit-тестів 23
3.6. Результат виконання Unit-тестів 23
ВИСНОВКИ 25
СПИСОК ВИКОРИСТАНОЇ ЛІТЕРАТУРИ 26
ДОДАТКИ 27

КР.КІ-43.00.00.000 ПЗ
Змн Лист № докум. Підпис Дата
Розроб. Перегіняк Х. В Розрахунок периметру Літ. Арк. Аркушів
Перевір. Мельничук С.І н 1 26
фронтальної/горизонтальної
Реценз.
проекцій: тетраедр, 4-на
Н. Контр. ІФНТУНГ,КІ-22-2
Затверд. призма, куля.
Розділ 1. Теоретичні відомості

1.1 Поняття периметру та проекцій


Периметр проекцій — це відстань по контурі проекції об'єкта на площину
проекції. Він становить собою суму довжин відрізків, які утворюють контур
об'єкта на площині проекції.
Тетраедр
Тетраедр - це геометричне тіло, яке має чотири трикутних грані та шість
ребер. Кожне ребро з'єднує одну пару вершин, і всі вершини тетраедра лежать в
одній площині. Тетраедр є одним із простих полігональних тіл і важливим
об'єктом у геометрії. Тетраедр може бути описаний за допомогою чотирьох
вершин та шести ребер.
Характеристики тетраедра:
1. Грані: Чотири трикутних грані.
2. Вершини: Чотири вершини, кожна пов'язана з рештою трьома ребрами.
3. Ребра: Шість ребер, кожне пов'язане з двома вершинами.
4. Висоти: Тетраедр має чотири висоти, які відповідають лініям, що
перпендикулярні до граней та проходять через їх вершини.

Рисунок 1.1 - Тетраедр

Проекції тетраедра: Тетраедр має чотири грані, і його проекції можуть


бути зображені на площині проекції. Зазвичай використовуються ортографічні
проекції (проекції, які проводяться з паралельних ліній зору).
Фронтальна проекція тетраедра: Фронтальна проекція відображає

Арк.
КР.КІ-43.00.00.000 ПЗ 2
Змн. Арк. № докум. Підпис Дата
тетраедр так, як він виглядає при огляді ззаду або спереду, паралельно до одного
з його ребер або вздовж осі. Щоб знайти фронтальну проекцію точки тетраедра,
потрібно проекцію відповідної вершини тетраедра на площину фронтальної
проекції.
Якщо координати вершин тетраедра відомі, то координати їх фронтальних
проекцій можна отримати, вибираючи відповідні координати та ігноруючи одну
з осей (наприклад, вибираючи x та y для фронтальної проекції).
Формула фронтальної проекції точки (x, y, z) може виглядати так: Pf (=xf , yf )

Рисунок 1.2 - Фронтальна проекція тетраедра

Горизонтальна проекція тетраедра: Горизонтальна проекція відображає


тетраедр так, як він виглядає при огляді зверху, паралельно до одного з його
ребер або вздовж осі. Щоб знайти горизонтальну проекцію точки тетраедра,
потрібно проекцію відповідної вершини тетраедра на площину горизонтальної
проекції.Якщо координати вершин тетраедра відомі, то координати їх
горизонтальних проекцій можна отримати, вибираючи відповідні координати та
ігноруючи одну з осей (наприклад, вибираючи x та z для горизонтальної
проекції). Формула горизонтальної проекції точки (x, y, z) може виглядати так:

Ph=(xh, zh).

Арк.
КР.КІ-43.00.00.000 ПЗ 3
Змн. Арк. № докум. Підпис Дата
Рисунок 1.3 - Горизонтальна проекція тетраедра

Призма
Чотирикутна призма - це геометричне тіло, у якого обидві основи є
чотирикутниками (четвертий кут). Бокові грані призми є прямокутниками, і вони
з'єднують відповідні вершини основ.
Така призма може мати різні форми чотирикутних основ, такі як квадрат
(якщо обидва чотирикутники основ однакові) або прямокутник (якщо
чотирикутники основ різні).

Рисунок 1.4 - Чотирикутна призма

Проекції чотирикутної призми — це спосіб відображення геометричного


тіла на площині.
Фронтальна проекція чотирикутної призми: Фронтальна проекція
чотирикутної призми, яка розташована перед площиною проекції, буде
відображати передній чотирикутник (основа) та лінії, які з'єднують відповідні
кути цього чотирикутника з відповідними кутами заднього чотирикутника.

Арк.
КР.КІ-43.00.00.000 ПЗ 4
Змн. Арк. № докум. Підпис Дата
Рисунок 1.5 - Фронтальна проекція чотирикутної призми

Горизонтальна проекція чотирикутної призми: Горизонтальна проекція


чотирикутної призми, яка розташована вгорі площини проекції, відобразить
верхній чотирикутник (основа) та лінії, які з'єднують відповідні кути цього
чотирикутника з відповідними кутами нижнього чотирикутника.

Рисунок 1.6 - Горизонтальна проекція чотирикутної призми


Куля
Куля - це геометричне тіло, яке складається з усіх точок простору,
розташованих на однаковій відстані від фіксованої точки, яку називають
центром кулі. Ця відстань від центру до будь-якої точки на кулі називається
радіусом.
Основні характеристики кулі:
1. Центр кулі: Фіксована точка в просторі, відносно якої розташовані всі точки
кулі.
2. Радіус кулі: Відстань від центру кулі до будь-якої точки на її поверхні.
3. Поверхня кулі: Сукупність всіх точок, розташованих на відстані рівній
радіусу від центру.
4. Діаметр кулі: Відстань між двома точками на поверхні кулі через її центр.
Дорівнює удвічі радіусу.
5. Об'єм кулі: Об'єм простору, обмеженого поверхнею кулі. Формула:
V =¾ πr ³ (1.1)
де r - радіус кулі.

Арк.
КР.КІ-43.00.00.000 ПЗ 5
Змн. Арк. № докум. Підпис Дата
6. Площа поверхні кулі: Площа зовнішньої поверхні кулі. Формула:
A=4 πr ² (1.2)
де r - радіус кулі.

Рисунок 1.7 - Куля

Фронтальна проекція кулі: Для фронтальної проекції, коли тіло


розташоване перед площиною проекції, фронтальна проекція кулі
відображатиме передню частину кулі.
Горизонтальна проекція кулі: Для горизонтальної проекції, коли тіло
розташоване вгорі площини проекції, горизонтальна проекція кулі відобразить
верхню частину кулі.

1.2 Розрахунок довжин проекцій


Для розрахунку фронтальної та горизонтальної проекцій, розглянемо
тетраедр і визначимо довжини його проекцій.
Довжина фронтальної проекції:
- Знаходження максимального та мінімального значення координати z серед
вершин тетраедра.
- Різниця між цими значеннями дасть висоту тетраедра ℎ.
- Довжина фронтальної проекції буде дорівнювати висоті тетраедра:
Lf =h (1.3)
Довжина горизонтальної проекції:
- Знаходження максимального та мінімального значення координати y (або x)

Арк.
КР.КІ-43.00.00.000 ПЗ 6
Змн. Арк. № докум. Підпис Дата
серед вершин тетраедра.
- Різниця між цими значеннями дасть ширину тетраедра в горизонтальній
площині w.
- Довжина горизонтальної проекції буде дорівнювати ширині тетраедра:
Lh=w (1.4)
Довжина фронтальної і горизонтальної проекцій чотирикутної призми
залежить від розміщення її вершин у просторі та орієнтації.
Довжина фронтальної проекції:
- Знаходження максимального та мінімального значення координати z серед
вершин чотирикутної призми.
- Різниця між цими значеннями дасть висоту призми h.

- Довжина фронтальної проекції буде дорівнювати висоті призми:


Lf =h (1.5)
Довжина горизонтальної проекції:
- Знаходження максимального та мінімального значення координати y (або x)

серед вершин чотирикутної призми.


- Різниця між цими значеннями дасть ширину призми в горизонтальній площині

w.
- Довжина горизонтальної проекції буде дорівнювати ширині призми.
Lh=w (1.6)
Довжина фронтальної та горизонтальної проекцій кулі може бути
розрахована залежно від типу проекції та відстані між центром кулі та
площиною проекції. Розглянемо обидві ситуації для ортографічної проекції:
Довжина фронтальної проекції:
- Фронтальна проекція відбиває тіло на площині, яка розташована перед тілом.

- Довжина фронтальної проекції буде рівна діаметру кулі. Якщо d - діаметр

кулі, то довжина фронтальної проекції буде


Lf =d (1.7)
Довжина горизонтальної проекції:
- Горизонтальна проекція відбиває тіло на площині, яка розташована вгорі тіла.

- Довжина горизонтальної проекції буде залежати від відстані між центром кулі
Арк.
КР.КІ-43.00.00.000 ПЗ 7
Змн. Арк. № докум. Підпис Дата
та площиною проекції. Якщо D - це відстань, то довжина горизонтальної
проекції буде
Lh=2 √ R2−D2 (1.8)
де, R - радіус кулі.
Для розрахунку коефіцієнта подібності потрібно довжину від центру
проектування до проектованої фігури поділити на довжину від центру
проектування до фігури. Звідси коефіцієнт подібності k розраховується за
формулою:
b
k= (1.9)
a
де, b – довжина від центру проектування до проектованої фігури, a – довжина від
центру проектування до фігури.

1.3 Опис структури файлу


Для правильного прочитання файлу програмою потрібна правильна
структура файлу, а саме:
Записувати завдання до файлу можна тільки одним способом:
параметричним – оскільки для курсової роботи це буде більше чим достатньо.
Для курсової роботи я взяла простий текстовий файл та записала параметри для
кожної фігури.
Тому для запису файлу в курсову роботу потрібно спочатку заповнити
файл input1.txt з проекту:
[назва фігури]: [координата х] [координата y] [координата z]
де знаки «:» є обов’язковим, також важливим пунктом є те, що ніяких інших
розділових знаків використовуватись не повинно, в тому числі і пробілів , де «_»
означає пробіл. Обов’язковим пунктом є задання координат фігури після знаку
«:» та її назви англійською мовою.
Для позначення фігури тетраедр використаємо «Tetrahedron:», і так
аналогічно до кожної фігури. Отже запис в файл виглядатиме наступним чином:
Tetrahedron: 5.0 5.2 4.3 3.1...
Ball: 5.0 5.2 4.3 3.1...
Арк.
КР.КІ-43.00.00.000 ПЗ 8
Змн. Арк. № докум. Підпис Дата
Prizma: 2.5 3.0 5.0 0.5...
де, Tetrahedron – назва фігури, цифри — це дані точок
Дані для файлу text.txt потрібно заносити в текстовому файлі. Приклад
файлу з даними подано на рисунку 1.5.
Таким чином структура запису кожного рядка для кожної фігури матиме
наступний вигляд:
Ball: 5.0 5.2 4.3 3.1 2.5 0.5 4.0 3.0 2.5 3.0 5.0 5.0 0.5 4.0 3.0 2.5 3.0 5 5.0 5.2 4.3 3.1
2.5 0.5 4.0 3.0 2.5 3.0 5.0 5.0 0.5
Prizma: 2.5 3.0 5.0 0.5 4.0 3.0 3.0 2.5 4.0 0.0 0.0 2.5 3.0 5.0 0.5 4.0 3.0 2.5 3.0 0.5
4.0 5.0 3.5 0.0 1.5 3.0 4.0 0.5 4.0 3.0 2.5 3.0 5.0 0.0 0.0 2.5 3.0 5.0 0.5 4.0 3.0 2.5
Tetrahedron: 0 0 0 1 0 0 0 1 0 0 0 1 0.5 0.5 2 0.5 0.5 1 0.5 0.5 0 0 1 1 0 1 0 0 0 1 0
В такому вигляді можна записувати дані у файл text.txt.
Дані для файлу text.txt можна заносити в звичайному текстовому
редакторі, іншими словами блокноті. Приклад файлу з даними подано на рис.
1.5.

Рисунок 1.5 - Приклад файлу з даними

Зчитування з файлу працює з певним алгоритмом: програма записує дані


для фігур по рядках. Кожен рядок тексту записується в масив рядків.
Програма шукає тільки цифри. Проходячись по рядках вона записує лише
цифри, а всі інші символи – пропускає.

Арк.
КР.КІ-43.00.00.000 ПЗ 9
Змн. Арк. № докум. Підпис Дата
Розділ 2 Розробка структурного забезпечення

2.1 Побудова блок-схем


Алгоритм програми допоможе зрозуміти, як саме працює програма, як
відбувається зчитування даних з вхідного файлу та запис результату в вихідний,
як саме відбувається розрахунок периметру проекцій.
Блок-схема для основного файлу програми наведена на рис. 2.1

Арк.
КР.КІ-43.00.00.000 ПЗ 10
Змн. Арк. № докум. Підпис Дата
Рисунок 2.1 - Блок-схема основної програми

Арк.
КР.КІ-43.00.00.000 ПЗ 11
Змн. Арк. № докум. Підпис Дата
Завдяки розробленим блок-схемам можливо зрозуміти алгоритм роботи
програми, що значно полегшує роботу.

2.2. Побудова use-case діаграми


Різновид використання, варіант використання, прецедент — у розробці
програмного забезпечення та системному проектуванні це опис поведінки
системи, як вона відповідає на зовнішні запити. Іншими словами, різновид
використання описує, «хто» і «що» може зробити з розглянутою системою.
Опис діаграми варіантів використання: Користувач створює файл із
вхідними даними. Для коректної роботи програми користувач повинен спочатку
зайти в репозиторій програми (теку, де знаходяться файли) і створити текстовий
документ з розширенням «.txt». Найкраще створити звичайний файл у Блокнот
(для Windows) і ввести в нього свої вхідні дані. Microsoft Office Word, або інші
спеціальні програми не підходять для цього завдання, оскільки вони створюють
файли, які не підходять для читання програмою, наприклад розширення «.docx».

Рисунок 2.4 - Use-case діаграма створення файлу із вхідними даними.

Арк.
КР.КІ-43.00.00.000 ПЗ 12
Змн. Арк. № докум. Підпис Дата
Наступним кроком є запуск і компіляція програми, яка є входом у
середовище, що містить код. Під час запуску програми з’являється нове вікно
(консоль), у якому користувачеві пропонується ввести ім’я файлу. Ім’я файлу
має бути вказаним користувачем і повинно містити розширення «.txt». Після
чого відбувається перевірка чи є файл, назву якого ми ввели, у репозиторії. Якщо
користувач вводить неправильне ім’я файлу, тобто якщо програма не може
знайти файл із такою назвою та розширенням у сховищі, в консолі з’явиться
повідомлення «Bad path name» і програма перестає працювати. Якщо користувач
все зробив правильно, програма відкриє файл, прочитає дані в ньому.
Якщо дані вірні, то програма розрахує периметр фронтальної/
горизонтальної проекцій: тетраедру, чотирикутної призми та кулі, вказаних у
файлі. Після цього результати записуються у файл «result.txt», цей файл
знаходиться в репозиторії програми. Окрім запису в файл, результати виводяться
на консоль, та після натискання любої клавіші клавіатури завершує свою роботу.

Рисунок 2.5 - Use-case діаграма програми


Арк.
КР.КІ-43.00.00.000 ПЗ 13
Змн. Арк. № докум. Підпис Дата
Наведені Use-case діаграми показують усі передбачені варіанти
використання програми користувачем.

2.3. Побудова діаграми класів


Класс (class) — категорія речей, що мають загальні атрибути та операції.
Сама діаграма класів являє собою набір статичних, декларативних елементів
моделі. Вона дає нам повне і розгорнуте уявлення про зв'язки в програмному
коді, функціональність та інформацію про окремі класи. На Рис. 2.6
представлена діаграма класів програми, що містить ієрархію класів з
використанням модифікаторів доступу.

Рисунок 2.6 - Діаграма класів

Атрибути, методи, конструктори, деструктори показано з областю


видимості:
- + відповідає публічним (public) атрибутам
- - відповідає приватним (private) атрибутам

Арк.
КР.КІ-43.00.00.000 ПЗ 14
Змн. Арк. № докум. Підпис Дата
Розділ 3 Реалізація і демонстрація коду програми

3.1 Розробка допоміжної структури


Робота виконувалась в IDE Microsoft Visual Studio 2022, мовою
програмування C++.
Код допоміжної структури:
struct Point3D {
double x, y, z;
friend ifstream& operator >> (ifstream& in, Point3D& data) {
in >> data.x;
in >> data.y;
in >> data.z;
return in;
}
explicit operator bool()
{
if (x || y || z)
{
return true;
}
return false;
}
Структура містить поля x, y, z для точок координат. Перевантажений
дружній потоковий оператор для класу ifstream для зчитування даних з буфера та
запису їх в поля. Цей френд-функціональний оператор перевизначає введення з
файлу (>>) для об'єктів типу Point3D. Він приймає об'єкт ifstream (in) та об'єкт
типу Point3D (data). Потім він зчитує три значення (x, y, z) з файлу in та
присвоює їх відповідним полям структури data.

Арк.
КР.КІ-43.00.00.000 ПЗ 15
Змн. Арк. № докум. Підпис Дата
Оператор приведення визначає, як структура Point3D може бути
конвертована до типу bool. За ключовим словом explicit вказує, що цей оператор
не може бути використаний для неявного перетворення типу. Якщо будь-яка з
координат (x, y, z) не дорівнює нулю, метод повертає true, що вказує на те, що
об'єкт Point3D існує (не є "порожнім"). В іншому випадку, повертається false. Це
дозволяє використовувати об'єкти Point3D в контексті, де очікується тип bool,
наприклад, в умовних виразах.

3.2. Розробка базового класу


Базовий клас:
class _3D_Shape {
protected:
Point3D frontalData[3], horizontalData[3];
bool is_created;
double calculateFrontalCoef() const
{
double A = std::sqrt(std::pow(frontalData[0].x - frontalData[1].x, 2) +
std::pow(frontalData[0].y - frontalData[1].y, 2) + std::pow(frontalData[0].z -
frontalData[1].z, 2));
double B = std::sqrt(std::pow(frontalData[0].x - frontalData[2].x, 2) +
std::pow(frontalData[0].y - frontalData[2].y, 2) + std::pow(frontalData[0].z -
frontalData[2].z, 2));
if (A <= 0 || B <= 0)
{
return -1;
}
return B / A;
}
double calculateHorizontalCoef() const
{

Арк.
КР.КІ-43.00.00.000 ПЗ 16
Змн. Арк. № докум. Підпис Дата
double A = std::sqrt(std::pow(horizontalData[0].x - horizontalData[1].x, 2) +
std::pow(horizontalData[0].y - horizontalData[1].y, 2) + std::pow(horizontalData[0].z -
horizontalData[1].z, 2));
double B = std::sqrt(std::pow(horizontalData[0].x - horizontalData[2].x, 2) +
std::pow(horizontalData[0].y - horizontalData[2].y, 2) + std::pow(horizontalData[0].z -
horizontalData[2].z, 2));
if (A <= 0 || B <= 0)
{
return -1;
}
return B / A;
}
public:
explicit operator bool()
{
if (((bool)frontalData[0] || (bool)horizontalData[0]) && is_created)
{
return true;
}
return false;
}
_3D_Shape(const Point3D& Fbegin, const Point3D& Fmid, const Point3D& Fend,
const Point3D& Hbegin, const Point3D& Hmid, const Point3D& Hend) :
frontalData{ Fbegin,Fmid,Fend }, horizontalData{ Hbegin,Hmid,Hend },
is_created{ true } {}
_3D_Shape() : is_created{ true } {}
virtual double frontalProjectionPerimetr() = 0;
virtual double horizontalProjectionPerimetr() = 0;
bool get_stat() const
{
return is_created;
Арк.
КР.КІ-43.00.00.000 ПЗ 17
Змн. Арк. № докум. Підпис Дата
}
};
Цей клас є базовим класом в якому присутні два поля frontal та horizontal.
Ці поля це - кортежі які приймають по три точки які потрібні для того, щоб
вирахувати коефіцієнт відношення. Методи calculateFrontalCoef, calculateHori-
zontalCoef на основі точок які знаходяться в кортежах розраховують коефіцієнти.
FrontalData, horizontalData — чисто віртуальні методи. Ключове слово virtual
означає що про реалізацію даного методу буде відомо на етапі виконання, а не
компіляції як у випадках із звичайними методами. Модифікатор const означає що
цей метод буде доступним в константних об’єктах.
1. Захищені члени класу:
 frontalData[3] та horizontalData[3]: масиви точок типу Point3D, що
представляють координати трьох точок для фронтальної та горизонтальної
проекцій відповідно.
 is_created: логічна змінна, яка вказує, чи створено фігуру.
2. Методи обчислення коефіцієнта:
 calculateFrontalCoef(): обчислює коефіцієнт для фронтальної проекції на основі
відстаней між точками.
 calculateHorizontalCoef(): обчислює коефіцієнт для горизонтальної проекції.
3. Оператор приведення до типу bool:
 explicit operator bool(): перевіряє, чи існують фронтальні або горизонтальні
дані та чи створено фігуру.
4. Конструктори:
 Конструктор із параметрами приймає координати точок для фронтальної та
горизонтальної проекцій та ініціалізує відповідні члени.
 Конструктор за замовчуванням ініціалізує is_created значенням true.
5. Віртуальні методи:
 virtual double frontalProjectionPerimeter() = 0;: чисто віртуальний метод, який
вимагає від підкласів реалізації обчислення периметра фронтальної проекції.

Арк.
КР.КІ-43.00.00.000 ПЗ 18
Змн. Арк. № докум. Підпис Дата
 virtual double horizontalProjectionPerimeter() = 0;: чисто віртуальний метод для
обчислення периметра горизонтальної проекції.
6. Метод get_stat():
 bool get_stat() const: повертає значення is_created, що вказує на те, чи
створено фігуру.

3.3. Розробка похідних класів


Реалізація методів базового класу. Перше йде перевірка чи достатньо даних у
об’єкта для того, щоб знайти проекцію, якщо даних недостатньо, тоді в консоль
запишеться повідомлення Bad status і метод поверне std::nullopt, в іншому
випадку ми отримуємо коефіцієнт відношення. Потім почнеться розрахунок
периметра проекцій:
class _4_Prizma : public _3D_Shape
{
Point3D A, B, C, D, A1, B1, C1, D1;
public:
_4_Prizma(const Point3D& A, const Point3D& B, const Point3D& C, const
Point3D& D, const Point3D& A1, const Point3D& B1, const Point3D& C1, const
Point3D& D1,
const Point3D& Fbegin, const Point3D& Fmid, const Point3D& Fend, const
Point3D& Hbegin, const Point3D& Hmid, const Point3D& Hend) :
A{ A }, B{ B }, C{ C }, D{ D }, A1{ A1 }, B1{ B1 }, C1{ C1 }, D1{ D1 },
_3D_Shape{ Fbegin,Fmid ,Fend,Hbegin,Hmid ,Hend } {}
_4_Prizma() {}
double horizontalProjectionPerimetr() override {
double AB = sqrt(pow(B.x - A.x, 2) + pow(B.y - A.y, 2) + pow(B.z - A.z, 2));
if (AB > 0)
{
double horizontal_coef = calculateHorizontalCoef();
if (horizontal_coef > 0)
{
Арк.
КР.КІ-43.00.00.000 ПЗ 19
Змн. Арк. № докум. Підпис Дата
return AB * 4 * horizontal_coef * horizontal_coef;
}
}
return -1;
}
double frontalProjectionPerimetr() override {
double AB = sqrt(pow(B.x - A.x, 2) + pow(B.y - A.y, 2) + pow(B.z - A.z, 2));
double AA1 = sqrt(pow(A1.x - A.x, 2) + pow(A1.y - A.y, 2) + pow(A1.z - A.z,
2));
double BB1 = sqrt(pow(B1.x - B.x, 2) + pow(B1.y - B.y, 2) + pow(B1.z - B.z,
2));
double A1B1 = sqrt(pow(B1.x - A1.x, 2) + pow(B1.y - A1.y, 2) + pow(B1.z -
A1.z, 2));
if (AB > 0 && AA1 > 0 && BB1 > 0 && A1B1 > 0)
{
double front_coef = calculateFrontalCoef();
if (front_coef > 0)
{
return (AB + AA1 + BB1 + A1B1) * front_coef * front_coef;
}
}
return -1;
}
friend ifstream& operator >> (ifstream& in, _4_Prizma& data) {
string tmp;
while (in >> tmp)
{
if (tmp == "Prizma:")
{
in >> data.A;
in >> data.B;
Арк.
КР.КІ-43.00.00.000 ПЗ 20
Змн. Арк. № докум. Підпис Дата
in >> data.C;
in >> data.D;
in >> data.A1;
in >> data.B1;
in >> data.C1;
in >> data.D1;
for (size_t i = 0; i < 3; i++)
{
in >> data.frontalData[i];
}
for (size_t i = 0; i < 3; i++)
{
in >> data.horizontalData[i];
}
return in;
}
}
cout << "Bad file's data " << endl;
return in;
}
};
Цей код визначає клас _4_Prizma, який є підкласом класу _3D_Shape та
представляє прямокутну призму в тривимірному просторі. Деякі ключові
елементи цього класу:
1. Члени класу:
 A, B, C, D, A1, B1, C1, D1: об'єкти типу Point3D, що представляють
координати вісімох вершин прямокутної призми.
2. Конструктори:

Арк.
КР.КІ-43.00.00.000 ПЗ 21
Змн. Арк. № докум. Підпис Дата
 Конструктор із параметрами приймає координати вершин призми та
викликає конструктор базового класу _3D_Shape, передаючи йому координати
для фронтальної та горизонтальної проекцій.
 Конструктор за замовчуванням ініціалізує об'єкт призми, не передаючи
конкретних координат.
3. Віртуальні методи:
 double horizontalProjectionPerimeter() override: перевизначає віртуальний
метод базового класу для обчислення периметра горизонтальної проекції
призми.
 double frontalProjectionPerimeter() override: перевизначає віртуальний метод
базового класу для обчислення периметра фронтальної проекції призми.
4. Оператор введення з файлу (operator >>):
 friend ifstream& operator >> (ifstream& in, _4_Prizma& data): перевизначає
френд-функціональний оператор для зчитування об'єкта класу з файлу. Очікує
введення визначеної маркерною стрічкою ("Prizma:") та зчитує координати
вершин призми та проекцій з файлу.
Загально, _4_Prizma є класом, який розширює функціональність базового
класу _3D_Shape для обробки конкретного типу 3D-фігури - прямокутної
призми.

3.4. Демонстрація роботи програми


Результат роботи програми продемонстровано на рис. 3.1.

Рисунок 3.1 - Результат роботи програми у консолі

Якщо ввести не коректні дані, відбувається наступне рис. 3.2.

Арк.
КР.КІ-43.00.00.000 ПЗ 22
Змн. Арк. № докум. Підпис Дата
Рисунок 3.2 - Результат роботи програми, якщо ввести не коректні дані

Усі результати, які записуються в консолі, записуються і в файл, який був


відкритий або створений рис. 3.3.

Рисунок 3.3 - Вигляд запису в файл

Назвою вихідного файлу з результатом виконанням програми завжди буде


‘result.txt’ незалежно від назви вхідного файлу. Вихідний файл завжди буде
створюватись у репозиторії програми.

3.5. Розробка Unit-тестів


Модульне тестування— це метод тестування програмного забезпечення,
який полягає в окремому тестуванні кожного модуля коду програми. Модулем
називають найменшу частину програми, яка може бути протестованою. У
процедурному програмуванні модулем вважають окрему функцію або
процедуру. В об'єктно-орієнтованому програмуванні — метод.

TEST_METHOD(TestConstructorParameters)
{
Point3D point{ 1,1,1 };
Assert::IsTrue((bool)ball, L"Constructor with parameters error");
Assert::IsTrue((bool)tetrahedron, L"Constructor with parameters error");
Assert::IsTrue((bool)prizma, L"Constructor with parameters error");
Assert::IsTrue((bool)point, L"Constructor with parameters error");

Арк.
КР.КІ-43.00.00.000 ПЗ 23
Змн. Арк. № докум. Підпис Дата
Даний тест перевіряє коректність ініціалізації та можливість перетворення
до типу bool для об'єктів, створених з параметрами конструктора.

3.6. Результат виконання Unit-тестів


Результат виконання Unit-тестів наведений на рисунку 3.4.

Рисунок 3.4 - Результат виконання Unit-тестів


Приклад негативного виконання модульних тестів.

Рисунок 3.5 - Приклад неправильного виконання Unit-тестів

У програмі розроблено класи, у кожному з яких є свої методи та


конструктори. Розглянемо тестування конструктора за замовчуванням,
створюється тимчасовий об’єкт кожного з класів і перевіряється його status, по
замовчуванню він має бути хибним якщо це так тоді все працює коректно. Також
перевіряється конструктор по замовчуванню в структурі Point. В даному тесті
порівнюється чи об’єкт з конструктором по замовчуванням буде еквівалентним з
об’єктом який ініціалізовує свої поля нулями.

Арк.
КР.КІ-43.00.00.000 ПЗ 24
Змн. Арк. № докум. Підпис Дата
ВИСНОВКИ

В ході виконання курсової робити, створена програма з інтерфейсом


зчитування наборів даних для розрахунку периметру
фронтальної/горизонтальної проекції тетраедра, 4-ної призми, кулі. Було
розроблено алгоритми роботи з текстовими даними та розглянуті типи даних для
тексту та рядків. Описані алгоритми обчислення, побудовано Use-Case діаграму,
а також створена діаграма класів, що відображає ієрархію класів. Наступним
етапом реалізовано код програми, демонстрація якого включала тести, які були
успішно пройдені. Усі вище наведені етапи були описані в трьох розділах.
У першому розділі зосереджено на понятті периметру центральної та
горизонтальної проекцій, а також фігур, з якими ми працювали. Основний
акцент робиться на визначенні периметру центральних та горизонтальних
проекцій фігур. Крім того, у цьому розділі розглянуто структуру файлу.
У другому розділі я розглянула побудову UML-діаграм, зокрема блок-схем,
діаграм класів та претендентів, та розробила їх. Цей розділ дозволяє зрозуміти
структуру програми та взаємодію її компонентів.
У третьому розділі надано опис реалізації коду програми, яка виконує
обчислення відношення площі до площі центральної проекції фігури. Тут
представлені деталі програмного коду, що реалізує обчислення. Також було
розглянуто розробку Unit-тестів для програми. Цей етап дозволяє перевірити
правильність функціонування програми та виявити можливі помилки.
Під час виконання цієї роботи я вивчила багато чого нового, та закріпила
знання на практиці. Я впевнена, що знання, здобуті під час курсової роботи
пригодяться мені в майбутніх проектах.

Арк.
КР.КІ-43.00.00.000 ПЗ 25
Змн. Арк. № докум. Підпис Дата
СПИСОК ВИКОРИСТАНОЇ ЛІТЕРАТУРИ

1. Учасники проектів Вікімедіа. Матриця (математика) – Вікіпедія. Вікіпедія.


URL: https://uk.wikipedia.org/wiki/Матриця_(математика) (дата звернення:
18.09.2023).
2. Швачич Г. Г., Пасинков В. М., Павленко Г. А. Побудова блок-схем : навч.
посіб. Дніпропетровськ : Редакц.-вид. від. НМетАУ, 2004. 24 с.
3. Герасимів Т. Г. Лабораторний Практикум з дисципліни Об'єкто Орієнтоване
Програмування / ред. С. І. Мельничук. Івано-Франківськ : ІФНТУНГ, 2021. 79 с.
4. Lippman S. B. C++ Primer. 2nd ed. Reading, Mass : Addison-Wesley, 1991. 614 p.
5. Josuttis N. M., Josuttis N. Object oriented programming in C++. Wiley, 2002.
600 с.
6. Юніт тести: процес написання та інструменти для запуску. FoxmindEd. URL:
https://foxminded.ua/yunit-testy/ (дата звернення: 08.12.2023)

Арк.
КР.КІ-43.00.00.000 ПЗ 26
Змн. Арк. № докум. Підпис Дата
ДОДАТКИ
Додаток А
Файл Kursova.cpp
#include <iostream>
#include <fstream>
#include <cmath>
#include <vector>
using namespace std;
struct Point3D {
double x, y, z;
friend ifstream& operator >> (ifstream& in, Point3D& data) {
in >> data.x;
in >> data.y;
in >> data.z;
return in;
}
explicit operator bool()
{
if (x || y || z)
{
return true;
}
return false;
}
};
class _3D_Shape {
protected:
Point3D frontalData[3], horizontalData[3];
bool is_created;
double calculateFrontalCoef() const
{
double A = std::sqrt(std::pow(frontalData[0].x - frontalData[1].x, 2) + std::pow(frontalData[0].y - frontalData[1].y, 2) +
std::pow(frontalData[0].z - frontalData[1].z, 2));
double B = std::sqrt(std::pow(frontalData[0].x - frontalData[2].x, 2) + std::pow(frontalData[0].y - frontalData[2].y, 2) +
std::pow(frontalData[0].z - frontalData[2].z, 2));
if (A <= 0 || B <= 0)
{
return -1;
}
return B / A;
}

double calculateHorizontalCoef() const


{
double A = std::sqrt(std::pow(horizontalData[0].x - horizontalData[1].x, 2) + std::pow(horizontalData[0].y -
horizontalData[1].y, 2) + std::pow(horizontalData[0].z - horizontalData[1].z, 2));
double B = std::sqrt(std::pow(horizontalData[0].x - horizontalData[2].x, 2) + std::pow(horizontalData[0].y -
horizontalData[2].y, 2) + std::pow(horizontalData[0].z - horizontalData[2].z, 2));
if (A <= 0 || B <= 0)
{
return -1;
}
return B / A;
}
public:
explicit operator bool()
{
if (((bool)frontalData[0] || (bool)horizontalData[0]) && is_created)
{
return true;
}
return false
Продовження додатку А
}
_3D_Shape(const Point3D& Fbegin, const Point3D& Fmid, const Point3D& Fend, const Point3D& Hbegin, const
Point3D& Hmid, const Point3D& Hend) :
frontalData{ Fbegin,Fmid,Fend }, horizontalData{ Hbegin,Hmid,Hend }, is_created{ true } {}
_3D_Shape() : is_created{ true } {}
virtual double frontalProjectionPerimetr() = 0;
virtual double horizontalProjectionPerimetr() = 0;
bool get_stat() const
{
return is_created;
}
};
class _4_Prizma : public _3D_Shape
{
Point3D A, B, C, D, A1, B1, C1, D1;
public:
_4_Prizma(const Point3D& A, const Point3D& B, const Point3D& C, const Point3D& D, const Point3D& A1, const
Point3D& B1, const Point3D& C1, const Point3D& D1,
const Point3D& Fbegin, const Point3D& Fmid, const Point3D& Fend, const Point3D& Hbegin, const Point3D& Hmid,
const Point3D& Hend) :
A{ A }, B{ B }, C{ C }, D{ D }, A1{ A1 }, B1{ B1 }, C1{ C1 }, D1{ D1 },
_3D_Shape{ Fbegin,Fmid ,Fend,Hbegin,Hmid ,Hend } {} // Конструктор ініціалізації
_4_Prizma() {}
double horizontalProjectionPerimetr() override {
double AB = sqrt(pow(B.x - A.x, 2) + pow(B.y - A.y, 2) + pow(B.z - A.z, 2));
if (AB > 0)
{
double horizontal_coef = calculateHorizontalCoef();
if (horizontal_coef > 0)
{
return AB * 4 * horizontal_coef * horizontal_coef;
}
}
return -1;
}
double frontalProjectionPerimetr() override {
double AB = sqrt(pow(B.x - A.x, 2) + pow(B.y - A.y, 2) + pow(B.z - A.z, 2));
double AA1 = sqrt(pow(A1.x - A.x, 2) + pow(A1.y - A.y, 2) + pow(A1.z - A.z, 2));
double BB1 = sqrt(pow(B1.x - B.x, 2) + pow(B1.y - B.y, 2) + pow(B1.z - B.z, 2));
double A1B1 = sqrt(pow(B1.x - A1.x, 2) + pow(B1.y - A1.y, 2) + pow(B1.z - A1.z, 2));
if (AB > 0 && AA1 > 0 && BB1 > 0 && A1B1 > 0)
{
double front_coef = calculateFrontalCoef();
if (front_coef > 0)
{
return (AB + AA1 + BB1 + A1B1) * front_coef * front_coef;
}
}
return -1;
}
friend ifstream& operator >> (ifstream& in, _4_Prizma& data) {
string tmp;
while (in >> tmp)
{
if (tmp == "Prizma:")
{
in >> data.A;
in >> data.B;
in >> data.C;
in >> data.D;
in >> data.A1;
in >> data.B1;
in >> data.C1;
Продовження додатку А
in >> data.D1;
for (size_t i = 0; i < 3; i++)
{
in >> data.frontalData[i];
}
for (size_t i = 0; i < 3; i++)
{
in >> data.horizontalData[i];
}
return in;
}
}
cout << "Bad file's data " << endl;
return in;
}
};
class Tetrahedron : public _3D_Shape {
Point3D A, B, C, D;
public:
Tetrahedron(const Point3D& A, const Point3D& B, const Point3D& C, const Point3D& D, const Point3D& Fbegin, const
Point3D& Fmid, const Point3D& Fend,
const Point3D& Hbegin, const Point3D& Hmid, const Point3D& Hend) : A{ A }, B{ B }, C{ C }, D{ D },
_3D_Shape{ Fbegin,Fmid ,Fend,Hbegin,Hmid ,Hend } {}
Tetrahedron() {}
double horizontalProjectionPerimetr() override {
double AB = sqrt(pow(B.x - A.x, 2) + pow(B.y - A.y, 2) + pow(B.z - A.z, 2));
double AC = sqrt(pow(C.x - A.x, 2) + pow(C.y - A.y, 2) + pow(C.z - A.z, 2));
double BC = sqrt(pow(C.x - B.x, 2) + pow(C.y - B.y, 2) + pow(C.z - B.z, 2));
if (AB > 0 && AC > 0 && BC > 0)
{
double horizontal_coef = calculateHorizontalCoef();
if (horizontal_coef > 0)
{
return (AB + BC + AC) * horizontal_coef * horizontal_coef;
}
}
return -1;
}
double frontalProjectionPerimetr() override {
double AC = sqrt(pow(C.x - A.x, 2) + pow(C.y - A.y, 2) + pow(C.z - A.z, 2));
double AD = sqrt(pow(D.x - A.x, 2) + pow(D.y - A.y, 2) + pow(D.z - A.z, 2));
double CD = sqrt(pow(D.x - C.x, 2) + pow(D.y - C.y, 2) + pow(D.z - C.z, 2));
if (AC > 0 && AD > 0 && CD > 0)
{
double front_coef = calculateFrontalCoef();
if (front_coef > 0)
{
return (AC + AD + CD) * front_coef * front_coef;
}
}
return -1;
}
friend ifstream& operator>> (ifstream& in, Tetrahedron& data) {
string tmp;
while (in >> tmp)
{
if (tmp == "Tetrahedron:")
{
in >> data.A;
in >> data.B;
in >> data.C;
in >> data.D;
for (size_t i = 0; i < 3; i++)
{
in >> data.frontalData[i];
Продовження додатку А
}
for (size_t i = 0; i < 3; i++)
{
in >> data.horizontalData[i];
}
return in;
}
}
cout << "Bad file's data " << endl;
return in;
}
};
class Ball : public _3D_Shape {
Point3D O;
double R;
public:
Ball(const Point3D& O, const double& R, const Point3D& Fbegin, const Point3D& Fmid, const Point3D& Fend,
const Point3D& Hbegin, const Point3D& Hmid, const Point3D& Hend) : O{ O }, R{ R },
_3D_Shape{ Fbegin,Fmid ,Fend,Hbegin,Hmid ,Hend } {}
Ball() {}
double horizontalProjectionPerimetr() override {
if (R > 0)
{
double horizontal_coef = calculateHorizontalCoef();
if (horizontal_coef > 0)
{
return 2 * 3.14 * R * horizontal_coef * horizontal_coef;
}
}
return -1;
}
double frontalProjectionPerimetr() override {
if (R > 0)
{
double front_coef = calculateFrontalCoef();
if (front_coef > 0)
{
return 2 * 3.14 * R * front_coef * front_coef;
}
}
return -1;
}
friend ifstream& operator >> (ifstream& in, Ball& data) {
string tmp;
while (in >> tmp)
{
if (tmp == "Ball:")
{
in >> data.O;
in >> data.R;
for (size_t i = 0; i < 3; i++)
{
in >> data.frontalData[i];
}
for (size_t i = 0; i < 3; i++)
{
in >> data.horizontalData[i];
}
return in;
}
}
cout << "Bad file's data " << endl;
return in;
}
};
int main() {

Ball ball{};

_4_Prizma _4_prizma{};

Tetrahedron tetrahedron{};

ofstream write{ "result.txt" };

ifstream stream;

string path_name;

while (true)

cout << "Enter file name or [s] to stop ";

cin >> path_name;

stream.open(path_name);

if (stream.is_open())

stream >> ball;

stream >> _4_prizma;

stream >> tetrahedron;

cout << "Ball: " << ball.frontalProjectionPerimetr() << ' ' << ball.horizontalProjectionPerimetr() << endl;

cout << "4Prizma: " << _4_prizma.frontalProjectionPerimetr() << ' ' << _4_prizma.horizontalProjectionPerimetr() <<
endl;

cout << "Tetrahedron: " << tetrahedron.frontalProjectionPerimetr() << ' ' <<
tetrahedron.horizontalProjectionPerimetr() << endl;

write << "Ball: " << ball.frontalProjectionPerimetr() << ' ' << ball.horizontalProjectionPerimetr() << endl;

write << "4Prizma: " << _4_prizma.frontalProjectionPerimetr() << ' ' << _4_prizma.horizontalProjectionPerimetr() <<
endl;

write << "Tetrahedron: " << tetrahedron.frontalProjectionPerimetr() << ' ' <<
tetrahedron.horizontalProjectionPerimetr() << endl;

return 0

else if (path_name == "s")

{
return 1;
}
else
{
cout << "Bad path name " << endl;
}

Кінець додатку А
Додаток Б
Файл KursovaUnitTest.cpp
#include "pch.h"
#include "CppUnitTest.h"
#include "../kursova/kursova.cpp"
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
namespace KursovaUnitTest
{
TEST_CLASS(KursovaUnitTest)
{
Ball ball{ {3.1, 2.5, 0.5 },5.0, {4.0, 3.0, 2.5 }, {3.0, 5.0, 5.0 }, {0.5, 4.0, 3.0 }, {2.5, 3.0, 5 }, {5.0, 5.2,
4.3 }, {3.1, 2.5} };
Tetrahedron tetrahedron{ {0, 0, 0,},{ 1, 0, 0}, {0, 1, 0}, {0 ,0, 1},{0.5, 0.5, 2}, {0.5, 0.5, 1},{ 0.5, 0.5, 0},
{ 0, 1, 1}, {0, 1, 0}, {0, 0, 1} };
_4_Prizma prizma{ {2.5, 3.0, 5.0 }, {0.5, 4.0 ,3.0}, { 3.0, 2.5 ,4.0} ,{0.0 ,0.0, 2.5 }, {3.0, 5.0 ,0.5 }, {4.0,
3.0 ,2.5 }, {3.0, 0.5, 4.0 }, {5.0, 3.5, 0.0 }, {1.5, 3.0 ,4.0 } ,{0.5, 4.0 ,3.0 }, {2.5 ,3.0 ,5.0 }, {0.0, 0.0 ,2.5}, { 3.0, 5.0, 0.5 },
{4.0, 3.0 ,2.5} };
public:
TEST_METHOD(TestConstructorParameters)
{
Point3D point{ 1,1,1 };
Assert::IsTrue((bool)ball, L"Constructor with parameters error");
Assert::IsTrue((bool)tetrahedron, L"Constructor with parameters error");
Assert::IsTrue((bool)prizma, L"Constructor with parameters error");
Assert::IsTrue((bool)point, L"Constructor with parameters error");
}
TEST_METHOD(TestDefault)
{
Ball ball;
Tetrahedron tetrahedron;
_4_Prizma prizma;
Point3D point{};
Assert::IsTrue(ball.get_stat(), L"Constructor default error");
Assert::IsTrue(tetrahedron.get_stat(), L"Constructor default error");
Assert::IsTrue(prizma.get_stat(), L"Constructor default error");
Assert::IsTrue(point.x == 0 && point.y == 0 && point.z == 0, L"Constructor default error");
}
TEST_METHOD(TestHorizontalProjectionPerimetr)
{
Assert::IsTrue(ball.horizontalProjectionPerimetr() != -1, L"Ball horizontal projection perimetr er-
ror");
Assert::IsTrue(prizma.horizontalProjectionPerimetr() != -1, L"Prizma horizontal projection
perimetr error");
Assert::IsTrue(tetrahedron.horizontalProjectionPerimetr() != -1, L"Tetrahedron horizontal projec-
tion perimetr error");
}
TEST_METHOD(TestFrontalProjectionPerimetr)
{
Assert::IsTrue(ball.frontalProjectionPerimetr() != -1, L"Ball frontal projection perimetr error");
Assert::IsTrue(prizma.frontalProjectionPerimetr() != -1, L"Prizma frontal projection perimetr er-
ror");
Assert::IsTrue(tetrahedron.frontalProjectionPerimetr() != -1, L"Tetrahedron frontal projection
perimetr error");
}
};
}

You might also like