Einzelnen Beitrag anzeigen

Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.771 Beiträge
 
Delphi 10.4 Sydney
 
#8

Re: Halbkreis zwischen zwei Punkten

  Alt 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
  Mit Zitat antworten Zitat