Программирование. Принципы и практика использования C++ Исправленное издание, стр. 200
15.1. Введение
15.2. Построение простых графиков
Начнем. Рассмотрим примеры того, что мы можем нарисовать и как это реализовать в программе. В частности, посмотрим на классы графического интерфейса: мы видим параболу, горизонтальную и наклонную линии.

На самом деле, поскольку эта глава посвящена графическим функциям, данная горизонтальная линия — это не просто какая-то горизонтальная линия, а график функции, представленной ниже.
double one(double) { return 1; }Это самая простая функция, которую мы могли себе представить: она имеет один аргумент и всегда возвращает
1xone()y1(x,y)==(x,1)xКак любая вступительная математическая аргументация, наши рассуждения выглядят несколько тривиальными и педантичными, поэтому перейдем к более сложному примеру.
double slope(double x) { return x/2; }Эта функция порождает наклонную линию. Для каждого аргумента
xyx/2(x,y)==(x,x/2)(2,1)Теперь можем попытаться сделать кое-что интересное. Напишем квадратичную функцию, которая регулярно будет упоминаться в нашей книге.
double square(double x) { return x*x; }Если вы помните школьную геометрию (и даже если забыли), то поймете, что эта функция определяет параболу, симметричную относительно оси y, а ее самая нижняя точка имеет координаты
(0,0)(x,y)==(x,x*x)(0,0)Ниже приведен фрагмент кода, который рисует три указанные выше линии.
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();Сначала определяем несколько констант, чтобы не перегружать нашу программу “магическими константами”. Затем создаем окно, определяем функции, связываем их с окном и передаем контроль графической системе, которая выполняет реальное рисование на экране.
Все это делается по шаблону, за исключением определений трех объектов класса
Functionss2s3Function 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);Каждый объект класса
FunctiondoubledoublexorigFunction(0,0)
Text