Площадь многоугольника
Постановка задачи
Пусть требуется определить площадь полигона A1, A2, A3, A4, A5 с координатами вершин x1,y1; x2,y2; x3,y3; x4,y4; x5,y5. Площадь полигона S можно представить трапециями, у которых абсциссы являются основаниями, а разности ординат соседних точек высотами
S = a1A1A2a2 + a2A2A3a3 + a3A3A4a4 — a5A5A4a4 — a1A1A5a5.
2S = (x1 + x2)(y2 — y1) + (x2 + x3)(y3 — y2) + (x3 + x4)(y4 — y3) + (x4 + x5)(y5 — y4) + (x5 + x1)(y1 — y5). (1)
После раскрытия скобок и приведения подобных членов получим
2S = x1y2 — x2y1 + x2y3— x3y2 + x3y4 — x4y3 + x4y5 — x5y4 + x5y1 — x1y5 (2)
После вынесения за скобки x1, x2, x3, x4, x5 будем иметь
2S = x1(y2-y5) + x2(y3-y1) + x3(y4-y2) + x4(y5-y3) + x5(y1-y4),
а если из формулы (2) вынести за скобки y1, y2, y3, y4, y5. То будем иметь
2S = y1(x5-x2) + y2(x1-x3) + y3(x2-x4) + y4(x3-x5) + y5(x4-x1).
В сокращенном виде эти формулы можно записать так:
После преобразований получаем формулу
Решение задачи
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
Program Ploshad_Mnogougolnika; Uses crt; Var p,s,min: real; n: integer; x,y: array[1..21] of real; Procedure Vvod; Var i: integer; Begin write('Введите количество углов многоугольника n='); readln(n); for i:= 1 to n do begin writeln('Введите координату N ',i); write('x[',i,']='); readln(x[i]); write('y[',i,']='); readln(y[i]); end; x[n+1]:=x[1]; y[n+1]:=y[1]; End; Procedure Perenos; Var i: integer; Begin min:=y[1]; for i:= 2 to n do if min >y[i] then min:=y[i]; for i:=1 to n+1 do y[i]:=y[i]-min; End; Procedure Ploshad; Var i: integer; Begin s:=0; for i:= 1 to n do s:= s+((y[i+1]+y[i])*(x[i+1]-x[i])/2); end; Procedure Vyvod; Begin writeln('Площадь многоугольника S=',abs(s):1:2); readln; end; BEGIN clrscr; Vvod; Perenos; Ploshad; Vyvod; END. |