// 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;
|