Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- unit Unit1;
- interface
- uses
- Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
- Buttons, ExtCtrls, StdCtrls, XPMan, Menus;
- type
- TMainForm = class(TForm)
- SBNode: TSpeedButton;
- SBLine: TSpeedButton;
- SBStart: TSpeedButton;
- SBFinish: TSpeedButton;
- SBPath: TSpeedButton;
- SBClear: TSpeedButton;
- MemoSolution: TMemo;
- LbSolution: TLabel;
- LbDistance: TLabel;
- EdDistance: TEdit;
- LbStart: TLabel;
- EdStart: TEdit;
- EdFinish: TEdit;
- LbFinish: TLabel;
- XPManifest: TXPManifest;
- MainMenu: TMainMenu;
- mmiHelp: TMenuItem;
- mmiAbout: TMenuItem;
- Image: TImage;
- LbGraph: TLabel;
- procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
- Y: Integer);
- procedure SBNodeClick(Sender: TObject);
- procedure ImageMouseUp(Sender: TObject; Button: TMouseButton;
- Shift: TShiftState; X, Y: Integer);
- procedure ImageMouseMove(Sender: TObject; Shift: TShiftState; X,
- Y: Integer);
- procedure ImageMouseDown(Sender: TObject; Button: TMouseButton;
- Shift: TShiftState; X, Y: Integer);
- procedure SBLineClick(Sender: TObject);
- procedure FormCreate(Sender: TObject);
- procedure SBStartClick(Sender: TObject);
- procedure SBFinishClick(Sender: TObject);
- procedure SBPathClick(Sender: TObject);
- procedure SBClearClick(Sender: TObject);
- procedure mmiAboutClick(Sender: TObject);
- procedure FormCenter;
- private
- Drawing: Boolean;
- Origin, MovePt: TPoint;
- DrawingTool : byte;
- { Private declarations }
- public
- procedure DrawShape(TopLeft, BottomRight: TPoint; AMode: TPenMode);
- { Public declarations }
- end;
- var
- MainForm: TMainForm;
- implementation
- {$R *.DFM}
- uses disktrat, Unit2;
- 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 TMainForm.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 TMainForm.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 TMainForm.SBNodeClick(Sender: TObject);
- begin
- Drawingtool := 1;
- Image.Canvas.Pen.Mode := pmcopy;
- end;
- procedure TMainForm.ImageMouseUp(Sender: TObject; Button: TMouseButton;
- Shift: TShiftState; X, Y: Integer);
- var
- XX,YY,i : byte;
- begin
- if Drawing then
- begin
- DrawShape(Origin, MovePt, pmNotXor);
- 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;
- 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;
- procedure TMainForm.ImageMouseMove(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 TMainForm.ImageMouseDown(Sender: TObject; Button: TMouseButton;
- Shift: TShiftState; X, Y: Integer);
- var
- i : byte;
- begin
- Drawing := True;
- Image.Canvas.MoveTo(X, Y);
- Origin := Point(X, Y);
- MovePt := Origin;
- if drawingtool=2 then
- begin
- bool_awal := 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_awal := True;
- node1 := i;
- break;
- end;
- end
- else
- if drawingtool in [3,4] then
- begin
- 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
- case drawingtool of
- 3 : begin
- awal := i;
- EdStart.Text := IntToStr(i);
- end;
- 4 : begin
- akhir := i;
- EdFinish.Text := IntToStr(i);
- end;
- end;
- break;
- end;
- end;
- end;
- procedure TMainForm.SBLineClick(Sender: TObject);
- begin
- Drawingtool := 2;
- end;
- procedure TMainForm.FormCreate(Sender: TObject);
- var
- Bitmap: TBitmap;
- xx,yy : byte;
- begin
- MainForm.Left := Screen.Width div 2 - Width div 2;
- MainForm.Top := Screen.Height div 2 - Height div 2;
- DoubleBuffered := True;
- Bitmap := nil;
- try
- Bitmap := TBitmap.Create;
- Bitmap.Width := 350;
- Bitmap.Height := 300;
- Image.Picture.Graphic := Bitmap;
- finally
- Bitmap.Free;
- end;
- MemoSolution.Clear;
- Drawingtool := 1;
- count := 0;
- awal:= 0;
- akhir := 0;
- EdStart.Text := '';
- EdFinish.Text := '';
- for xx := 1 to max do
- for yy := 1 to max do
- begin
- if xx=yy then
- Data[xx,yy] := 0
- else
- Data[xx,yy] := 999;
- end;
- end;
- procedure TMainForm.SBStartClick(Sender: TObject);
- begin
- Drawingtool := 3;
- end;
- procedure TMainForm.SBFinishClick(Sender: TObject);
- begin
- Drawingtool := 4;
- end;
- procedure TMainForm.SBPathClick(Sender: TObject);
- var
- i : byte;
- XX,YY : byte;
- begin
- MemoSolution.Clear;
- Drawingtool := 2;
- RuteTerpendek(Data,Closed,awal,akhir,count);
- if (awal<>0) and (akhir<>0) and (closed.jarak<>0) and (closed.jarak<>999) then
- begin
- Drawing := True;
- EdDistance.Text := IntToStr(closed.jarak);
- for i := 1 to closed.nodeke-1 do
- begin
- MemoSolution.Text := MemoSolution.Text + IntToStr(closed.arraypath[i]) + '-';
- image.Canvas.Pen.Color := clred;
- DrawShape(Point(Node[closed.arraypath[i]].posx,Node[closed.arraypath[i]].posy), Point(Node[closed.arraypath[i+1]].posx,Node[closed.arraypath[i+1]].posy), pmCopy);
- XX := Node[closed.arraypath[i]].posx;
- YY := Node[closed.arraypath[i]].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(closed.arraypath[i]))
- else
- Textout(Xx-3,Yy-6,IntToStr(closed.arraypath[i]));
- end;
- end;
- XX := Node[closed.arraypath[closed.nodeke]].posx;
- YY := Node[closed.arraypath[closed.nodeke]].posy;
- with Image.Canvas do
- begin
- Image.Canvas.Pen.Mode := pmcopy;
- Ellipse(XX-10,YY-10,XX+10,YY+10);
- if closed.nodeke div 10 > 0 then
- Textout(xX-7,Yy-6,IntToStr(closed.arraypath[closed.nodeke]))
- else
- Textout(Xx-3,Yy-6,IntToStr(closed.arraypath[closed.nodeke]));
- end;
- image.Canvas.Pen.Color := clblack;
- MemoSolution.Text := MemoSolution.Text + IntToStr(closed.arraypath[closed.nodeke]);
- Drawing := False;
- end
- else
- begin
- MemoSolution.Text := 'iln''ya pas de connections';
- EdDistance.Text := '';
- end;
- Drawingtool := 5;
- end;
- procedure TMainForm.SBClearClick(Sender: TObject);
- begin
- Drawingtool := 6;
- FormCreate(Sender);
- SBNodeClick(Sender);
- EdDistance.Clear;
- end;
- procedure TMainForm.FormCenter;
- begin
- with Form2 do
- begin
- Left := Screen.Width div 2 - Width div 2;
- Top := Screen.Height div 2 - Height div 2;
- end;
- end;
- procedure TMainForm.mmiAboutClick(Sender: TObject);
- begin
- with Form2 do
- begin
- Form2 := TForm2.Create(Application);
- FormCenter;
- AnimateWindow(Handle, 250{Vitesse}, AW_CENTER);
- Show;
- end;
- end;
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement