uses
Graph;
const
Scale = 0.6;
type
tPoint = record
x, y: double end;
procedure Switch(var a, b: tPoint);
var
c: tPoint;
begin
c := a;
a := b;
b := c
end;
procedure RandomPoint(var a: tPoint);
begin
a.x := Random(Round(GetMaxX * Scale)) + GetMaxX * (1 - Scale) / 2;
a.y := Random(Round(GetMaxY * Scale)) + GetMaxY * (1 - Scale) / 2
end;
function Dist(a, b: tPoint): double;
begin
Dist := Sqrt(Sqr(a.x - b.x) + Sqr(a.y - b.y))
end;
function Divide(a, b: tPoint; r: double): tPoint;
begin
Divide.x := (b.x - a.x) / (1 + r) * r + a.x;
Divide.y := (b.y - a.y) / (1 + r) * r + a.y
end;
function CosB(a, b, c: tPoint): double; // cos(B)
var
la, lc: double;
begin
la := Dist(b, c);
lc := Dist(b, a);
CosB := (la * la + lc * lc - Sqr(Dist(a, c))) / la / lc / 2
end;
procedure PPL(a, b: tPoint);
begin
with a do
MoveTo(Round(x), Round(y));
with b do
LineTo(Round(x), Round(y))
end;
function Mul(a: tPoint; k: double): tPoint;
begin
Mul.x := a.x * k;
Mul.y := a.y * k
end;
function Add(a, b: tPoint): tPoint;
begin
Add.x := a.x + b.x;
Add.y := a.y + b.y
end;
function Dot(a, b: tPoint): double;
begin
Dot := a.x * b.x + a.y * b.y
end;
var
GrDr, GrMo, i: integer;
a, b, c, d: tPoint;
la, lb, lc, p, s, ri, ro: double;
function Al(a, b, c: tPoint): double;
begin
Al := Sqr(Dist(b, c)) * Dot(Add(a, Mul(b, -1)), Add(a, Mul(c, -1)))
/ 8 / (s * s)
end;
begin
Randomize;
InitGraph(GrDr, GrMo, '');
repeat
RandomPoint(a);
RandomPoint(b);
RandomPoint(c);
if Dist(a, b) > Dist(b, c) then
Switch(a, c);
if Dist(a, b) > Dist(a, c) then
Switch(b, c);
la := Dist(b, c);
lb := Dist(c, a);
lc := Dist(a, b);
d := Divide(a, b, lb / la);
d := Divide(c, d, lb / Dist(a, d));
ri := Dist(c, d) * Sqrt((1 - CosB(b, c, a)) / 2);
p := (la + lb + lc) / 2;
s := Sqrt(p * (p - la) * (p - lb) * (p - lc));
ro := la * lb * lc / 4 / Sqrt(p * (p - la) * (p - lb) * (p - lc));
until (ri > GetMaxY * Scale / 10) and (ro < GetMaxY * Scale * 2);
PPL(a, b);
PPL(b, c);
PPL(c, a);
with d do
begin
Circle(Round(x), Round(y), Round(ri));
PutPixel(Round(x), Round(y), white)
end;
d := Add(Add(Mul(a, Al(a, b, c)), Mul(b, Al(b, c, a))),
Mul(c, Al(c, b, a)));
with d do
begin
Circle(Round(x), Round(y), Round(ro));
PutPixel(Round(x), Round(y), white)
end;
readln;
CloseGraph
end.