Определение класса, объектами которого являются многоугольники указанного типа., страница 3

friend int hit(Pnt tt, CPolygon &pl) //функция проверки на попадание точки в полигон

{

if(pl.isin(tt)) return 1; //если попадает, то возвращает 1

return 0; //иначе 0

}

CPolygon(double *x, double *y, int m, TColor cl); //конструктор выпуклой оболочки

void Insert(Pnt t) //формирование массива вершин полигона

{

int i;  int j0, j1, j;

int *del = new int [n];

Pnt *q = new Pnt[n+ 1];

if(isin(t)) return;

j0 = j1 = 0;

for(i = 0; i < n; i++)

{

if((t - p[i]) * (p[(i + 1)%n] - p[i]) >= 0)

del[i] = 1;

else del[i] = 0;

}

for(i = 0; i < n; i++)

if(del[i] == 1 && del[(i + 1)%n] == 0) break;

j = 0; i = (i + 1)%n;

while(del[i] == 0)

{

q[j++] = p[i];

i = (i + 1)%n;

}

q[j] = p[i];

q[j + 1] = t;

delete []p;

p = new Pnt [j + 2]; n = j + 2;

for(i = 0; i < n; i++)

p[i] = q[i];

delete []q;

}

};

//--------------------------------------------------------------------------CPolygon::CPolygon(double *x, double *y, int m, TColor cl):SPolygon(cl)

{

//если точек меньше трех, то нечего формировать полигон

if(m==0) {n=0;return;}

if(m==1) {n=1;return;}

if(m==2) {n=2;return;}

// выпуклая оболочка методом Дейкстры

if(m>2) {//если точек от трех и более

int i; Pnt t; p = new Pnt [3]; n = 3;

for(i = 0; i < 3; i++)

{

p[i].x = x[i]; p[i].y = y[i];

}

if((p[1] - p[0]) * (p[2] - p[1]) < 0)

{

t = p[1]; p[1] = p[2]; p[2] = t;

}

for(i = 3; i < m; i++)

{

t.x = x[i]; t.y = y[i];

Insert(t);

}

}

}

//--------------------------------------------------------------------------void CPolygon::rotate(int phi, double x, double y) //функция поворота полигона с координатами (х,у) на угол phi

{

double tx, ty, cp = cos(PI/180*phi), sp = sin(PI/180*phi);

double msx[100],msy[100];

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

{

tx = p[i].x - x;

ty = p[i].y - y;

p[i].x = x+tx*cp+ty*sp;

p[i].y = y-tx*sp+ty*cp;

msx[i] = x+tx*cp+ty*sp;

msy[i] = y-tx*sp+ty*cp;

}

rott(msx,msy); //вызов функции прорисовки повернутого полигона и сохранения

//массива его вершин для использования другими программами

}

Текст файла Unit1.cpp

//--------------------------------------------------------------------------#include <vcl.h>

#pragma hdrstop

#include "Unit1.h"

#include <math.h>

#include <stdlib.h>

#include <malloc.h>

#include <stdio.h>

#include <commdlg.h>

#include <string.h>

#include <windows.h>

#include <conio.h>

#include <memory.h>

#include "poly.h"

#define PI 3.14159

//--------------------------------------------------------------------------#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

CPolygon *dom2;  //объявляем полигон, как глобальную переменную

int clr=(TColor)clRed, //цвет полигона

click=0, //счетчик кликов мыши по графическому полю

ind=0, //индекс для массивов координат (х, у)

n1; //переменная, в которой хранится количество вершин сформированного многоугольника

bool flg=false, //флаг, устанавливается тогда, когда можно производить над полигоном действие

mode=false, //флаг, устанавливающийся когда пользователь формирует полигон, и сбрасывающийся,

//когда полигон сформирован и можно определять попадает ли точка в его область

set=false, //флаг, устанавливающийся, когда пользователь задает точку, с помощью введенных координат,

//вокруг которой будет вращаться полигон

ss=false; //флаг, устанавливающийся, когда пользователь задает точку, с помощью мыши,

//вокруг которой будет вращаться полигон

double msx[100],msy[100], //массивы координат всех точек, указанных пользователем мышью в графическом поле (вершины и внутренние точки)