unit VagasForm; // Vágás ZH megoldás // Informatika tanár szak, nappali tagozat, III. évfolyam // 2001. december 21. // Papp Szabolcs interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls; type TMetszespont = record x, y :word; t :real; end; TForm1 = class(TForm) Image1: TImage; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; LabelA: TLabel; LabelB: TLabel; LabelC: TLabel; LabelD: TLabel; Label5: TLabel; Label6: TLabel; Label7: TLabel; Label8: TLabel; EditX1: TEdit; EditY1: TEdit; EditX2: TEdit; EditY2: TEdit; Button1: TButton; procedure FormShow(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private declarations } a, b, c, d :word; // a 4 hatarolo egyenes x1, y1, x2, y2 :word; // szakasz vegpontok xk, yk, xv, yv :word; // a vagott vegpontok Metszesek :array [1..4] of TMetszespont; procedure Szakasz(x1, y1, x2, y2 :word); function MetszespontFuggoleges(x :word):real; function MetszespontVizszintes(y :word):real; procedure Rendezes; public { Public declarations } procedure Vagas; end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.Vagas; var t :real; i :integer; t1, t2 :real; // Vegpontok t ertekei M1, M2 :TMetszespont; // Vegpontok t szerinti sorrendben begin x1 := StrToInt(EditX1.Text); y1 := StrToInt(EditY1.Text); x2 := StrToInt(EditX2.Text); y2 := StrToInt(EditY2.Text); if (x1 = x2) and (y1 = y2) then // Egy pont? MessageDlg('Ez egy pont, nincs mit vágni!', mtInformation, [mbOK], 0) else begin Szakasz(x1, y1, x2, y2); // Eredeti szakasz kirajzol Image1.Canvas.Brush.Color := clBlack; // Vegpontok fekete korrel Image1.Canvas.Ellipse(x1-3, y1-3, x1+3, y1+3); Image1.Canvas.Ellipse(x2-3, y2-3, x2+3, y2+3); Image1.Canvas.Brush.Color := clWhite; if x1 <> x2 then begin t := MetszespontFuggoleges(a); // 1. metszespont Metszesek[1].t := t; Metszesek[1].x := a; Metszesek[1].y := Round((1-t)*y1 + t*y2); t := MetszespontFuggoleges(b); // 2. metszespont Metszesek[2].t := t; Metszesek[2].x := b; Metszesek[2].y := Round((1-t)*y1 + t*y2); end; if y1 <> y2 then begin t := MetszespontVizszintes(c); // 3. metszespont Metszesek[3].t := t; Metszesek[3].x := Round((1-t)*x1 + t*x2); Metszesek[3].y := c; t := MetszespontVizszintes(d); // 4. metszespont Metszesek[4].t := t; Metszesek[4].x := Round((1-t)*x1 + t*x2); Metszesek[4].y := d; end; if x1 = x2 then begin // elso=masodik, harmadik=negyedik Metszesek[1] := Metszesek[3]; Metszesek[2] := Metszesek[3]; Metszesek[3] := Metszesek[4]; end; if y1 = y2 then begin // elso=masodik, harmadik=negyedik Metszesek[4] := Metszesek[2]; Metszesek[3] := Metszesek[2]; Metszesek[2] := Metszesek[1]; end; if x1 = x2 then begin t1 := MetszespontVizszintes(y1); // Kezdopont t-je t2 := MetszespontVizszintes(y2); // Vegpont t-je end else begin t1 := MetszespontFuggoleges(x1); // Kezdopont t-je t2 := MetszespontFuggoleges(x2); // Vegpont t-je end; if t1 < t2 then // Kezdopont es vegpont sorrendje begin M1.t := t1; M2.t := t2; M1.x := x1; M2.x := x2; M1.y := y1; M2.y := y2; end else begin M1.t := t2; M2.t := t1; M1.x := x2; M2.x := x1; M1.y := y2; M2.y := y1; end; Rendezes; // Rendezes for i := 1 to 4 do // Metszespontok kirajzolasa begin Image1.Canvas.Ellipse(Metszesek[i].x-2, Metszesek[i].y-2, Metszesek[i].x+2, Metszesek[i].y+2); if (i mod 2 = 0) and ( (Metszesek[i-1].x = Metszesek[i].x) or (Metszesek[i-1].y = Metszesek[i].y) ) then Image1.Canvas.TextOut(Metszesek[i].x+10, Metszesek[i].y-13, ','+IntToStr(i)) else Image1.Canvas.TextOut(Metszesek[i].x+4, Metszesek[i].y-13, IntToStr(i)); end; // Vagott vegpontok megallapitasa: if M1.t >= Metszesek[2].t then // Bent van a kezdopont a begin // teglalapban? xk := M1.x; // Bent van, ezert marad ő a kezdopont yk := M1.y; end else begin // Nincs bent, ezert a vagott pont a kezdopont xk := Metszesek[2].x; yk := Metszesek[2].y; end; if M2.t <= Metszesek[3].t then // Bent van a vegpont a begin // teglalapban? xv := M2.x; // Bent van, ezert marad ő a vegpont yv := M2.y; end else begin // Nincs bent, ezert a vagott pont a vegpont xv := Metszesek[3].x; yv := Metszesek[3].y; end; if (xk >= a) and (xk <= b) and // Van egyatalan pont a teglalapban? (xv >= a) and (xv <= b) and (yk >= c) and (yk <= d) and (yv >= c) and (yv <= d) then begin Image1.Canvas.Pen.Color := clRed; // Vegeredmeny kirajzolas Szakasz(xk, yk, xv, yv); Image1.Canvas.Pen.Color := clBlack; end else MessageDlg('Nincs a szakasznak pontja a téglalapban!', mtInformation, [mbOK], 0); end; end; procedure TForm1.Szakasz(x1, y1, x2, y2 :word); begin Image1.Canvas.MoveTo(x1, y1); Image1.Canvas.LineTo(x2, y2); end; function TForm1.MetszespontFuggoleges(x :word):real; // t kiszamitasa x koordinata alapjan begin result := (x-x1)/(x2-x1); end; function TForm1.MetszespontVizszintes(y :word):real; // t kiszamitasa y koordinata alapjan begin result := (y-y1)/(y2-y1); end; procedure TForm1.Rendezes; // Minimumkivalasztasos var i, j, minidx :integer; min :real; sv :TMetszespont; begin for i := 1 to 3 do begin minidx := i; min := Metszesek[i].t; for j := i+1 to 4 do if Metszesek[j].t < min then begin minidx := j; min := Metszesek[j].t; end; sv := Metszesek[i]; Metszesek[i] := Metszesek[minidx]; Metszesek[minidx] := sv; end; end; procedure TForm1.FormShow(Sender: TObject); var h_harmad, w_harmad :integer; r :TRect; begin r.Left := 0; r.Right := Image1.Width; r.Top := 0; r.Bottom := Image1.Height; Image1.Canvas.FillRect(r); h_harmad := Image1.Height div 3; w_harmad := Image1.Width div 3; a := w_harmad; b := 2*w_harmad; c := h_harmad; d := 2*h_harmad; Szakasz(a, 0, a, Image1.Height); Szakasz(b, 0, b, Image1.Height); Szakasz(0, c, Image1.Width, c); Szakasz(0, d, Image1.Width, d); LabelA.Caption := IntToStr(a); LabelB.Caption := IntToStr(b); LabelC.Caption := IntToStr(c); LabelD.Caption := IntToStr(d); Image1.Canvas.TextOut(a+2, 2, LabelA.Caption); Image1.Canvas.TextOut(b+2, 2, LabelB.Caption); Image1.Canvas.TextOut(2, c+2, LabelC.Caption); Image1.Canvas.TextOut(2, d+2, LabelD.Caption); end; procedure TForm1.Button1Click(Sender: TObject); begin FormShow(nil); Vagas; end; end.