// 1. "EllipsePoint"
// Mit dieser Funktion kann man Punkte auf einer Ellipse
//
(Kreisbahn) festlegen. Dort kann man dann Objekte platzieren.

// Getestet mit D2010 unter Win7

Beispiel 1 Beispiel 2
Beispiel 3 Beispiel 4

function EllipsePoint(X, Y, RX, RY, St, Zl: Integer): TPoint; 
var 
  W: Single; 
  MX, MY: Integer; 
begin 
  MX := X + RX; 
  MY := Y + RY; 
  W := (St / Zl) * (2 * Pi); 
  Result.X := Round(MX + sin(W) * RX); 
  Result.Y := Round(MY - cos(W) * RY); 
end; 
 
 
// Beispiel 1 
 
procedure TForm1.Button1Click(Sender: TObject); 
var 
  P: TPoint; 
  Start, Anzahl, RadiusX, RadiusY, Links, Oben, I, R: Integer; 
begin 
  Start := 0; 
  Anzahl := 60; 
  Links := 30; 
  Oben := 20; 
  RadiusX := 100; 
  RadiusY := 100; 
  for I := Start to Anzahl - 1 do 
  begin 
    P := EllipsePoint(Links, Oben, RadiusX, RadiusY, Start, Anzahl); 
    with Canvas do 
    begin 
      if I mod 5 = 0 then 
      begin 
        Brush.Color := clRed; 
        R := 5; 
      end 
      else 
      begin 
        Brush.Color := clSilver; 
        R := 3; 
      end; 
      Ellipse(P.X - R, P.Y - R, P.X + R, P.Y + R); 
    end; 
    inc(Start); 
    if Start = Anzahl then 
      Start := 0; 
  end; 
end; 
 
 
// Beispiel 2 
 
procedure TForm1.Button2Click(Sender: TObject); 
var 
  P: TPoint; 
  Start, Anzahl, RadiusX, RadiusY, Links, Oben, I, R, X, Y: Integer; 
  SZ: TSize; 
  S: String; 
begin 
  Start := 1; 
  Anzahl := 12; 
  Links := 275; 
  Oben := 30; 
  RadiusX := 100; 
  RadiusY := 100; 
  R := 22; 
  for I := Start to Anzahl do 
  begin 
    P := EllipsePoint(Links, Oben, RadiusX, RadiusY, I, Anzahl); 
    with Canvas do 
    begin 
      Brush.Color := clYellow; 
      Ellipse(P.X - R, P.Y - R, P.X + R, P.Y + R); 
      Brush.Style := bsClear; 
      S := IntToStr(I); 
      SZ := Canvas.TextExtent(S); 
      X := P.X - SZ.CX div 2; 
      Y := P.Y - SZ.CY div 2; 
      Textout(X, Y, S); 
    end; 
  end; 
end; 
 
 
// Beispiel 3 
 
procedure TForm1.Button3Click(Sender: TObject); 
var 
  P: TPoint; 
  Start, Anzahl, RadiusX, RadiusY, Links, Oben, I, R: Integer; 
begin 
  Start := 5; 
  Anzahl := 20; 
  Links := 530; 
  Oben := 30; 
  RadiusX := 60; 
  RadiusY := 110; 
  R := 5; 
  with Canvas do 
  begin 
    Brush.Color := clLime; 
    for I := Start to Anzahl do 
    begin 
      P := EllipsePoint(Links, Oben, RadiusX, RadiusY, I, Anzahl); 
      Rectangle(P.X - R, P.Y - R, P.X + R, P.Y + R); 
    end; 
  end; 
end; 
 
 
// Beispiel 4 
 
procedure TForm1.Button4Click(Sender: TObject); 
var 
  P: TPoint; 
  Start, Anzahl, RadiusX, RadiusY, Links, Oben, I, R: Integer; 
begin 
  Start := -3; 
  Anzahl := 12; 
  Links := 700; 
  Oben := 30; 
  RadiusX := 100; 
  RadiusY := RadiusX; 
  R := 15; 
  with Canvas do 
  begin 
    Brush.Color := clFuchsia; 
    for I := Start to -Start do 
    begin 
      P := EllipsePoint(Links, Oben, RadiusX, RadiusY, I, Anzahl); 
      Ellipse(P.X - R, P.Y - R, P.X + R, P.Y + R); 
    end; 
  end; 
end; 
-------------------------------------------------------------------------------
 
// 2. "DrawArc" bzw. "DrawPie"
// Wenn man EllipsePoint weiter denkt, kann man damit Teil-Ellipsen
// innerhalb eines Rechtecks unter Angabe des Start- und Endwinkels
// (in Grad) zeichnen. Die Variable Clockwise regelt dabei, ob das
// Zeichnen im oder gegen den Uhrzeigersinn geschieht.
// Siehe auch: Pie Prozent und Winkel berechnen
Beispiel 5 Beispiel 6


Beispiel 7 Beispiel 8

 

procedure DrawArcPie(Cnv: TCanvas; R: TRect; StartAngle, EndAngle: Single; 
  DPie: Boolean; Clockwise: Boolean); 
var 
  MX, MY, RX, RY, SA, EA, P2: Single; 
  TP, SX, SY, EX, EY: Integer; 
begin 
  P2 := PI / 180; 
  RX := (R.Right - R.Left) / 2; 
  RY := (R.Bottom - R.Top) / 2; 
  MX := R.Left + RX; 
  MY := R.Top + RY; 
  SA := StartAngle * P2; 
  EA := EndAngle * P2; 
  SX := Round(MX + sin(SA) * RX); 
  SY := Round(MY - cos(SA) * RY); 
  EX := Round(MX + sin(EA) * RX); 
  EY := Round(MY - cos(EA) * RY); 
  if Not Clockwise then 
  begin 
    TP := EX; 
    EX := SX; 
    SX := TP; 
    TP := EY; 
    EY := SY; 
    SY := TP; 
  end; 
  if DPie then 
    Pie(Cnv.Handle, R.Left, R.Top, R.Right, R.Bottom, EX, EY, SX, SY) 
  else 
    Arc(Cnv.Handle, R.Left, R.Top, R.Right, R.Bottom, EX, EY, SX, SY); 
end; 
 
 
procedure DrawArc(Cnv: TCanvas; R: TRect; StartAngle, EndAngle: Single; 
  Clockwise: Boolean = True); 
begin 
  DrawArcPie(Cnv, R, StartAngle, EndAngle, False, Clockwise); 
end; 
 
procedure DrawPie(Cnv: TCanvas; R: TRect; StartAngle, EndAngle: Single; 
  Clockwise: Boolean = True); 
begin 
  DrawArcPie(Cnv, R, StartAngle, EndAngle, True, Clockwise); 
end; 
 
 
// Beispiel 5 
 
procedure TForm1.Button1Click(Sender: TObject); 
begin 
  Canvas.Pen.Color := clBlack; 
  Canvas.Pen.width := 2; 
  DrawArc(Canvas, rect(10, 10, 210, 260), 270, 45); 
end; 
 
 
// Beispiel 6 
 
procedure TForm1.Button2Click(Sender: TObject); 
begin 
  Canvas.Pen.Color := clred; 
  Canvas.Pen.width := 5; 
  DrawArc(Canvas, rect(250, 10, 460, 110), 45, 270); 
end; 
 
 
// Beiispiel 7 
 
procedure TForm1.Button3Click(Sender: TObject); 
begin 
  Canvas.Pen.Color := clGreen; 
  Canvas.Brush.Color := clYellow; 
  Canvas.Pen.width := 2; 
  DrawPie(Canvas, rect(10, 210, 210, 460), 270, 45,  False); 
end; 
 
 
// Beispiel 8 
 
procedure TForm1.Button4Click(Sender: TObject); 
begin 
  Canvas.Pen.Color := clGray; 
  Canvas.Brush.Color := clLime; 
  Canvas.Pen.width := 5; 
  DrawPie(Canvas, rect(250, 210, 460, 410), 45, 270,  False); 
end; 

 


 

Zugriffe seit 6.9.2001 auf Delphi-Ecke