Площадь треугольника  (3 уровень)

Условие:
Три непараллельные прямые заданы коэффициентами a, b и c. Коэффициенты а и b не могут быть одновременно равны нулю. Определить площадь треугольника, образованного этими прямыми с точностью до трёх знаков после запятой.

Технические условия:
В файле "input.txt" находятся коэффициенты a, b и c для трёх прямых - по три в каждой строке. В файл "output.txt" нужно вывести единственное число - значение площади образованного треугольника.

Примеры файлов:

Input.txt

Output.txt

0 1 1
1 0 1
4 3 19

6.000

1 0 0
0 1 0
1 1 2

2.000

1 -1 0
1 0 6
1 -2 0

9.000

-1 1 1
1 -2 -2
0 1 4

4.500

1 -1 -1
2 -1 -1
1 2 17

7.500

 

Решение:
{$A+,B-,D+,E+,F-,G+,I-,L+,N+,O-,P-,Q-,R-,S-,T-,V+,X+,Y+}
{$M 16384,0,655360}
var
a1, a2, a3, b1, b2, b3, c1, c2, c3 : double;
x1, x2, x3, y1, y2, y3 : double;
vx1, vy1, vx2,
vy2 : double;
delta : double;
begin
{Читаем входные данные: }
assign(input, 'input.txt');
reset(input);
read(a1, b1, c1, a2, b2, c2, a3, b3, c3);
close(input);
{Вычисляем координаты точек методом Крамера. Так как прямые не
параллельны, delta не равняется нулю: }
{Точка пересечения 1-й и 2-й прямой: }
delta := a1*b2-a2*b1;
x1 := (c1*b2-c2*b1)/delta;
y1 := (a1*c2-a2*c1)/delta;
{Точка пересечения 2-й и 3-й прямой: }
delta := a2*b3-a3*b2;
x2 := (c2*b3-c3*b2)/delta;
y2 := (a2*c3-a3*c2)/delta;
{Точка пересечения
1-й и 3-й прямой: }
delta := a1*b3-a3*b1;
x3 := (c1*b3-c3*b1)/delta;
y3 := (a1*c3-a3*c1)/delta;
{Считаем координаты векторов, идущих из 1-й во 2-ю и из 1-й в 3-ю точки: }
vx1 := x2 - x1;
vy1 := y2 - y1;
vx2 := x3 - x1;
vy2 := y3 - y1;
{Теперь мы можем посчитать искомую площадь треугольника как модуль половины
векторного произведения полученных векторов (ну и сразу выводим в файл): }
assign(output, 'output.txt');
rewrite(output);
writeln(abs((vx2*vy1 - vx1*vy2)/2):0:3);
close(output);
end.