unit Unit1;
interface
uses
Windows. Messages, SysUtils. Classes, Graphics, Controls, Forms.
Dialogs, StdCtrls, Spin, ExtCtrls, ComCtrls. Buttons;
type
TForm1=-class(TForm)
Image1: TImage;
Button3: TButton:
Button4: TButton;
Button5: TButton:
Button6: TButton;
SpinEditl: TSpinEdit;
Label1: TLabel;
Label2: TLabel;
Image2: TImage;
Button1: TButton;
Button2: TButton;
procedure FormCreate(Sender: TObject);
procedure Image1MouseMove(Sender: TObject; Shift:
TShiftState; X,
Y: Integer);
procedure FormMouseMove(Sender: TObject; Shift:
TShiftState; X,
Y: Integer);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Button6Click(Sender: TObject);
private
{ Public declarations}
public
{ Public declarations}
……..
end;
var
Form1: TForm1:
n: integer;
pts: array[1..100] of TPoint;
Metki: array[1…100] of boolean;
isVerh, isNiz: array[1..100] of boolean;
isCentrExist: boolean;
vo: array[1..100] of integer;
triang1,triang2: array[1..300,1..3] of integer;
cur. j, max, min, ccntr, vol, i, t1, t2, t3, triangNum, k:
integer;
pr1. pr2, pr3: boolean;
dx, dy, sinj, sinmax, sinmin: real;
implementation
{$R *.DFM}
…..
procedure TForm1.Button1Click(Sender: TObject);
begin
…..
…..
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
……
…….
.…..
……
…….
…….
…..
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
……
end;
procedure TF orm1.Button4Click(Sender: TObject);
begin
if isCentrExist then begin
vol:=0;
for i:=1 to n do if isVerh[i] then begin
Image1.Canvas.MoveTo(pts[centr].x,pts[centr].y);
Image1.Canvas. LineTo(pts[i].x,pts[i].y);
inc(vol);
vo[vol]:=i;
end;
for i:=n-1 downto 2 do if isNiz[i] then begin
Image1.Canvas.MoveTo(pts[centr].x,pts[centr].y);
Image1.Canvas.LineTo(pts[i].x,pts[i].y);
inc(vol);
vo[vol]:=i;
end;
vo[vol+1]:=1;
for i:=1 to vol do begin
triang1[i,1]:=vo[i];
triang1[i,2]:=vo[i+1];
triang1[i,3]:=centr;
end;
triang2[i,1]:=2;
triang2[i,2]:=vol;
triang2[i,3]:=0;
for i:=2 to vol-1 do begin
triang2[i,1]:=i+1;
triang2[i,2]:=i-1;
triang2[i,3]:=0;
end;
triang2[vol,1]:=1;
triang2[vol,2]:=vol-1;
triang2[vol,3]:=0
end;
end;
procedure TForm1.Button5Click(Sender: TObject);
begin
if isCentrExist then begin
triangNum:=vol;
for i:=l to n do if metki[i] then begin
metki[i]:=false;
Image1.Canvas.Pcn.Coior:=clRed;
Image1.Canvas.Ellipse(pts[i].x-2,pts[i].y-2,pts[i].x+2,pts[i].y+2);
Image1.Canvas.Pen.Color”=clBlack;
for j:=1to triangNum do begin
t1:=triang1[j,1];
t2:=triang1[j,2];
t3:=triang1[j,3j;
pr1:=((pts[i].x-pts[t1].x)*(pts[t2].y-pts[t1].y))>((pts[t2].x-
pts[t1].x)*(pts[i].y-pts[t1].y));
pr2:=((pts[i].x-pts[t2].x)*(pts[t3].y-pts[t2].y))>((pts[t3].x-
pts[t2].x)*(pts[i].y-pts[t2].y));
pr3:=((pts[i].x-pts[t3].x)*(pts[t1].y-pts[t3].y))>((pts[t1].x-
pts[t3].x)*(pts[i].y-pts[t3].y));
if (pr1=pr2)and(pr1=pr3) then begin
Image1.Canvas.MoveTo(pts[t1].x,pts[t1].y);
Image1.Canvas.LineTo(pts[i].x,pts[i].y);
Image1.Canvas.MoveTo(pts[t2].x.pts[t2].y);
Image1.Canvas.LineTo(pts[i].x,pts[i].y);
Image1.Canvas.MoveTo(pts[t3].x,pts[t3].y);
Image1.Canvas.LineTo(pts[i].x,pts[i].y);
for k:=triaugNum+2 downto j+3 do begin
triang1[k,1]:=triang1[k-2,1];
triang1[k,2]:=triang1[k-2,2];
triang1[k,3]:=triang1[k-2,3];
triang2[k,1]:=triang2[k-2,1];
triang2[k,2]:=triang2[k-2,2];
triang2[k,3]:=triang2[k-2,3];
end;
for k:=1 to triangNum+2 do begin
if triang2[k,1]>j then triang2[k,l]:=triang2[k,l]+2;
if triang2[k,2]>j then triang2[k,2]:=triang2[k,l]+2;
if triang2[k,3]>j then triang2[k,2]:=triang2[k,l]+2;
end:
triang1[j+1,1]:=triang1[j,1];
triang1[j+1,2]:=triang1[j,2];
triang1[j+1,3]:=triang1[j,3];
triang1[j+2,1]:=triang1[j,1];
triang1[j+2,2]:=triang1[j,2];
triang1[j+2,3]:=triang1[j,3];
triang1[j,3]:=i;
triang1[j+1,1]:=i;
triang1[j+2,2]:=i;
triang2[j,1]:=j+1;
triang2[j,2]:=j+2;
triang2[j+1,2]:=j+2;
triang2[j+1,3]:=j;
triang2[j+2,1]:=j+1;
triang2[j+2,3]:=j;
k:=triang2[j+1,1];
if k<>0 then begin
if triang2[k,1]=j then triang2[k,1]:=j+1;
if triang2[k,2]=j then triang2[k,2]:=j+1;
if triang2[k,3]=j then triang2[k,3]:=j+1
end;
k:=triang2[j+2,1];
if k<>0 then begin
if triang2[k,1]=j then triang2[k,1]:=j+2;
if triang2[k,2]=j then triang2[k,2]:=j+2;
if triang2[k,3]=j then triang2[k,3]:=j+2
end;
triangNum:=triangNum+2;
break
end
end
end
end
end;
end. |
{He забудьте описать
процедуру сортировки
множества точек по абсциссе}
{Исходя из предыдущих
программ, комментариев и анализа данной
программы сделайте выводы о смысловом значении переменных. Ответ
прилагается в текстовом документе вместе со сдачей реализованного
алгоритма}
{Создайте процедуру,
с помощью которой при
создании формы объект
Image1 заливался белым
цветом и подключите
randomize, для того, чтобы автоматически проставить точки}
{Создайте процедуру
Button1CIick, отвечаю-щую за проставление
точек, количество которых берегся из объекта SpinEdit1, автоматически на
объекте Image1
с использованием
random и запись координат точек в массив pts}
{Создайте процедуру
сортировки множества
точек с 1 элемента по r
(or левого края к правому). Для этого можете использовать любой из
эффективных методов сортировки массива}
//Процедура построения ВО.
{Пометьте все точки как не просмотренные, используя массив metki,
каждому элементу которого присвойте значение true}
{Пометьте все точки, как не попавшие в верхнюю часть выпуклой оболочки,
т.е. их значение false в массиве isVerh}
{Аналогичным образом помечаем все точки, как не попавшие в нижнюю часть
выпуклой оболочки используя массив isNiz}
// Начинаем построение выпуклой оболочки.
{помечаем первую и последнюю точки в массиве metki как просмотренные и
принадлежащие массиву isVerh и массиву isNize}
// Построение верхней части.
{Текущая точка cur - самая левая, т.е. первая}
{Пока cur не равно n на
ходи максимальный синус (поиск самого левого вектора) для оставшихся
точек. Нарисуй ребро выпуклой оболочки, пометь соответствующую точку как
просмотренную и попавшую в верхнюю часть выпуклой
оболочки}
{Аналогичным образом находим нижнюю часть выпуклой оболочки и
визуализируем ее}
// Процедура нахождения условно «центральной» точки.
{Находим значение переменной centr как медианы массива исходных
точек. Если данная точка уже просмотрена, то смотрим следующую за ней
или перед ней и т.д. до тех пор, пока не найдется точки еще
непомеченной. Если такая точка найдена, то переменной
isCentrExist присваиваем
значение true. Помечаем
данную точку как просмотренную}
// Построение триангуляции но центральной точке и точкам выпуклой
оболочки.
{Проанализируйте данную процедуру: за что отвечают переменные vol, vo и
каким образом
происходит формирование массивов triang1 и triang2. Ответ прилагается в
текстовом документе вместе со сдачей реализованного алгоритма}
// Построение триангуляции по оставшимся
точкам.
{Проанализируйте данную процедуру: за что отвечают переменные
triangNum, t1, t2, t3. pr1,pr2, pr3. Каким образом происходит
перестроение массивов triang1 и triang2. Ответ прилагается в текстовом
документе вместе со сдачей реализованного алгоритма}
|