{
Pnt t; t.x = x - q.x; t.y = y - q.y; return t;
}
int operator<(Pnt p, Pnt q)
{
Pnt t; // сравнение углов радиус-векторов p и q
t.x = 0; t.y = 0; // коды четвертей вычисляются
// относительно (0,0)
if(t.code(p) < t.code(q)) return 1;
if(t.code(p) > t.code(q)) return 0;
return (p * q > 0); // вращение от p к q направлено
// против часовой стрелки
}
//--------------------------------------------------------------------------int intersect(Pnt p, Pnt p1, Pnt p2)
{
// тест на пересечение луча и отрезка
if(p1.y == p2.y) return 0;
if((p1.y < p2.y ? p2.y : p1.y) <= p.y) return 0;
if((p1.y < p2.y ? p1.y : p2.y) > p.y) return 0;
if(p2.y - p1.y > 0) return
((p.x - p1.x)*(p2.y - p1.y)-(p2.x - p1.x)*(p.y - p1.y) > 0);
else return
((p.x - p1.x)*(p2.y - p1.y)-(p2.x - p1.x)*(p.y - p1.y) < 0);
}
//--------------------------------------------------------------------------class SPolygon //класс звездчатого полигона
{
protected:
int color, n; //цвет и количество вершин полигона
Pnt *p, pC; //массив вершин полигона и точка центра
public:
SPolygon(TColor cl):color(cl){} // конструктор по умолчанию
SPolygon(double *x, double *y, int m, TColor cl); //конструктор
SPolygon(const SPolygon &ob); // конструктор копирования
int isin(Pnt t); //функция проверки принадлежности точки многоугольнику
friend void DrawPoly(TPoint* ps, unsigned cnt); //дружественная функция для
//вывода многоугольника
void show(double xmin, double ymin,
double xmax, double ymax);
};
//--------------------------------------------------------------------------// Конструктор копирования
SPolygon::SPolygon(const SPolygon &ob) // необходим для передачи объекта
{ // в качестве параметра
int i;
n = ob.n;
p = new Pnt[n]; // выделим память
for(i=0; i < ob.n; i++) p[i]=ob.p[i]; // производим копирование
}
//--------------------------------------------------------------------------SPolygon::SPolygon(double *x, double *y, int m, TColor cl):color(cl)
{
int i, j;
Pnt t;
p = new Pnt [m];
n = m;
pC.x = 0; pC.y = 0;
for(i = 0; i < m; i++)
{
pC.x += x[i]; pC.y += y[i];
}
pC.x = pC.x / m; pC.y = pC.y / m;
for(i = 0; i < m; i++)
{
p[i].x = x[i]; p[i].y = y[i];
}
// Сортируем точки по возрастанию угла вокруг центра
// тяжести методом вставок
for(i = 1; i < m; i++)
{
t = p[i];
for(j = i - 1; (j >= 0) && ((t - pC) < (p[j] - pC)); j--)
p[j + 1] = p[j];
p[j + 1] = t;
}
}
//--------------------------------------------------------------------------int SPolygon::isin(Pnt t) //проверка попадания точки (t.x,t.y) поверхности, ограниченной
//многоугольником
{
int i, parity = 0;
for(i = 0; i < n; i++)
if(intersect(t, p[i], p[(i + 1)%n]))
parity = 1 - parity;
return parity; //возвращает 1 в случае попадания точки, и 0 в противном случае
}
//--------------------------------------------------------------------------class CPolygon:public SPolygon //класс выпуклой оболочки, производный от звездчатого
{
public:
int isin(Pnt r) {return SPolygon::isin(r);};
friend void addPoint(double x, double y); //добавление новой точки
friend void DrawPoly(); //дружественная функция вывода полигона в графическое окно
void rotate(int phi, double x, double y); //составная функция, выполняющая поворот
//полигона вокруг точки (х, у)
friend void rott(double *x, double *y); //функция, необходимая для передачи массива
//координат перевернутого многоугольника другим функциям
friend void ResetPoly(); //функция удаления старого полигона и создания нового
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.