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], //массивы координат всех точек, указанных пользователем мышью в графическом поле (вершины и внутренние точки)
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.