Registriert seit: 30. Nov 2005
Ort: München
5.771 Beiträge
Delphi 10.4 Sydney
|
Re: Halbkreis zwischen zwei Punkten
2. Jun 2006, 09:40
Hallo Taugenichts,
eine verbesserte Version:
Ich hoffe Du steigst da ein wenig durch.
Grüße
Klaus
[edit] für RadToDeg muß die Math Unit eingebunden werden [/edit]
Delphi-Quellcode:
procedure circle(canvas:TCanvas;color,bgColor:TColor;p1,p2:TPoint;deg:Integer);
// canvas -> Zeichenfläche
// color -> Kreisfarbe
// bgColor -> Hintergrundfarbe
// p1 -> Startpunkt
// p2 -> zweiter Schnittpunkt
// deg -> Kreisdrehung 0..360
var
radius: Integer;
x,y: Integer;
pz:Tpoint;
i,j : real;
m:real;
rect: TRect;
begin
canvas.brush.Color:=bgColor;
canvas.FillRect(canvas.ClipRect); // Fülle Canvas mit bgColor
m := (p2.Y - p1.Y)/(p2.x -p1.X); // Die Steigung der Geraden
// der Punkt pz befindet sich auf der Geradenmitte
if p1.x = p2.x then // wenn die Gerade eine Sekrechte ist
begin
radius := (p2.y - p1.y) DIV 2;
pz.y := p1.Y + radius;
pz.x := p1.X;
j:= -90;
i:=-90;
end
else // wenn die Gerade eine Waagerechte ist
if p1.y = p2.y then
begin
radius := (p2.x -p1.x) DIV 2;
pz.Y := p1.Y;
pz.X := p1.x + radius;
j := 0;
i:=0;
end
else // die Gerade ist eine Schräge
begin
radius := round(sqrt ( sqr(p2.x - p1.x) + sqr(p2.y-p1.y))) DIV 2;
pz.X := p1.X + (p2.X - p1.X) DIV 2;
pz.y := p1.y + (p2.y - p1.y) DIV 2;
//ShowMessage(floatToStr(m));
j := radToDeg(arctan(m)); // arctan der Steigung = Winkel
i:=j;
end;
canvas.Pen.Color:=color;
if p1.X < p2.X then
canvas.PenPos:=p2
else
canvas.PenPos:=p1;
// male einen Halbkreis
while i < j + deg do
begin
x:=pz.x+round(radius*cos((i*pi/180)));
y:=pz.y+round(radius*sin((i*pi/180)));
canvas.LineTo(x,y);
i:=i+1;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
p1,p2:TPoint;
begin
p1.X:=300;
p1.y:=250;
p2.X:=125;
p2.Y:=150;
circle(Form1.Canvas,clRed,clBlack,p1,p2,180);
end;
Klaus
|
|
Zitat
|