Из текста даны 3 точки, нужно найти окружность, которая охватывает все точкик примеру три точки с координатами:a(100 100)b(300 300)c(100 300)а вывести координаты центра и на котором лежат все точки.какой код будет на Pascal?

Из текста даны 3 точки, нужно найти окружность, которая охватывает все точки к примеру три точки с координатами: a(100 100) b(300 300) c(100 300) а вывести координаты центра и на котором лежат все точки. какой код будет на Pascal?
Гость
Ответ(ы) на вопрос:
Гость
Точки A, B, C, заданные на плоскости координатами, соединяем между собой и получаем треугольник. Задача сводится к нахождению радиуса и координат центра окружности, описанной вокруг треугольника. Направим вдоль сторон треугольника ABC векторы: a от В к С, b от А к С, с от А к В. Радиус описанной окружности можно найти по формуле: [latex]R= \frac{\bar{a}}{2*sin\alpha}; \quad cos\alpha=(|\bar{a}|*|\bar{b}|)/(\bar{a}*\bar{b})[/latex] В числителе последней дроби стоит скалярное произведение векторов, в знаменателе - произведение их модулей. Координаты центра вычисляются по формулам: [latex]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|;[/latex] В приведенных формулах используются координаты точек, а не векторов. Площадь треугольника S может быть вычислена по формуле Герона: [latex]S= \sqrt{p(p-a)(p-b)(p-c)}; \quad p= \frac{a+b+c}{2} [/latex] 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)
Не нашли ответ?
Ответить на вопрос
Похожие вопросы