За сегодня: 5
Сейчас: 1
Часто встречаются задачи, которые сложно решаются математическим (расчетным) способом. Например, если нужно вычислить с заданной точностью площадь сложной фигуры. В этом случае имеет смысл применять методы приблизительной оценки, например, графическим методом.
Вычисление площади сложной фигуры
Рассмотрим приведенный выше пример с вычислением площади сложной произвольной фигуры. Имеются координаты вершин фигугы в плоскости. Выводим на экран закрашенный полигон, предварительно пересчитав координаты вершин полигона через коэффициенты масштабирования kx и ky(чтобы фигура поместилась на экране), затем сканируем по точкам и подсчитываем количество точек определенного цвета. Полученное значение умножаем на kx и ky и получаем значение площади фигуры.
На первый взгляд способ может показаться сложным, однако это вовсе не так. Продемонстрируем сказанное на примере программы на языке Pascal:
uses graph,crt;
const
xmax=500; { Ширина экрана}
ymax=400; { Высота экрана}
dcol=7; { Цвет заливки фигуры }
var
a: array[1..10] of PointType; { Массив с коорд. вершин фигуры}
gd,gm,k,i,msx,msy,x,y:integer;
kx,ky,s:real;
begin
clrscr;
write('Kol vershin=');
readln(k); { Вводим количество вершин фигуры}
msx:=0; { Максимальная коорд. x фигуры}
msy:=0; { Максимальная коорд. y фигуры}
{ Вводим координаты вершин и заодним находим msx и msy:}
for i:=1 to k do
begin
write('x',i,'=');
readln(a[i].x);
if a[i].x>msx then
msx:=a[i].x;
write('y',i,'=');
readln(a[i].y);
if a[i].y>msy then
msy:=a[i].y;
end;
kx:=msx/xmax; { Коэфф. масштабирования по оси x}
ky:=msy/ymax; { Коэфф. масштабирования по оси y}
{ Пересчитываем коорд. вершин с учетом коэф-тов масштаб.:}
for i:=1 to k do
begin
a[i].x:=round(a[i].x/kx);
a[i].y:=round(a[i].y/ky);
end;
gd := Detect;
InitGraph(Gd,Gm,'e:\tp7\bgi');
setcolor(dcol);
setfillstyle(1,dcol);
FillPoly(k,a); { Вывод полигона по коорд. вершин, хранящ. в a}
s:=0;
{ Сканируем экран и считаем количество точек цвета dcol:}
for y:=0 to ymax do
for x:=0 to xmax do
if getpixel(x,y)=dcol then
s:=s+1;
outtextxy(0,ymax+20,'Press any key to continue...');
readkey;
closegraph;
s:=s*kx*ky; { s= площади фигуры}
writeln('s=',s);
readkey;
end.