4.4. Клас обробника відрізків

Клас надає засоби інкапсуляції відрізків та високорівневої роботи з ними.


#pragma once

#include "GLSegment.h"

#include "Exceptions.h"

ref class SegmentProcessor

{

public:

SegmentProcessor();

~SegmentProcessor() {};

//робота зі списком відрізків

void AddSegment(GLSegment^ obj);

void RemoveSegment(GLSegment^ obj);

void RemoveSegmentAt(int idx);

//затирає всі дані, не знищуючи об'єкт

void Clear();

//знайти точку перетину між усіма відрізками

GLSegment::CrossAnswer^ CrossAll();

GLSegment^ GetSegment(int idx);

//друкує список відрізків у таблицю

void PrintSegments(System::Windows::Forms::DataGridView^ table);

//друкує список точок у таблицю

void PrintPoints(System::Windows::Forms::DataGridView^ table);

private:

System::Collections::Generic::List<GLSegment^>^ _segment;

};

SegmentProcessor::SegmentProcessor()

{

_segment = gcnew System::Collections::Generic::List<GLSegment^>();

}

void SegmentProcessor::AddSegment(GLSegment^ obj)

{

_segment->Add(obj);

Constants::SEGMENT_COUNT++;

}

void SegmentProcessor::RemoveSegment(GLSegment^ obj)

{

if (_segment->Remove(obj))

Constants::SEGMENT_COUNT--;

}

void SegmentProcessor::RemoveSegmentAt(int idx)

{

if (idx < 0 || idx >= _segment->Count)

return;

_segment->RemoveAt(idx);

Constants::SEGMENT_COUNT--;

}

void SegmentProcessor::Clear()

{

_segment->Clear();

Constants::SEGMENT_COUNT = 0;

}

GLSegment::CrossAnswer^ SegmentProcessor::CrossAll()

{

if (_segment->Count < 2)

throw gcnew MyException::NotEnoughObjectsException(this);

//послідовно шукаємо перетин між кожним відрізком та результатом попереднього перетину

GLSegment::CrossAnswer^ answer = _segment[0]->Cross(_segment[1]);

for(int i = 1; i < _segment->Count; i++)

{

if (answer->Type == GLSegment::CrossAnswer::CrossType::NONE)

return answer;

else if (answer->Type == GLSegment::CrossAnswer::CrossType::POINT)

{

if (!_segment[i]->Contains(answer->Point1))

{

answer->Type = GLSegment::CrossAnswer::CrossType::NONE;

return answer;

}

}

else if (answer->Type == GLSegment::CrossAnswer::CrossType::SEGMENT)

answer = _segment[i]->Cross(gcnew GLSegment(answer->Point1, answer->Point2));

}

return answer;

}

GLSegment^ SegmentProcessor::GetSegment(int idx)

{

if (idx < 0 || idx >= _segment->Count)

throw gcnew System::IndexOutOfRangeException();

return _segment[idx];

}

void SegmentProcessor::PrintSegments(System::Windows::Forms::DataGridView^ table)

{

table->RowCount = _segment->Count;

if (_segment->Count == 0)

return;

for (int i = 0; i < _segment->Count; i++)

table->Rows[i]->Cells[0]->Value = _segment[i]->ToString();

}

void SegmentProcessor::PrintPoints(System::Windows::Forms::DataGridView^ table)

{

table->RowCount = 0;

if (_segment->Count == 0)

return;

bool stopAdding;

for (int i = 0, idx = 0; i < _segment->Count * 2; i++)

{

stopAdding = false;

GLPoint^ pt = _segment[i/2]->Point[i % 2];

for (int j = 0; j < i; j++)

if (pt->Equal(_segment[j / 2]->Point[j % 2]))

{

stopAdding = true;

break;

}

if (stopAdding)

continue;

table->Rows->Add();

table->Rows[table->RowCount - 1]->Cells[0]->Value = Constants::GetLetterIdx(idx++) + pt->ToString();

}

}


4.5. Класи винятків

Забезпечують виявлення не стандартних виняткових ситуацій.


#pragma once

namespace MyException

{

ref class BaseException abstract

{

public:

BaseException(Object^ sender)

{

this->Sender = sender;

}

property System::String^ Message

{

virtual System::String^ get() = 0;

}

Object^ Sender;

};

ref class GLInitException : public BaseException

{

public:

GLInitException(Object^ sender) : BaseException(sender) {};

property System::String^ Message

{

virtual System::String^ get() override

{

return gcnew System::String("Не вдалося отримати обробник компонента!");

}

}

};

ref class BusyObjectException : public BaseException

{

public:

BusyObjectException(Object^ sender) : BaseException(sender){};

property System::String^ Message

{

virtual System::String^ get() override

{

return gcnew System::String("Об'єкт не може виконати цю операцію зараз!");

}

}

};

ref class EmptyStreamException : public BaseException

{

public:

EmptyStreamException(Object^ sender) : BaseException(sender) {};

property System::String^ Message

{

virtual System::String^ get() override

{

return gcnew System::String("Потік досяг кінця файла!");

}

}

};

ref class CoruptedLineException : public BaseException

{

public:

CoruptedLineException(Object^ sender) : BaseException(sender) {};

property System::String^ Message

{

virtual System::String^ get() override

{

return gcnew System::String("Рядок пошкоджено!");

}

}

};

ref class ValueOverflowException : public BaseException

{

public:

ValueOverflowException(Object^ sender) : BaseException(sender) { Value = 0; };

ValueOverflowException(Object^ sender, double value) : BaseException(sender) { Value = value; };

property System::String^ Message

{

virtual System::String^ get() override

{

return gcnew System::String("Значення виходить за межі типу!");

}

}

double Value;

};

ref class NotEnoughObjectsException : public BaseException

{

public:

NotEnoughObjectsException(Object^ sender) : BaseException(sender) {};

property System::String^ Message

{

virtual System::String^ get() override

{

return gcnew System::String("У контейнері недостаньо змінних для проведення операції!");

}

}

};

ref class InvalidRectangleException : public BaseException

{

public:

InvalidRectangleException(Object^ sender) : BaseException(sender) {};

property System::String^ Message

{

virtual System::String^ get() override

{

return gcnew System::String("Точки чотирикутника знаходяться на одній прямій!");

}

}

};




Информация о работе «Програма пошуку перетину відрізків та побудови чотирикутників»
Раздел: Информатика, программирование
Количество знаков с пробелами: 73364
Количество таблиц: 0
Количество изображений: 11

Похожие работы

Скачать
218746
21
0

... нтуватися на використання підручників [53; 54; 5]. У класах фізико-математичного спрямування доцільно орієнтуватись на використання підручників [53; 54; 5; 1].   РОЗДІЛ 2 ОСОБЛИВОСТІ ВИВЧЕННЯ МАТЕМАТИКИ У ПРОФІЛЬНИХ КЛАСАХ В СУЧАСНИХ УМОВАХ 2.1. ОСНОВНІ ПОЛОЖЕННЯ ПРОФІЛЬНОЇ ДИФЕРЕНЦІАЦІЇ НАВЧАННЯ МАТЕМАТИКИ Математика є універсальною мовою, яка широко застосовується в усіх ...

Скачать
70664
8
1

... здійснювати на ведучому навчальному матеріалі. 6.       Формування прийомів розумової діяльності вимагає врахування індивідуально-вікових особливостей учнів.   1.2 Формування уміння порівнювати в процесі навчання математики   Порівняння в навчанні – це розумова операція, за допомогою якої встановлюються риси подібності і відмінності між визначеними предметами і явищами. Пізнання будь-якого ...

Скачать
111254
0
31

... враховуючи їх невелику кількість у підручниках, посібниках та майже повну відсутність серед добірок завдань контролюючого характеру.   2.2 Загальні методичні рекомендації вивчення елементів стереометрії у курсі геометрії 9 класу   2.2.1 Формування уявлень і понять про стереометричні фігури та деякі їх властивості Формування понять – складний психологічний процес, який починається з утворення ...

Скачать
129908
0
0

... або світлішим за колір елементів узору. 2.3 Результати дослідницько-експериментальної роботи На підтвердження наведених теоретичних положень ми проводили дослідження особливостей формування відчуття кольору на уроках образотворчого мистецтва у початкових класах. Це дослідження мало практичний характер і проводилося у два етапи. На першому етапі (2006-2007 навч. рік) була визначена сфера і ...

0 комментариев


Наверх