Листинг модуля формы, комментарии и методические рекомендации программы

построения триангуляции со структурами triang1 и triang

 

Листинг модуля формы unit1.pas

Комментарии и методические рекомендации

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. Ответ прилагается в текстовом документе вместе со сдачей реализованного алгоритма}