C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Помогите с классом
Tassadar
Отправлено: 15.12.2006, 00:18


Ученик-кочегар

Группа: Участник
Сообщений: 1



Нужно написать класс определяющий возможно ли вписать в правильный выпуклый 4-х угольник окружность.Если заданы коорд. вершин. Если честно идей вообще нет, все это с перезагрузкой. Помогите плз если кто знает

заранее спасибо.
exp
Отправлено: 15.12.2006, 01:05


Мастер участка

Группа: Участник
Сообщений: 304



Правильный выпуклый четырёхугольник — это квадрат. Класс должен возвращать 1.

exp
Отправлено: 15.12.2006, 02:48


Мастер участка

Группа: Участник
Сообщений: 304



Что-то меня пробило на ночь глядя попрограммить wizard.gif ... бывает.. заняла меня задачка твоя smile.gif

вот исходник рабочего откомпилированного консольного проекта в BDS. нужные тебе файлы: uTMyPoint.cpp, uTMyPoint.h, uTMyRectangle.cpp, uTMyRectangle.h
Ковыряй.

Самораспакавывающийся zip-архив
Ага, фигвам, angry2.gif . нельзя ехе грузить.
Так что. открытым кодом прям тут обсуждать будем


uTMyPoint.h
Простой класс точки на плоскости. для облегчения своей участи
CODE

#ifndef uTMyPointH
#define uTMyPointH
#include <math.h>
//---------------------------------------------------------------------------
class TMyPoint
{
public:
double x;
double y;

TMyPoint()
{
y = x = 0.0;
}
TMyPoint(const TMyPoint &Point)
{
x = Point.x;
y = Point.y;
}
TMyPoint(double _x, double _y)
{
x = _x;
y = _y;
}
TMyPoint operator -(TMyPoint &P);
TMyPoint operator +(TMyPoint &P);
TMyPoint operator *(double C);
TMyPoint operator /(double C);
bool operator ==(TMyPoint &P);
bool operator !=(TMyPoint &P);
double abs();
double distance_to(TMyPoint &P);

TMyPoint friend bissect(TMyPoint O, TMyPoint P1, TMyPoint P2);
TMyPoint friend intersect(TMyPoint l1_p1, TMyPoint l1_p2,TMyPoint l2_p1, TMyPoint l2_p2);
};
#endif


uTMyPoint.cpp
Реализация методов класса
CODE

//---------------------------------------------------------------------------

#pragma hdrstop

#include "uTMyPoint.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
TMyPoint TMyPoint::operator -(TMyPoint &P)
{
return TMyPoint(x-P.x,y-P.y);
}

TMyPoint TMyPoint::operator +(TMyPoint &P)
{
return TMyPoint(x+P.x,y+P.y);
}

TMyPoint TMyPoint::operator *(double C)
{
return TMyPoint(C*x,C*y);
}

TMyPoint TMyPoint::operator /(double C)
{
return TMyPoint(x/C,y/C);
}

bool TMyPoint::operator ==(TMyPoint &P)
{
return (x==P.x)&&(y==P.y);
}

bool TMyPoint::operator !=(TMyPoint &P)
{
return (x!=P.x)||(y!=P.y);
}

double TMyPoint::abs()
{
return sqrt(x*x+y*y);
}

double TMyPoint::distance_to(TMyPoint &P)
{
return (P — *this).abs();
}

TMyPoint bissect(TMyPoint O, TMyPoint P1, TMyPoint P2)
{
TMyPoint Res;
Res.x = (P1.x+P2.x)/2.0;
if(P1!=P2 && P2!=O)
Res.y = (Res.x-O.x)*(O.distance_to(P1)*(P2.x-O.x)-O.distance_to(P2)*(P1.x-O.x))/(O.distance_to(P2)*(P1.y-O.y)-O.distance_to(P1)*(P2.y-O.y))+O.y;
else
{
if(P1 == P2) Res = P1;
else if(P1==O) Res = P2;
else Res = P1;
}
return Res;
}

TMyPoint intersect(TMyPoint l1_p1, TMyPoint l1_p2,TMyPoint l2_p1, TMyPoint l2_p2)
{
TMyPoint v1 = l1_p2-l1_p1;
TMyPoint v2 = l2_p2-l2_p1;
TMyPoint Res;
try{
if(((v1.y/v1.x)!=(v2.y/v2.x)))
{
TMyPoint temp = l1_p2+l2_p1-l2_p2-l1_p1;
if(temp.x!=0.0)
{
Res = (l1_p2-l1_p1)*(l2_p1.x-l1_p1.x)/temp.x+l1_p1;
}
else
{
Res = (l1_p2-l1_p1)*(l2_p1.y-l1_p1.y)/temp.y+l1_p1;
}
}
}
catch(...)
{
return Res;
}
return Res;

}


uTMyRectangle.h
А вот объявление класса нашего умного четырёхугольника. Слово Rectangle здесь, конечно, не подходит, ну да мне пофиг smile.gif
CODE

//---------------------------------------------------------------------------

#ifndef uTMyRectangleH
#define uTMyRectangleH
#include "uTMyPoint.h"
//---------------------------------------------------------------------------
class TMyRectangle
{
public:
TMyPoint c1;
TMyPoint c2;
TMyPoint c3;
TMyPoint c4;

bool IsItPossibleToEnterACircle(); //Перевод от www.translate.ru
};

#endif


uTMyRectangle.cpp
Реализация методов класса TMyRectangle
CODE

//---------------------------------------------------------------------------

#pragma hdrstop

#include "uTMyRectangle.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
bool TMyRectangle::IsItPossibleToEnterACircle()
{
TMyPoint b1 = bissect(c1,c2,c4);
TMyPoint b2 = bissect(c4,c1,c3);
TMyPoint o1 = intersect(c1,b1,c4,b2);

b1 = bissect(c2,c1,c3);
b2 = bissect(c3,c2,c4);
TMyPoint o2 = intersect(c2,b1,c3,b2);

return (o1==o2);
}


Будут вопросы — будут комменты.... А то у меня сейчас 3:00 ночи smile.gif

Отредактировано exp — 15.12.2006, 03:00

User Attached Image Скачать файл
SmartRect.zip


exp
Отправлено: 20.12.2006, 17:56


Мастер участка

Группа: Участник
Сообщений: 304



Блин... хоть бы кто спасибо сказал.
Doga
Отправлено: 20.12.2006, 18:31


Мастер участка

Группа: Участник
Сообщений: 575



QUOTE

Блин... хоть бы кто спасибо сказал.


Так этого, вроде как, никто и не обещал biggrin.gif

Разве не достаточно просто ощущения собственной кульности? smile.gif



P.S. Да и спасибо было сказано, правда, заранее... cool.gif

Отредактировано Doga — 20.12.2006, 18:33
exp
Отправлено: 23.12.2006, 10:33


Мастер участка

Группа: Участник
Сообщений: 304



Мдаааа, позор на мои седины smile.gif. Забыл школьный курс геометрии. sad.gif
Всё проще

uTMyRectangle.h
CODE

#ifndef uTMyRectangleH
#define uTMyRectangleH
#include "uTMyPoint.h"
//---------------------------------------------------------------------------
class TMyRectangle
{
public:
TMyPoint c1;
TMyPoint c2;
TMyPoint c3;
TMyPoint c4;

bool IsItPossibleToEnterACircle(); //Перевод от www.translate.ru
};

#endif


uTMyRectangle.cpp
CODE

//---------------------------------------------------------------------------

#pragma hdrstop

#include "uTMyRectangle.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
bool TMyRectangle::IsItPossibleToEnterACircle()
{
return ((c2-c1).abs()+(c4-c3).abs())==( (c3-c2).abs()+(c1-c4).abs());
}


В четырёхугольник можно вписать окружность, если суммы противоположных сторон равны.

Отредактировано exp — 23.12.2006, 10:33

Вернуться в Вопросы программирования в C++Builder