Читаем Программирование полностью

Ниже приведен фрагмент кода, который рисует три указанные выше линии.


const int xmax = 600;      // размер окна

const int ymax = 400;


const int x_orig = xmax/2; // точка (0,0) — это центр окна

const int y_orig = ymax/2;

const Point orig(x_orig,y_orig);


const int r_min = –10;     // диапазон [–10:11)

const int r_max = 11;


const int n_points = 400;  // количество точек в диапазоне


const int x_scale = 30;    // масштабные множители

const int y_scale = 30;


Simple_window win(Point(100,100),xmax,ymax,"Function graphing");

Function s(one,r_min,r_max,orig,n_points,x_scale,y_scale);

Function s2(slope,r_min,r_max,orig,n_points,x_scale,y_scale);

Function s3(square,r_min,r_max,orig,n_points,x_scale,y_scale);


win.attach(s);

win.attach(s2);

win.attach(s3);

win.wait_for_button();


Сначала определяем несколько констант, чтобы не перегружать нашу программу “магическими константами”. Затем создаем окно, определяем функции, связываем их с окном и передаем контроль графической системе, которая выполняет реальное рисование на экране.

Все это делается по шаблону, за исключением определений трех объектов класса Function: s, s2 и s3.


Function s(one,r_min,r_max,orig,n_points,x_scale,y_scale);

Function s2(slope,r_min,r_max,orig,n_points,x_scale,y_scale);

Function s3(square,r_min,r_max,orig,n_points,x_scale,y_scale);


Каждый объект класса Function определяет, как их первый аргумент (функция с одним аргументом типа double, возвращающая значение типа double) будет нарисован в окне. Второй и третий аргументы задают диапазон изменения переменной x (аргумента изображаемой функции). Четвертый аргумент (в данном случае orig) сообщает объекту класса Function, в каком месте окна расположено начало координат (0,0).

  Если вы считаете, что в таком количестве аргументов легко запутаться, то мы не станем спорить. В идеале аргументов должно быть как можно меньше, поскольку большое количество аргументов сбивает с толку и открывает возможности для ошибок. Однако пока мы не можем обойтись без них. Смысл последних трех аргументов мы объясним в разделе 15.3, а пока заметим, что первый из них задает метку графика.

  Мы всегда стараемся сделать так, чтобы графики были понятны без дополнительных разъяснений. Люди не всегда читают текст, окружающий рисунок, поэтому он часто оказывается бесполезным. Все, что мы изображаем на рисунках, должно помочь читателям понять его. В данном случае мы просто ставим на каждом графике метку. Код для создания метки задается тремя объектами класса Text (см. раздел 13.11).


Text ts(Point(100,y_orig–40),"one");

Text ts2(Point(100,y_orig+y_orig/2–20),"x/2");

Text ts3(Point(x_orig–100,20),"x*x");

win.set_label("Function graphing: label functions");

win.wait_for_button();


С этого момента на протяжении всей главы мы будем пропускать повторяющийся код, связывающий фигуру с окном, присваивающий ей метку и ожидающий щелчка на кнопке Next.



  Тем не менее этот рисунок еще нельзя считать законченным. Мы уже отметили, что наклонная линия x/2 касается параболы x*x в точке (0,0), а график функции one пересекает линию x/2 в точке (2,1), но это известно лишь нам; для того чтобы это стало очевидно читателям, на рисунке следует нанести оси координат.

Код для построения осей состоит из объявлений двух объектов класса Axis (раздел 15.4).


const int xlength = xmax–40; // оси должны быть чуть меньше окна

const int ylength = ymax–40;

Axis x(Axis::x,Point(20,y_orig), xlength,

     xlength/x_scale, "one notch == 1");

Axis y(Axis::y,Point(x_orig, ylength+20),

     ylength, ylength/y_scale, " one notch == 1");



Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже