4.3. Клас чотирикутника

Цей клас зберігає та обробляє дані чотирикутника.


#pragma once

#include "IDrawable.h"

#include "GLPoint.h"

#include "GLSegment.h"

#include "Exceptions.h"

ref class GLRectangle : IDrawable

{

public:

GLRectangle();

~GLRectangle() {};

//створення нового чотирикутника

void Set(GLPoint^ pt1, GLPoint^ pt2, GLPoint^ pt3, GLPoint^ pt4);

void Set(array<GLPoint^>^ pts);

//функція малювання

virtual void Draw() override;

double Square();

double Perimeter();

bool IsOnPlane();

private:

//чи розташовані всі вершини у одній площині

bool _isOnPlane;

double _square;

double _perimeter;

void countIsONPlane();

void countSquare();

void countPerimeter();

static double countPolygonSquare(GLPoint^ p1, GLPoint^p2, GLPoint^ p3);

array<GLPoint^>^ _points;

array<GLSegment^>^ _sides;

};

#include "GLRectangle.h"

GLRectangle::GLRectangle() {}

void GLRectangle::Set(GLPoint^ pt1, GLPoint^ pt2, GLPoint^ pt3, GLPoint^ pt4)

{

array<GLPoint^>^ points = gcnew array<GLPoint^>(4);

points[0] = pt1;

points[1] = pt2;

points[2] = pt3;

points[3] = pt4;

this->Set(points);

}

void GLRectangle::Set(array<GLPoint^>^ pts)

{

if (pts->Length != 4)

return;

this->_square = 0;

this->_points = pts;

for (int i = 3; i > 0; i--)

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

if (_points[i]->Equal(_points[j]))

throw gcnew MyException::InvalidRectangleException(this);

this->Flat = _points[0]->Flat;

this->_sides = gcnew array<GLSegment^>(4);

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

{

_sides[i] = gcnew GLSegment(_points[i % 4], _points[(i + 1) % 4]);

_sides[i]->Flat = _points[0]->Flat;

//перевіряємо, що фігура має 4 кути

GLSegment^ checkerNear = gcnew GLSegment(_points[i % 4], _points[(i + 1) % 4]);

GLSegment^ checkerFar = gcnew GLSegment(_points[i % 4], _points[(i + 2) % 4]);

if (checkerFar->Contains(_points[(i + 1) % 4]) || checkerNear->Contains(_points[(i + 2) % 4]) || checkerNear->Contains(_points[(i + 3) % 4]))

{

this->_isOnPlane = true;

this->_square = -1;

}

}

countPerimeter();

if (_square == 0)

{

countIsONPlane();

if (this->_isOnPlane)

countSquare();

else

this->_square = -1;

}

}

void GLRectangle::Draw()

{

glBegin(GL_LINE_LOOP);

glColor3f(_r, _g, _b);

if (Flat)

{

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

glVertex2f(_points[i]->X, _points[i]->Y);

}

else

{

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

glVertex3f(_points[i]->X, _points[i]->Y, _points[i]->Z);

}

glEnd();

}

double GLRectangle::Square()

{

return this->_square;

}

double GLRectangle::Perimeter()

{

return this->_perimeter;

}

bool GLRectangle::IsOnPlane()

{

return this->_isOnPlane;

}

void GLRectangle::countIsONPlane()

{

//визначник матриці площини чотирикутника

double surfaceDet =

_points[0]->X * (_points[3]->Z * (_points[1]->Y - _points[2]->Y)

- _points[1]->Y * _points[2]->Z + _points[1]->Z * (_points[2]->Y - _points[3]->Y)

+ _points[3]->Y * _points[2]->Z) +

_points[1]->X * (_points[3]->Z * (_points[2]->Y - _points[0]->Y)

+ _points[0]->Y * _points[2]->Z - _points[2]->Y * _points[0]->Z + _points[3]->Y

* (_points[0]->Z - _points[2]->Z)) +

_points[2]->X * (_points[3]->Z * (_points[0]->Y - _points[1]->Y) - _points[0]->Y

* _points[1]->Z + _points[1]->Y * _points[0]->Z - _points[3]->Y * _points[0]->Z

+ _points[3]->Y * _points[1]->Z) +

_points[3]->X * _points[0]->Y * (_points[1]->Z - _points[2]->Z) + _points[3]->X

* (_points[1]->Y * (_points[2]->Z - _points[0]->Z) + _points[2]->Y * _points[0]->Z

- _points[2]->Y * _points[1]->Z);

//якщо визначник нуль, то всі чотири точки у одній площині

if (Math::Abs(surfaceDet) < Constants::DELTA)

this->_isOnPlane = true;

else

this->_isOnPlane = false;

}

void GLRectangle::countSquare()

{

//якщо чотирикутник самоперетинаючий

GLSegment::CrossAnswer^ cross1 = _sides[0]->Cross(_sides[2]);

GLSegment::CrossAnswer^ cross2 = _sides[1]->Cross(_sides[3]);

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

{

double p1 = countPolygonSquare(_points[0], cross1->Point1, _points[3]);

double p2 = countPolygonSquare(_points[1], cross1->Point1, _points[2]);

if (Math::Abs(p1) < Constants::DELTA || Math::Abs(p2) < Constants::DELTA)

{

this->_square = 0.;

return;

}

this->_square = p1 + p2;

return;

}

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

{

double p1 = countPolygonSquare(_points[0], cross2->Point1, _points[1]);

double p2 = countPolygonSquare(_points[2], cross2->Point1, _points[3]);

if (Math::Abs(p1) < Constants::DELTA || Math::Abs(p2) < Constants::DELTA)

{

this->_square = 0.;

return;

}

this->_square = p1 + p2;

return;

}

else

{

this->_square =

countPolygonSquare(_points[0], _points[1], _points[2]) +

countPolygonSquare(_points[0], _points[3], _points[2]);

return;

}

}

void GLRectangle::countPerimeter()

{

double perim = 0;

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

perim += _sides[i]->Magnitude();

this->_perimeter = perim;

}

double GLRectangle::countPolygonSquare(GLPoint^ p1, GLPoint^p2, GLPoint^ p3)

{

//сторони

double a = GLSegment::Magnitude(p1, p2);

double b = GLSegment::Magnitude(p2, p3);

double c = GLSegment::Magnitude(p3, p1);

//півпериметр

double p = (a + b + c) / 2;

return Math::Sqrt(p * (p - a) * (p - b) * (p - c));

}



Информация о работе «Програма пошуку перетину відрізків та побудови чотирикутників»
Раздел: Информатика, программирование
Количество знаков с пробелами: 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 комментариев


Наверх