Построить на экране произвольный треугольник с указанными координатами вершин, вписать в него окружность и описать около него окружность — Pascal(Паскаль)

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.

Leave a Comment

97 − 96 =