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

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;