Авторский сайт
Привет, Гость!
bagulg.ru
Меню
Основное
Програмеру
Схемотехнику
Примеры
Микроконтр
Ист. питания
Справочник
Авторизация
Логин
Пароль
Регистрация
Статистика
Всего: 1329
За сегодня: 12
Сейчас: 8
Графический метод

Часто встречаются задачи, которые сложно решаются математическим (расчетным) способом. Например, если нужно вычислить с заданной точностью площадь сложной фигуры. В этом случае имеет смысл применять методы приблизительной оценки, например, графическим методом.

Вычисление площади сложной фигуры

Рассмотрим приведенный выше пример с вычислением площади сложной произвольной фигуры. Имеются координаты вершин фигугы в плоскости. Выводим на экран закрашенный полигон, предварительно пересчитав координаты вершин полигона через коэффициенты масштабирования 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.
© 2010-2013 BAG/ULG
Рисунок