69106

Побудова графіків функцій. Претворення координат і об’єктів

Лекция

Информатика, кибернетика и программирование

Для зображення графіка слід перевести логічні координати його точок у їх екранні еквіваленти. 3 урахуванням того що центр логічної системи координат збігається із центром екрана а також того що напрям екранної вісі ординат є зворотним до напряму логічної вісі ординат отримаемо таку формулу...

Украинкский

2014-09-30

63 KB

0 чел.

Лекція 15.Тема: Побудова графіків функцій. Претворення координат і об’єктів.

План:

1. Зображення текстової інформації у графічному режимі

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

3. Перетворення координат і об'єктів

1. Зображення текстової інформації у графічному режимі

Текст у графічному режимі виводиться з використанням шрифтів, що зберігаються у файлах із розширенням chr. Параметрами шрифтів визначається розмір літер, напрям та спосіб вирівнювання тексту тощо. Значенням цих параметрів зіставлені такі константи:

Const {типи шрифтів}

DefaultFont=0; TriplexFont=1;  SmallFont=2; SansSerifFont=3; GothicFont=4;

Const {напрям тексту}

HorizDir=0; {зліва направо}

VertDir=1; {знизу догори}

Const {вирівнювання тексту}

LeftText=0; CenterText=1; RightText=2; {горизонтальне}

BottomText=0; CenterText=1; TopText=2; {вертикальне}

 

Усі шрифти, крім шрифту DefaultFont, є векторними, тобто їх елементи формуються як сукупність векторів, що характеризуються напрямом і довжиною. Жоден шрифт, крім зазначеного, не підтримує кирилиці - для виведення її символів шрифти слід модифікувати. Власне виведення тексту виконують процедури OutText i OutTextXY, які було наведено в табл. 5.1.

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

Технологію побудови графіків функцій продемонструємо на прикладі функції f(x)=|sin x|+|cos x|. Графік функції побудуємо за точками (x, f(x)): циклічно задамо ряд значень абсциси {xi}, обчислимо відповідні значення ординати y=f(xi) і зобразимо серію відрізків, що з'єднуватимуть точки (xi-1, yi-1) із точками (xi, yi).

Для зображення графіка слід перевести логічні координати його точок у їх екранні еквіваленти. Область визначення розглядуваної функції — це вся вісь абсцис, а область значень — відрізок [-2, 2]. Відрізок логічної вісі ординат завдовжки 4 сід розтягнути у вертикальний екранний відрізок більшої довжини, тобто домножити на коефіцієнт, що його називатимемо масштабом. Вважатимемо, шо масштаб є цілим числом від 20 до 100. 3 урахуванням того, що центр логічної системи координат збігається із центром екрана, а також того, що напрям екранної вісі ординат є зворотним до напряму логічної вісі ординат, отримаемо таку формулу для обчислення екранної ординати у_екрана за логічною ординатою f(x):

у_екрана:=у_центра_екрана-масштаб*f(x);

Яким чином визначати логічні абсциси? Найкраща якість зображення графіка досягається тоді, коли кожній екранній абсцисі відповідає логічна абсцисса. Наприклад, якщо вісь абсцис проходитиме посередині екрана, який містить 480 точок по вертикалі, то екранний піксел (0,240) буде зіставлений з логічною точкою (х1, 0), піксел (1, 240) - з точкою (х2,0). Такої відповідності легко досягти, якщо перерахувати екранну координату х_екрана у відповідну логічну координату х. це можливо зробити за такою формулаю:

х:=(х_екрана-х_центра_екрана)/масштаб;

Приклад 5.3.

Програма ех5_2 будує графік функції f(x)=|sin x|+cos |x|. Значення масштабу вводиться до змінної scale, а координати центра екрана на початку роботи програми присвоюються змінним сх і су. Графік будується процедурою build_graph. Дві інші процедури зображують координатні вісі і розмічають їх. При розмітці осей координат використовуються рядки тексту, обробка яких детально розглядатиметься в розділі 7.3. Результати роботи програми наведено на рис. 5.2.

Program ех5_2;      {графік функції у=|sin x|+cos |x|}

uses crt, graph;

var dr, mode: integer;      {графічний драйвер і режим}

  scale: real;       {масштаб}

  cx, cy: integer;      {координати центра екрана}

{------------------------аналітична функція, графік якої будується -------------------------}

function f(x: real): real;

begin

  f:=abs(sin(x))+cos(abs(x));

end;

{--------------------------------- виведення вісей координат ---------------------------------}

procedure axes;

begin

  SetColor(1);

  Line (cx, 0, cx GetMaxY);      {вісь У}

  Line (0, cy, GetMaxX, cy);      {вісь Х}

{стрілки на вісі Х }

  Line (GetMaxX-10, (cy)-5, GetMaxX, cy);

  Line (GetMaxX-10, (cy)+5, GetMaxX, cy);

{стрілки на вісі У}

  Line (cx, 0, (cx)-5, 10);

  Line (cx, 0, (cx)+5, 10);

        {написи на вісях}

  outtextxy (GetMaxX-10, cy+20, ‘X’);

  outtextxy (cx+10, 10, ‘Y’);

end;

{--------------------------------- розмітка вісей координат ---------------------------------}

procedure graduir;

var i, j: real;        {позначки на вісях}

  s:string[7];      {рядок для виведення позначки на вісях}

begin

  SetColor(1);

  j:=0;        {позначка ‘0’ в центрі координат}

{--------------------------------- розмітити вісь Х ---------------------------------}

{позначки у вигляді вертикальних рисок}

  repeat

     i:=cx+(-j)*scale;

     line (round(i), cy-5, round(i), cy+5);

     if j<>0 then     {не виводити повторно позначку ‘0’ }

     begin

        str (-j:6:2, s);  {перетворити числову позначку на текстову і відобразити її на екрані}

        OutTextXY (round(i)-10, cy+10, s);

     end;

{зобразити позначки на горизонтальні вісі}

     i:=cx+j*scale;

     Line (round(i), cy-5, round(i), cy+5);

     if j<>0 then

     begin

        str (j:6:2, s);     {перетворення числа на рядок}

        OutTextXY (round(i)-10, cy+10, s);

     end;

     j:=j+pi;

  until j=8*pi;       {позначки вичерпано}

{--------------------------------- розмітити вісь У ---------------------------------}

  j:=0;

  repeat

     i:=cy-j*scale;      {розташування позначки на вісі У}

     line (cx+3, round(i), cx-3, round(i));

     if j<>0 then

     begin

        str (j:4:1, s);      {перетворення числа на рядок}

{вивести значення, відповідне позначці на вертикальній вісі в межах від 0 до 2}

        OutTextXY (cx+15, round(i)-2, s);

     end;

     i:=cy+j*scale;

     line (cx+3, round(i), cx-3, round(i));

     if j<>0 then

     begin

        str (-j:4:1, s);      {перетворення числа на рядок}

{вивести позначки на вертикальній вісі в межах від -2 до 0}

        OutTextXY (cx+15, round(i)-2, s);

     end;

     j:=j+0.5;

{розмітити вертикальну вісь через кожні 0.5 ділень}

  until j+2;      {діапазон позначок: від -2 до 2}

end;

{--------------------------------- побудова графіка ---------------------------------}

procedure build_graph;

var

  x0, y0, x1, y1: integer;   {екранні координати кінців відрізка графіка}

  x: real;

begin

  for x0:=0 to GetMaxX do     {вибір екранної абсциси}

  begin

     x:=(x0-cx)/scale;  {перерахувати пік селі екрана в логічні координати абсциси графіка}

     y0:=round (cy-scale*f(x));

     if x0>0 then

        line (x0, y0, x1, y1);     {зобразити відрізок графіка}

     x1:=x0;       {зберегти координати кінця

     y1:=y0;        попереднього відрізку}

  end;

end;

{--------------------------------- основна програма ---------------------------------}

begin

  dr:=Detect;       {визначити графічний драйвер}

  InitGraph (dr, mode, ‘d:\bp\bgi’);    {ініціалізувати графічний драйвер}

  cx:= GetMaxX div 2;     {визначити координати}

  cy:= GetMaxY div 2;     {центра екрана}

  SetBkColor(15);      {визначити колір фону}

  SetColor(1);       {визначити колір ліній}

  OutText (‘input scale (20…100):’);

  gotoxy(27, 1);

  read (scale);       {увести масштаб зображення}

  ClearDevice;      {очистити екран}

  axes;        {зобразити вісі координат}

  graduir;       {розмітити вісі}

  OutTextXY (10, 30, ‘y=|sin(x)|+cos|x|’);   {вивести напис}

  build graph;       {зобразити графік}

end.

3. Перетворення координат і об'єктів

У комп’ютерній графіці перетворення координат застосовують для зміни масштабу зображення, отримання симетричних частин графічних об’єктів, дублювання частин зображення тощо. Перетворення координат об’єкта – це їх пере обчислення за певними формулами. У подальшому розглядатимемо лише лінійні перетворення координат на площині, під час яких зберігаються такі геометричні властивості обкатів: прямі лінії залишаються прямими, зберігається паралельність прямих, а також відношення площ геометричних фігур. Основними лінійними перетвореннями є паралельне перенесення, розтягування (стискання) і поворот геометричних об’єктів.

Припустимо, що у декартовій системі координат задана плоска геометрична фігура, (х, у) – координати одієї з її точок. Нехай (х1, у1) - координати тієї самої точки фігури після їх перетворення. Наведемо формули паралельного перенесення геометричної фігури на dx одиниць уздовж осі X і на dy одиниць уздовж осі У (формула а), розтягування уздовж осі X у kx разів і вздовж осі У у ky разів (формула б) і повороту навколо початку координат на кут α (формула в).

Лінійні перетворення проілюстровано на рис. 5.3. Необідно зазначити, що будь-яке перетворення координат об'єкта можна розглядати як перетворення координатних осей.

а)   б)   в)

Приклад 5.4.

Розробимо програму обертання відрізка навколо одного зі своїх кінців. Вважатимемо, що початок логічних координат збігається із нерухомим кінцем відрізка, а довжина відрізка дорівнює r. Тоді рухомий кінець відрізка матиме спочатку координати (r,0), а після обертання на кут α — координати:

(r соs α + 0*sin α, - r sin α + 0*соs α) = (r соs α, - r sin α). Нерухомим кінцем відрізка вважатимемо центр екрана, і з урахуванням того, що до цієї точки було перенесено початок координат, а також того, що екранна вісь ординат спрямована донизу, отримаємо такі формули координат рухомого кінця: (xc+r cos α, r sin α), де (xc, yc) - координати центра екрана.

Program ех5_3;

uses crt, graph;

var d, m,      {графічний драйвер і графічний режим}

     x, y,      {координати рухомого кінця}

     r: integer;      {довжина відрізка}

     a: real;      {кут повороту відрізка}

begin

  d:=detect;      {ініціалізація графічного режиму}

  initgraph (d, m, ‘d:\bp\bgi’);

  r:=100;      {ініціалізувати довжину відрізка}

  setbkcolor (15);       {колір фону}

  setcolor (3);        {колір літер та ліній}

  settextstyle (0, 0, 1);      {стиль літер}

  outtextxy (100, 50, ‘Rotational displacement of line’);

  outtextxy (100, 80, ‘Press any key to exit’);

  a:=0;

  repeat

     x:=320+round(cos(a)*r);     {перетворення координат}

     y:=240+round(sin(a)*r);     {рухомого кінця}

     setcolor (5);      {відображення відрізка}

     line (320, 240, x, y);

     delay (2000);      {затримка}

     setcolor (15);      {затирання відрізка}

     line (320, 240, x, y);

     a:=a+pi/36;      {збільшення кута повороту}

  until keypressed;

end.

Контрольні питання

1. Зображення текстової інформації у графічному режимі

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

3. Перетворення координат і об'єктів


 

А также другие работы, которые могут Вас заинтересовать

56469. Подвижные игры 96.5 KB
  Коммуникативная компетенция Умение педагога взаимодействовать с детьми младшего школьного возраста в рамках учебного процесса. Личностная компетенция...
56470. Толерантність врятує світ. Виховна година 64 KB
  Ваша думка для мене глибоко ворожа але за ваше право її висловити я ладен віддати своє життя. Вольтер Мета заходу: вміти пояснювати поняття толерантність; розповідати про значення толерантності в житті людей...
56471. ЗРОБИ КРОК НАЗУСТРІЧ 47 KB
  Мета: дати теоретичне уявлення учням про поняття «толерантність», розширити його зміст; закріпити знання учнів про компоненти толерантності; формувати навички ефективного, толерантного спілкування...
56472. Толерантність - ксенофобія 45 KB
  МЕТА: ознайомити десятикласників з поняттям толерантність ксенофобія; вибудувати синонімічний ряд та знайти антоніми до слова толерантність; продемонструвати візуально та аудіально значення слова...