напишите плиз коментарии к программе (находит минимальный путь в графе по алгоритму дейкстры)
Код:
const max = 30;
type Vertek = record
posx,posy : Integer;
end;
AVertek = Array [1..max] of Vertek;
var count : byte;
awal,akhir : byte;
Node : AVertek;
bool_awal,bool_akhir : Boolean;
node1,node2 : byte;
Data : TJarak;
Closed : TPath;
procedure TForm1.DrawShape(TopLeft, BottomRight: TPoint; AMode: TPenMode);
begin
with Image.Canvas do
begin
Pen.Mode := AMode;
case DrawingTool of
2: {LINE}
begin
Image.Canvas.MoveTo(TopLeft.X, TopLeft.Y);
Image.Canvas.LineTo(BottomRight.X, BottomRight.Y);
end;
end;
end;
end;
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if Drawing then
begin
DrawShape(Origin, MovePt, pmNotXor);
MovePt := Point(X, Y);
DrawShape(Origin, MovePt, pmNotXor);
end;
end;
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
Drawingtool := 1;
Image.Canvas.Pen.Mode := pmcopy;
end;
procedure TForm1.ImageMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var XX,YY,i : byte;
begin
if Drawing then
begin
DrawShape(Origin, MovePt, pmNotXor); //afficher;
if drawingtool=2 then
begin
bool_akhir := False;
for i := 1 to count do
if (X>Node[i].posX-10) and (Y>Node[i].posY-10) and (X<Node[i].posX+10) and (Y<Node[i].posY+10) then
begin
bool_akhir := True;
node2 := i;
break;
end;
if (node1<>0) and (node2<>0) and bool_awal and bool_akhir then
begin
DrawShape(Point(Node[node1].posx,Node[node1].posy), Point(Node[node2].posx,Node[node2].posy), pmCopy);
Data[node1,node2] := round(sqrt(sqr(abs(Node[node2].posy-Node[node1].posy)/9) + sqr(abs(Node[node2].posx-Node[node1].posx)/9)));
Data[node2,node1] := Data[node1,node2];
XX := Node[node1].posx;
YY := Node[node1].posy;
with Image.Canvas do
begin
Image.Canvas.Pen.Mode := pmcopy;
Ellipse(XX-10,YY-10,XX+10,YY+10);
if node1 div 10 > 0 then
Textout(xX-7,Yy-6,IntToStr(node1))
else
Textout(Xx-3,Yy-6,IntToStr(node1));
end;
XX := Node[node2].posx;
YY := Node[node2].posy;
with Image.Canvas do
begin
Image.Canvas.Pen.Mode := pmcopy;
Ellipse(XX-10,YY-10,XX+10,YY+10);
if node2 div 10 > 0 then
Textout(xX-7,Yy-6,IntToStr(node2))
else
Textout(Xx-3,Yy-6,IntToStr(node2));
end;
image.Canvas.TextOut((Node[node1].posx+Node[node2].posx)div 2 ,(Node[node1].posy+Node[node2].posy) div 2,IntToStr(Data[node1,node2]));
end;
end; //if
Drawing := False;
if drawingtool=1 then
begin
count := count + 1;
with Node[count] do
begin
posx := x;
posy := y;
end;
with Image.Canvas do
begin
Image.Canvas.Pen.Mode := pmcopy;
Ellipse(X-10,Y-10,X+10,Y+10);
if count div 10 > 0 then
Textout(x-7,y-6,IntToStr(count))
else
Textout(x-3,y-6,IntToStr(count));
end;
end;
end;
end;