// Die foldende
Routine prüft, ob sich ein Punkt innerhalb // Getestet mit D4 unter WinME var x1, x2, y1, y2, a, b, mx, my: Integer; procedure preparation; // immer bei Ellipsen-Änderung procedure switch(var v1, v2: Integer); var hlp: Integer; begin hlp := v1; v1 := v2; v2 := hlp; end; begin if x1 > x2 then switch(x1, x2); a := round((x2 - x1) / 2); b := round((y2 - y1) / 2); mx := x1 + a; my := y1 + b; end; procedure how(I: Integer); // 4 Ellipsen mit unterschiedlichem Startpunkt begin case I of 0: begin x1 := 10; y1 := 10; x2 := 100; y2 := 200; end; 1: begin x1 := 100; y1 := 10; x2 := 10; y2 := 200; end; 2: begin x1 := 100; y1 := 200; x2 := 10; y2 := 10; end; else begin x1 := 10; y1 := 200; x2 := 100; y2 := 10; end; end; end; function inside(pk: TPoint): boolean; // Test ob drin var X, Y: Integer; Z: Double; begin X := pk.X - mx; Y := pk.Y - my; if (a = 0.0) or (b = 0.0) then result := false else begin Z := abs(sqrt(abs((1 - sqr(X) / sqr(a)) * sqr(b)))); result := (Y >= -Z) and (Y <= Z) and (X >= -a) and (X <= a); end; end; procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin if inside(point(X, Y)) then Label1.caption := 'inside' else Label1.caption := 'outside'; end; // Aufrufe mit 4 verschieden gezeichneten Ellipsen procedure TForm1.Button1Click(Sender: TObject); begin how(0); preparation; canvas.ellipse(x1, y1, x2, y2); end; procedure TForm1.Button2Click(Sender: TObject); begin how(1); preparation; canvas.ellipse(x1, y1, x2, y2); end; procedure TForm1.Button3Click(Sender: TObject); begin how(2); preparation; canvas.ellipse(x1, y1, x2, y2); end; procedure TForm1.Button4Click(Sender: TObject); begin how(3); preparation; canvas.ellipse(x1, y1, x2, y2); end;
// Falls man nur
Kreise (als Sonderform der Ellipse) abprüfen will, var x1, x2, y1, y2, mx, my, rd: Integer; procedure TForm1.FormPaint(Sender: TObject); begin canvas.ellipse(x1, y1, x2, y2); end; procedure TForm1.FormCreate(Sender: TObject); begin x1 := 50; y1 := 50; x2 := 150; y2 := 150; Label1.caption := ''; Vorbereitung; end; procedure TForm1.Vorbereitung; // immer bei Ellipsen-Änderung begin rd := round((x2 - x1) / 2); mx := x1 + rd; my := y1 + rd; end; procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin if sqr(mx - X) + sqr(my - Y) < sqr(rd) then Label1.caption := 'drin' else Label1.caption := 'draußen'; end; |
Zugriffe seit 6.9.2001 auf Delphi-Ecke