Выполните программу на компьютере. На основе этой программы напишите функцию, вычисляющую площадь треугольника по целочисленным координатам его вершин. Используйте эту функцию для вычисления площади n-угольника.
В программе примера p участвует в выражении p := p + .... Перед ним следует записать p := , чтобы вычисление не зависело от начального содержимого переменной. Для проверки введём вершины
Для площади используем формулу по координатам. Сначала вычислим величину
Она равна удвоенной площади треугольника со знаком, определяемым порядком обхода вершин. Обычная площадь неотрицательна, поэтому
Оформим оба вычисления функциями, как предусмотрено в п. DoubleArea сохранит знак, а требуемая функция TriangleArea вернёт именно площадь треугольника. Координаты храним как целые числа; функции принимают вещественные параметры, чтобы умножение выполнялось с вещественным результатом.
program PolygonArea;
var
x, y: array[ .. ] of longint;
n, i: integer;
total, d, s: real;
function DoubleArea(x , y , x , y , x , y : real): real;
begin
DoubleArea := (x - x ) * (y - y )
- (y - y ) * (x - x );
end;
function TriangleArea(x , y , x , y , x , y : real): real;
begin
TriangleArea := abs(DoubleArea(x , y , x , y , x , y )) / ;
end;
begin
readln(n);
if (n < ) or (n > ) then
writeln('Неверное число вершин')
else
begin
for i := to n do
readln(x[i], y[i]);
total := ;
for i := to n - do
begin
d := DoubleArea(x[ ], y[ ], x[i], y[i], x[i + ], y[i + ]);
s := TriangleArea(x[ ], y[ ], x[i], y[i], x[i + ], y[i + ]);
if d < then
total := total - s
else
total := total + s;
end;
writeln('S = ', abs(total): : );
end;
end.
Вершины вводим по порядку обхода границы простого многоугольника. Цикл рассматривает треугольники d позволяет вычесть лишние участки. Поэтому модуль берём после суммирования.
Пример: квадрат со стороной
Для треугольника ABC получаем
По формуле площади
Для треугольника ACD получаем
Следовательно,
Оба знака положительны, поэтому площадь квадрата S = .
Функция TriangleArea возвращает площадь треугольника S = .
