// Es wird das Zentrum von drei verteilten Punkten ermittelt und ein Kreis
// darum herum berechnet, der alle drei Punkte berührt. Liegen die drei
// Punkte nicht auf einer Kreisbahn, wird eine Fehlermeldung ausgegeben.


// Getestet mit D4 unter XP

procedure Mittelpunkt(x1, y1, x2, y2, x3, y3: integer; 
  var vx, vy: integer); 
var 
  ad, bd, cd, dd, ed, fd, gd: integer; 
begin 
  ad := x2 - x1; 
  bd := y2 - y1; 
  cd := x3 - x1; 
  dd := y3 - y1; 
  ed := ad * (x1 + x2) + bd * (y1 + y2); 
  fd := cd * (x1 + x3) + dd * (y1 + y3); 
  gd := ad * (y3 - y2) - bd * (x3 - x2); 
  if gd = 0 then 
    raise exception.create('Mittelpunkt kann nicht ermittelt werden!'); 
  gd := gd + gd; 
  vx := succ(round((dd * ed - bd * fd) / gd)); 
  vy := succ(round((ad * fd - cd * ed) / gd)); 
end; 
 
function distance(x1, y1, x2, y2: integer): integer; 
var 
  dx, dy: integer; 
begin 
  dx := x1 - x2; 
  dy := y1 - y2; 
  result := round(sqrt(dx * dx + dy * dy)); 
end; 
 
procedure TForm1.Button4Click(Sender: TObject); 
var 
  vx, vy, radius, cx1, cy1, cx2, cy2, 
    x1, y1, x2, y2, x3, y3: integer; 
begin 
// --- Beispiel-Werte --- 
  x1 := 51; 
  y1 := 157; 
  x2 := 254; 
  y2 := 245; 
  x3 := 261; 
  y3 := 160; 
 
// ---- berechnen ------- 
  Mittelpunkt(x1, y1, x2, y2, x3, y3, vx, vy); 
 
// --- darstellen ------- 
  radius := distance(x1, y1, vx, vy); 
  cx1 := vx - radius; 
  cy1 := vy - radius; 
  cx2 := vx + radius; 
  cy2 := vy + radius; 
  with canvas do begin 
    pen.color := $CCFF; 
    brush.style := bsclear; 
    ellipse(cx1, cy1, cx2, cy2); 
    pixels[x1, y1] := clblack; 
    pixels[x2, y2] := clblack; 
    pixels[x3, y3] := clblack; 
    pixels[vx, vy] := clred; 
  end; 
end; 



Zugriffe seit 6.9.2001 auf Delphi-Ecke