Печатать книгуПечатать книгу

§ 15. Пабудова графікаў функцый і дыяграм

Сайт: Профильное обучение
Курс: Інфарматыка. 11 клас (Павышаны ўзровень)
Книга: § 15. Пабудова графікаў функцый і дыяграм
Напечатано:: Гость
Дата: Суббота, 4 Май 2024, 00:41

15.1. Пабудова графікаў функцый

Прыклад 15.1. Стварыць праект, у якім варта пабудаваць графік функцыі y = x sinx на прамежку, зададзеным карыстальнікам.

Этапы выканання задання

  1. Змясціць на форму кампаненты: Image, два кампаненты LabeledEdit і кампанент Button.
  2. Змяніць уласцівасці Caption у кампанентаў LabeledEdit1, LabeledEdit2 на x0 і xn адпаведна.
  3. Змяніць уласцівасці Text у кампанентаў LabeledEdit1 і LabeledEdit2 на -10 і 10 адпаведна.
  4. Змяніць уласцівасці Caption у кампанента Button1 на «Построить график».
  5. Устанавіць памеры Image — 500 × 500.
  6. Напісаць апрацоўшчык падзеі OnClick для кампанента Button1, у якім графік функцыі неабходна будаваць па пунктах.

6.1. Намаляваць восі каардынат у выглядзе двух перпендыкулярных ліній, якія перасякаюцца ў цэнтры кампанента Image.
6.2. Колькасць пунктаў, якія ўтвараюць графік функцыі, павінна быць не менш за 10000 (n = 10000), каб атрымаць бачнасць суцэльнай лініі.
6.3. Крок змены значэння x вызначаецца як  .
6.4. Пры пабудове трэба ўлічваць маштаб: шырыня кампанента Image павінна адпавядаць даўжыні зададзенага прамежку. Тады маштабны каэфіцыент можна разлічыць па формуле .
6.5. Паколькі размяшчэнне восей каардынат на экране не супадае з размяшчэннем восей, прынятым у матэматыцы, то трэба пераўтварыць каардынаты: пункту (0; 0) павінен адпавядаць пункт у цэнтры кампанента Image. Для гэтага атрыманае значэнне x трэба павялічыць на значэнне , а значэнне у на  . Так як вось Y накіравана ўніз, а не ўверх, то значэнне трэба змяніць, памяняўшы знак на супрацьлеглы. На канве будзе зафарбоўвацца пункт з каардынатамі ().
6.6. Неабходна ўлічваць, што пры вылічэнні значэння x і y будуць рэчавымі, а значэнні каардынат на канве могуць быць толькі цэлымі. Таму перад прамалёўкай пункта варта пераўтварыць рэчавыя лікі ў цэлыя.

Калі ў дадатку, які працуе, змяніць канцы прамежку, то графік будзе намаляваны па-над ужо існуючага (прыклад 15.2). 

Прыклад 15.1. Форма на этапе канструявання:

Апрацоўшчык падзеі OnClick для кампанента Button1.

void __fastcall TForm1::Button1Click(TObject *Sender)

{

  double x0 = StrToFloat(LabeledEdit1 -> Text);

  double xn = StrToFloat(LabeledEdit2 -> Text);

  //крок

  double h = (xn - x0) / 10000;

  //цэнтр вобласці пабудовы

  int c_X = Image1 -> Width / 2;

  int c_Y = Image1 -> Height / 2;

  //восі

  Image1 -> Canvas -> MoveTo(0, c_Y);

  Image1 -> Canvas -> LineTo(2 * c_X, c_Y);

  Image1 -> Canvas -> MoveTo(c_X, 0);

  Image1 -> Canvas -> LineTo(c_X, 2*c_Y);

  //каэфіцыент маштабавання

  double k = 2.*c_/(xn - x0);

  for (double x = x0; x <= xn; x += h){

    double y = x * sin(x);

    //пераўтварэнне каардынат

    int x_ekr = int(* k) + c_X;

    int y_ekr = c_Y - int(y * k);

    Image1 -> Canvas -> Pixels[x_ekr][y_ekr] = clBlue;

  }

  Image1 -> Canvas -> Font -> Color = clBlue;

  Image1 -> Canvas -> TextOut(305"y=x*sin(x)");

}

Дадатак у час працы:

Прыклад 15.2. Змена пачатковых значэнняў канцоў прамежку:

Каб пазбегнуць такой сітуацыі, перад пабудовай графіка трэба ачысціць кампанент. Для гэтага можна выкарыстоўваць каманду:

Image1 -> Picture = NULL;

15.2. Пабудова дыяграм

Разгледзім асноўныя прынцыпы пабудовы гістаграм на прыкладах пабудовы гістаграмы і кругавой дыяграмы. Інтэрактыўнасць у дадзеным выпадку забяспечваецца данымі ў файле.

Прыклад 15.3. Стварыць праект, у якім неабходна пабудаваць гістаграму па даных з масіва з n элементаў. Значэнні элементаў масіва лічыць з тэкставага файла. Тэкставы файл змясціць у папку Win32\Debug. У гэтым выпадку для доступу да файла досыць прапісаць імя файла. Калі файл захоўваецца ў іншым месцы, то для доступу да файла неабходна прапісаць поўны шлях.

Этапы выканання задання

  1. Змясціць на форму кампаненты: малюнак (Image) і кнопка (Button).
  2. Змяніць уласцівасці Caption у кампанента Button1 на «Построить».
  3. Устанавіць памеры Image — 600 × 400.
  4. Напісаць апрацоўшчык падзеі OnClick для кампанента Button1, у якім дыяграма будуецца з дапамогай прамавугольнікаў.

4.1. Лічыць даныя з файла ў масівы: масіў d — захоўвае колькасці, па якіх будуецца дыяграма; масіў s — подпісы элементаў. Для працы з файламі падключыць бібліятэку <fstream>. Для чытання радкоў з файла падключыць бібліятэку <string>, для працы з масівамі — бібліятэку <vector>. Прапісаць дырэктыву Using NameSpace std для звароту да каманд стандартных бібліятэк.
4.2. Знайсці максімальны элемент у масіве — элемент n_max, які стаіць на месцы.
4.3. Разлічыць маштабны каэфіцыент: . Для таго каб пакінуць месца для вываду надпісаў, ад вышыні формы адымаем 40.
4.4. У цыкле будаваць n прамавугольнікаў аднолькавай шырыні. Шырыня прамавугольніка —  .Вышыня прамавугольніка вызначаецца значэннем , пераўтвораным да цэлага тыпу. Колер прамавугольнікаў задаваць выпадкова — кожны складальнік колеру змяняецца ў дыяпазоне ад 1 да 245 (выключаем чорны колер і колеры блізкія да белага).
4.5. Вывесці надпісы над прамавугольнікамі. Для вываду радкоў, лічаных з файла, іх трэба пераўтварыць так, каб можна было вывесці на канву. Для гэтага можна скарыстацца функцыяй c_str().

Прыклад 15.4. Стварыць праект, у якім трэба пабудаваць кругавую дыяграму па даным з масіва. Значэнні элементаў масіва лічыць з тэкставага файла. Тэкставы файл змясціць у папку Win32\Debug.

  1. Змясціць на форму кампаненты: малюнак (Image) і кнопка (Button).
  2. Змяніць уласцівасці Caption у кампанента Button1 на «Построить».
  3. Устанавіць памеры Image — 500 × 500.
  4. Для працы з файламі падключыць бібліятэку <fstream>. Для чытання радкоў з файла падключыць бібліятэку <string>, для працы з масівамі — бібліятэку <vector>. Для вылічэнняў спатрэбяцца трыганаметрычныя функцыі, таму неабходна падключыць бібліятэку <cmath>.  Прапісаць дырэктыву using namespace std для звароту да каманд стандартных бібліятэк.
  5. Напісаць апрацоўшчык падзеі OnClick для кампанента Button1, у якім дыяграма будуецца з дапамогай сектараў.

5.1. Лічыць даныя з файла ў масіў.
5.2. Знайсці суму элементаў масіва — sum.
5.3. Разлічыць маштабны каэфіцыент: .
5.4. У цыкле будаваць n сектараў. Колер сектара задаваць выпадкова — кожны складальнік колеру змяняецца ў дыяпазоне ад 1 да 245 (выключаем чорны колер і колеры блізкія да белага).
5.5. Сектары вызначаюцца кругам радыуса R, упісаным у квадрат з каардынатамі дыяганалі (x1; y1) — (x2; y2). Значэнні x1 = 50, y1 = 50, x2 = x1 + 2R, y2 = y1 + 2R, R = 200.
5.6. Разлік ключавых пунктаў для пабудовы сектара (гл. малюнак).
5.7. Для пабудовы сектара каардынаты пунктаў (x3; y3) і (x4; y4) трэба пераўтварыць у экранныя: павялічыць гарызантальныя на , а ў вертыкальных памяняць знак і павялічыць на  
5.8. Вывесці надпісы ўверсе кампанента Image. Для вываду радкоў, лічаных з файла, іх трэба пераўтварыць так, каб можна было вывесці на канву. Для гэтага можна скарыстацца функцыяй c_str (). Месцазнаходжанне надпісу разлічваецца так жа, як і для гістаграмы.

Прыклад 15.3. Форма на этапе канструявання:

Тэкставы файл з данымі:

Падключэнне бібліятэк:

Апрацоўшчык падзеі OnClick для кампанента Button1.

void __fastcall TForm1::Button1Click(TObject *Sender)

{

  //чытанне даных з файла

  ifstream fin("date.txt");

  int n;

  fin >> n;

  vector <int> d(n);

  vector <string> s(n);

  for(int i = 0; i < n; i++)

    fin >> s[i] >> d[i];

  //пошук максімальнага

  int n_max = 0;

  for (int i = 0; i < n; i++)

    if (d[i] > d[n_max])

      n_max = i;

  //каэфіцыент маштабавання

  int  h = Image1 -> Height - 40;

  double k = 1. * h / d[n_max];

  //шырыня слупка

  int w = Image1 -> Width/(2 * n + 1);

  int x = w;

  for (int i = 0; i < n; i++) {

    //колер

    int cr = rand()245 + 1;

    int cg = rand()245 + 1;

    int cb = rand()245 + 1;

    TColor c = TColor (RGB(cr, cg, cb));

    Image1 -> Canvas -> Brush -> Color = c;

    Image1 -> Canvas -> Rectangle

    (x, h + 40, x + w, h - (int)(k * d[i]) + 30);

    //надпіс

    Image1 -> Canvas -> Brush -> Color = clWhite;

    Image1 -> Canvas -> Font -> Color = c;

    Image1 -> Canvas -> TextOut

      (x + 33, s[i].c_str());

    //пераход да наступнага слупка

    x += 2 * w;

  }

}

Дадатак у час працы:

Прыклад 15.4. Форма на этапе канструявання:

Разлік ключавых пунктаў для пабудовы сектара:

Велічыня вугла u2 адпавядае бягучаму значэнню даных з масіва і роўная . Велічыня вугла u1 — сумарнае значэнне вуглоў для ўжо пабудаваных сектараў. Спачатку u1 = 0.

Значэнні x3 і y3 — катэты прамавугольнага трохвугольніка з вуглом u1 і гіпатэнузай роўнай радыусу круга, таму x3 = cos u1, y3 = sin u1.

Аналагічна вызначаем x4 і y4:  y4 = cos (u1 + u2), y4 = sin (u1 + u2).

Апрацоўшчык падзеі OnClick для кампанента Button1.

void __fastcall TForm1::Button1Click
               (TObject *Sender)

{

  //чытанне даных з файла

  ifstream fin("date.txt");

  int n;

  fin >> n;

  vector <int> d(n);

  vector <string> s(n);

  for(int i = 0; i < n; i++)

    fin >> s[i] >> d[i];

  //пошук сумы

  int sum = 0;

  for (int i = 0; i < n; i++)

    sum += d[i];

  //каэфіцыент маштабавання

  double pi = acos(-1.);

  double k = 2 * pi / sum;

  //вызначэнне круга

  double u1 = 0;

  int w = Image1 -> Width/(2 * n + 1);

  int x = w ;

  int R = 200;

  int x1 = 50, y1 = 50;

  int x2 = x1 + 2 * R, y2 = y1 + 2 * R;

  //цэнтр вобласці пабудовы

  int c_X = Image1 -> Width / 2;

  int c_Y = Image1 -> Height / 2;

  for (int i = 0; i < n - 1; i++){

    double u2 = k * d[i];

    int x3 = int (R * cos(u1)) + c_X;

    int y3 = c_Y - int (R * sin(u1));

    int x4 = int (R * cos(u1 + u2)) + c_X;

    int y4 = c_Y - int (R * sin(u1 + u2));

    //колер

    int cr = rand()255 + 1;

    int cg = rand()255 + 1;

    int cb = rand()255 + 1;

    TColor c = TColor (RGB(cr, cg, cb));

    Image1 -> Canvas -> Brush -> Color = c;

    //сектар

    Image1 -> Canvas -> Pie

    (x1, y1, x2, y2, x3, y3, x4, y4);

    //пераход да наступнага сектару

    u1 += u2;

    //надпіс

    Image1 -> Canvas -> Brush -> Color = clWhite;

    Image1 -> Canvas -> Font -> Color = c;

    Image1 -> Canvas -> 

    TextOut(x + 33, s[i].c_str());

    //пераход да наступнага надпісу

    x += 2 * w;

 Дадатак у час працы:

15.3. Выкарыстанне кампанента Chart (Дыяграма) для пабудовы графікаў функцый і дыяграм

З дапамогай кампанента Chart (Дыяграма) можна будаваць прыгожыя двух- і трохмерныя дыяграмы на аснове розных даных. Кампанент Chart знаходзіцца на палітры TeeChart STD і намаляваны ў выглядзе .  Кампанент Chart, змешчаны на форму, атрымлівае імя ChartN, дзе N — нумар 1, 2, 3… (прыклад 15.5).

Настройка дыяграмы выконваецца з дапамогай рэдактара, які выклікаецца двайной пстрычкай па кампаненце (прыклад 15.6). Параметры адлюстравання дыяграмы ў акне вызначаюцца ў раздзеле Chart, якая складаецца ў сваю чаргу з набору дадатковых падраздзелаў (General, Axis, Title, Legend, Panal, Walls, 3D). Больш падрабязную інфармацыю аб наладзе падраздзелаў можна пачытаць у дадатку.

Кампанент Chart з'яўляецца кантэйнерам аб'ектаў Series — серый даных, якія могуць быць візуалізаваны з дапамогай розных графічных уяўленняў. Уласцівасці серый устанаўліваюцца з дапамогай рэдактара дыяграм ці непасрэдна ў праграмным кодзе. Для дадання серыі выкарыстоўваецца кнопка Add. Затым адбываецца выбар знешняга выгляду дыяграмы (прыклад 15.7) і налада параметраў яе адлюстравання. Пры даданні серыя атрымлівае імя SeriesN, дзе N — нумар 1, 2, 3…

Усе серыі дадаюцца на дыяграму з выпадковымі данымі, таму пры праграмнай апрацоўцы серыю неабходна ачысціць камандай: Series1 -> Clear();

Для дадання даных у серыю выкарыстоўваецца метад Add. Калі даныя павінны адлюстроўвацца ў дэкартавай сістэме каардынат, то выкарыстоўваюць метад AddXY (прыклад 15.8).

Пры выкарыстанні кампанента Chart маштабаванне выконваецца аўтаматычна.

Прыклад 15.9. Стварыць праект, у якім неабходна пабудаваць гістаграму па даным з файла. Для пабудовы дыяграмы варта выкарыстоўваць кампанент Chart.

Этапы выканання задання

  1. Змясціць на форму кампаненты: дыяграма (Chart) і кнопка (Button).
  2. Змяніць уласцівасці Caption у кампанента Button1 на «Построить».
  3. Выбраць тып дыяграмы —гістаграма (Bar).
  4. Наладзіць наступныя ўласцівасці:
    4.1. Змяніць подпіс: Title — замяніць тэкст TChart на Гістаграма.
    4.2. Змяніць становішча легенды: Legend → Position — замяніць Right на Bottom.
  5. Падключыць бібліятэкі для працы з файламі і радкамі.
  6. Выкарыстоўваць той жа файл, які быў створаны для прыкладу 15.3.
  7. Напісаць апрацоўшчык падзеі OnClick для кампанента Button1.
    7.1. Ачысціць серыю ад выпадковых даных.
    7.2. У цыкле счытваць даныя з файла і дадаваць іх да даных серыі.

Прыклад 15.10. Стварыць праект, у якім неабходна пабудаваць графікі функцый y = x cosx  і   у адной сістэме каардынат. Для пабудовы дыяграмы варта выкарыстоўваць кампанент Chart.

Этапы выканання задання

  1. Змясціць на форму кампаненты: дыяграма (Chart), два кампанента LabeledEdit і кампанент Button.
  2. Змяніць уласцівасці Caption у кампанентаў LabeledEdit1, LabeledEdit2 на x0 і xn адпаведна.
  3. Змяніць уласцівасці Text у кампанентаў LabeledEdit1 і LabeledEdit2 на -30 і 30 адпаведна.
  4. Змяніць уласцівасці Caption у кампанента Button1 на «Построить».
  5. Дадаць дзве серыі, для якіх выбраць тып дыяграмы — кропкавая (Point), убраць галачку 3D.
  6. Змяніць назву серый: кнопка Title — замяніць Series1 на y=x*x+xcosx і Series2 на y=(x(x^2+5)^(1/2) / (x-3)
  7. Наладзіць наступныя ўласцівасці:
    7.1. Уласцівасць Title — выдаліць тэкст TChart.
    7.2. Змяніць становішча легенды: Legend → Position — замяніць Right на Bottom.
    7.3. Змяніць становішча восей: Axis → Left значэнне Axis → Position — устанавіць 50%; аналагічна для Axis → Bottom змяніць значэнне Axis → Position на 50%.
    7.4. Для кожнай серыі:
       7.4.1. змяніць памер пункта: Size — 1;
       7.4.2. выдаліць мяжу вакол пункта: Border — убраць галачку Visible.
  8. Напісаць апрацоўшчык падзеі OnClick для кампанента Button1.
    8.1. Ачысціць серыі ад выпадковых даных.
    8.2. У цыкле з крокам 0.001 вылічаць значэнні функцый і дадаваць даныя ў адпаведнай серыі.
    8.3. Для другой серыі дадаць праверку на роўнасць назоўніка нулю. Калі назоўнік па модулю менш 0.01, то варта прапускаць ітэрацыю цыкла.

*Прыклад 15.11. Стварыць праект, у якім неабходна пабудаваць астроіду, зададзеную параметрычнымі ўраўненнямі:

 .

Для пабудовы дыяграмы выкарыстоўваць кампанент Chart.

Этапы выканання задання

  1. Змясціць на форму кампаненты: дыяграма (Chart), кампанент LabeledEdit і кампанент Button.
  2. Змяніць уласцівасці Caption у кампанента LabeledEdit1 на а.
  3. Змяніць уласцівасці Text у кампанента LabeledEdit1 на 5.
  4. Змяніць уласцівасці Caption у кампанента Button1 на «Построить».
  5. Дадаць серыю, для якой выбраць тып дыяграмы —  точечная (Point).
  6. Наладзіць наступныя ўласцівасці:
    6.1. Змяніць подпіс: Title — замяніць тэкст TChart на «Астроида».
    6.2. Выдаліць легенду: Legend → Style — убраць галачку Visible.
    6.3. Становішча восей і памер пункта ўстанавіць гэтак жа, як і ў прыкладзе 15.10.
  7. Напісаць апрацоўшчык падзеі OnClick для кампанента Button1.
    7.1. Ачысціць серыі ад выпадковых даных.
    7.2. У цыкле змяняць параметр t ад 0 да 2p[1] з крокам 0.001.
    7.3. Вылічаць значэнні x і y і дадаваць даныя да серыі.

Прыклад 15.5. Кампанент Chart на форме:

Прыклад 15.6. Рэдактар дыяграмы:

Прыклад 15.7. Выбар тыпу дыяграмы:

Прыклад 15.8. Метады дадання даных у серыю:

  Series1->Add(z, s, color);  

Параметры:

z — лік, які адпавядае значэнню даных;

s — подпіс даных;

color — колер.

   Series1-> AddXY(x,y,"",color);  

Параметры:

x, y — каардынаты пункту, які адлюстроўваецца ў дэкартавай сістэме каардынат;

"" — тут можа быць тэкст подпісу да пункта;

color — колер.

Параметр color можа быць апушчаны. У гэтым выпадку колер элемента дыяграмы вызначаецца наладамі рэдактара.

Прыклад 15.9. Форма на этапе канструявання:

Апрацоўшчык падзеі OnClick для кнопкі.

void __fastcall TForm1::Button1Click
                (TObject *Sender)

{

  ifstream fin("date.txt");

  int n;

  fin >> n;

  Series1 -> Clear();

  for(int i = 0; i < n; i++) {

    string s;

    int d;

    fin >> s >> d;

    Series1 -> Add(d, s.c_str());

  }

}

Дадатак у час працы:

Прыклад 15.10. Форма на этапе канструявання:

Змена назвы серыі:

Апрацоўшчык падзеі OnClick для кнопкі.

void __fastcall TForm1::Button1Click
                TObject *Sender)

{

  double x0 = StrToFloat

  (LabeledEdit1 -> Text);

  double xn = StrToFloat

  (LabeledEdit2 -> Text);

  Series1 -> Clear();

  Series2 -> Clear();

  for (double x = x0; x <= xn; x += 0.001) {

    double y = x * x  + x * cos(x);

    Series1 -> AddXY(x, y, "", clBlue);

    if ( abs(x - 3) < 0.01 ) continue;

    double y1 = x * sqrt(x * x + 5) / (x - 3);

    Series2 -> AddXY(x, y1, "", clRed);

  }

}

Дадатак у час працы:

Прыклад 15.11. Форма на этапе канструявання:

Апрацоўшчык падзеі OnClick для кнопкі.

void __fastcall TForm1::Button1Click
                (TObject *Sender)

{

  double a = StrToFloat

   (LabeledEdit1 -> Text);

  Series1 -> Clear();

  for (double t = 0

       t <= 2 * acos(-1.);

        t += 0.001) {

    double x = a * cos(t) * cos(t) * cos(t);

    double y = a * sin(t) * sin(t) * sin(t);

    Series1 -> AddXY(x, y, "", clRed);

  }

} 

Дадатак у час працы:

пример

Пытанні да параграфа

1. Якія разлікі выкарыстоўваюць для пераўтварэння каардынат пры пабудове графікаў функцыі на экране камп'ютара?

2. Як вылічыць каэфіцыент маштабавання пры пабудове гістаграмы?

3. Як вылічыць каэфіцыент маштабавання пры пабудове кругавой дыяграмы?

4. Для чаго прызначаны кампанент Chart?

5. Якія метады Series дазваляюць дадаваць даныя на дыяграмы?

Практыкаванні

  

1. Дадайце ў праект 15.1 наступныя магчымасці:

  1. Восі каардынат са стрэлкамі і подпісамі.
  2. Адзінкавы адрэзак на восі X.
  3. Графік функцыі y = 0.3x2 – 4x + 2, у той жа сістэме каардынат, чырвоным колерам.

2. Змяніце праект з прыкладу 15.3 так, каб будавалася лінейчатая дыяграма (слупкі размешчаны гарызантальна).

3. Выкарыстоўваючы разлікі з прыкладу 15.3, пабудуйце наступныя дыяграмы:

1. У выглядзе ламанай лініі.

2. Пунктавая (у якасці «пункта» можна выкарыстоўваць круг дыяметра 10 пікселяў або сімвал «*», для якога ўстаноўлены памер шрыфту 20).

4. Выкарыстоўваючы разлікі з прыкладу 15.4, пабудуйце наступныя дыяграмы:

1. Паўкруг.

*2. Ружа вятроў.

5. Пабудуйце дыяграмы, выкарыстоўваючы кампанент Chart:

1.

2.

3.

6. Пабудуйце ў адной сістэме каардынат графікі функцый, выкарыстоўваючы кампанент Chart. Прадугледзьце палі для ўводу значэнняў параметраў.

a) 
b) .

7 *. Пабудуйце графікі крывых, зададзеных параметрычнымі ўраўненнямі, выкарыстоўваючы кампанент Chart:

1. Архімедава спіраль:

2. Ружа:

 

3. Слімак Паскаля: