Предмет: Информатика, автор: Varop

Из текста даны 3 точки, нужно найти окружность, которая охватывает все точки
к примеру три точки с координатами:

a(100 100)

b(300 300)

c(100 300)

а вывести координаты центра и на котором лежат все точки.

какой код будет на Pascal?

Ответы

Автор ответа: Аноним
0
Точки A, B, C, заданные на плоскости координатами, соединяем между собой и получаем треугольник. Задача сводится к нахождению радиуса и координат центра окружности, описанной вокруг треугольника.
Направим вдоль сторон треугольника ABC векторы:
a от В к С, b от А к С, с от А к В.
Радиус описанной окружности можно найти по формуле:
R= frac{bar{a}}{2*sinalpha}; quad cosalpha=(|bar{a}|*|bar{b}|)/(bar{a}*bar{b})
В числителе последней дроби стоит скалярное произведение векторов, в знаменателе - произведение их модулей.
Координаты центра вычисляются по формулам:
O_x= frac{1}{4S} *left| begin {matrix} {x_a^2+y_a^2 quad y_a quad 1 \ x_b^2+y_b^2 quad y_b quad 1 \ x_c^2+y_c^2 quad y_c quad 1} end {matrix} right|; quad O_y= -frac{1}{4S} *left| begin {matrix} {x_a^2+y_a^2 quad x_a quad 1 \ x_b^2+y_b^2 quad x_b quad 1 \ x_c^2+y_c^2 quad x_c quad 1} end {matrix} right|;
В приведенных формулах используются координаты точек, а не векторов.
Площадь треугольника S может быть вычислена по формуле Герона:
S= sqrt{p(p-a)(p-b)(p-c)}; quad p= frac{a+b+c}{2}

type
  Vector = record
    x: real;
    y: real;
    l: real
  end;
  Point = record
    x: real;
    y: real
  end;

procedure InitPoint(s: string; var P: Point);
  //Вводит координаты x,y точки P
begin
  write('Введите координаты x,y точки ' + s, ' ');
  readln(P.x, P.y)
end;

procedure GetVector(A: Point; B: Point; var AB: Vector);
  // Определяет координаты вектора и его длину по пвре точек
begin
  with AB do
  begin
    x := B.x - A.x;
    y := B.y - A.y;
    l := sqrt(sqr(x) + sqr(y))
  end
end;

function InnerProd(a: Vector; b: Vector): real;
begin
  Result := a.x * b.x + a.y * b.y
end;

function Alpha(a: Vector; b: Vector): real;
  // Возвращает угол между векторами a,b
begin
  result := arccos(abs(InnerProd(a, b)) / (a.l * b.l));
end;

function TriangleSq(a: real; b: real; c: real): real;
  // Возвращает площадь треугольника, найденную по трем сторонам
  // (формула Герона)
var
  p: real;
begin
  p := (a + b + c) / 2;
  Result := sqrt(p * (p - a) * (p - b) * (p - c))
end;

procedure GetCenter(A: Point; B: Point; C: Point; S: Real; var D: Point);
// Помещает в запись D координаты центра окружности площадью S,
// описанной вокруг треугольника с вершинами А,В и С
var
  la2, lb2, lc2, detx, dety: real;

begin
  la2 := Sqr(A.x) + Sqr(A.y);
  lb2 := Sqr(B.x) + Sqr(B.y);
  lc2 := Sqr(C.x) + Sqr(C.y);
  detx := lb2 * C.y - lc2 * B.y - la2 * C.y + lc2 * A.y + la2 * B.y - lb2 * A.y;
  dety := lb2 * C.x - lc2 * B.x - la2 * C.x + lc2 * A.x + la2 * B.x - lb2 * A.x;
  D.x := detx / (4 * S);
  D.y := -dety / (4 * S)
end;

var
  Ap, Bp, Cp: Point;
  a, b, c: Vector;
  R, S: real;
  Op: Point;

begin
  //Ввод координат точек
  InitPoint('A', Ap);
  InitPoint('B', Bp);
  InitPoint('C', Cp);
  //Вычисление векторов a=BC, b=AB, c=AC
  GetVector(Bp, Cp, a);
  GetVector(Ap, Bp, b);
  GetVector(Ap, Cp, c);
  R := A.l / (2 * sin(Alpha(b, c))); //радиус описанной окружности
  S := TriangleSq(A.l, B.l, C.l);
  GetCenter(Ap, Bp, Cp, S, Op);
  writeln('Радиус описанной окружности R=', R:0:2);
  writeln('Координаты центра этой окружности: О(', Op.x:0:1, ';', Op.y:0:1, ')')
end.

Тестовое решение (проверено геометрическим построением):

Введите координаты x,y точки A 100 100
Введите координаты x,y точки B 300 300
Введите координаты x,y точки C 100 300
Радиус описанной окружности R=141.42
Координаты центра этой окружности: О(200.0;200.0)


Похожие вопросы
Предмет: Математика, автор: martynovaola133
Предмет: История, автор: Anastasiya28255
. О каких двух вариантах выхода из революции идет речь в документах? 2. Как вы думаете, почему Николай II был вынужден принять вариант, предложенный С.Ю.Витте   Из доклада С. Ю. Витте Николаю II 18 марта 1905 г. 
Волнение, охватившее разнообразные слои общества, не может быть рассматриваемо как следствие частичных несовершенств государственного и социального устроения или только как результат организованных действий крайних партий. Корни этих волнений, несомненно, лежат глубже... Россия переросла форму существующего строя. Она стремится к строю правовому, на основе гражданской свободы. 

Из воспоминаний начальника канцелярии Министерства императорского двора А. А. Мосолова 
Граф (Фредерике В. Б.— министр императорского двора) мне рассказал, что когда он, обрадованный приездом Николая Николаевича (великий князь, дядя Николая II), сказал ему, что его приезд ждали, чтобы назначить диктатором, великий князь, будучи в каком-то неестественном возбуждении, выхватил револьвер и закричал: «Если государь не примет программы Витте и захочет назначить меня диктатором, я застрелюсь у него на глазах из этого самого револьвера».