При изображении плоских объектов возможна ситуация, при которой реальные размеры объектов несовместимы с экранной системой координат. В этом случае, к произвольной прямоугольной плоской области, стороны которой параллельны осям координат, называемой (вещественным) окном, привязывается прямоугольная область экрана — область вывода. В приведенном ниже примере окно ограничено прямыми x=xmin, x=xmax, y=ymin, y=ymax, а областью вывода является весь экран. Точка (xmin,ymin) отображается в нижнем левом углу экрана, а точка (xmax,ymax) — в правом верхнем. Каждому пикселу экрана соответствует прямоугольник в окне, имеющий размеры
,
.
Таким образом, координаты пиксела можно вычислить по формулам
,
.
При выводе графика функции y=f(x) можно использовать два подхода: построение точечных графиков и построение кусочно-линейных графиков. В первом случае, на экран выводятся точки с координатами (x,y), где y=f(x), а во втором случае две соседние точки графика соединяются отрезком прямой. Фактически, во втором случае строится интерполяционный линейный сплайн. Как правило, в первом случае используется функция putpixel, а во втором-функция line. В дальнейшем мы будем строить только кусочно-линейные графики.
Программа
#include <graphics.h>
#include <math.h>
#include <conio.h>
#include <stdio.h>
float xmin, xmax; // Область изменения x
float ymin, ymax; // Область изменения y
float hx; // Шаг
float xdens, ydens;
// Вычисление экранной x координаты
int ex(float x,float y)
{return (int) ((x-xmin)/xdens);}
// Вычисление экранной y координаты
int ey(float x,float y)
{return (int) ((ymax-y)/ydens);}
// Функция y=f(x)
float f(float x) {return (float)(x*sin(x));}
main()
{
int graphdriver= DETECT, graphmode, n=100;
float x,y;
// Инициализация графического режима:
initgraph(&graphdriver,&graphmode,"C:\BC\BGI");
// Запрос параметров:
gotoxy(40,20);
printf(" Enter please parameter n ");
scanf("%d",&n);
gotoxy(40,21);
printf(" Enter xmin xmax ");
scanf("%f%f",&xmin,&xmax);
gotoxy(40,22);
printf(" Enter ymin ymax ");
scanf("%f%f",&ymin,&ymax);
// Очистка области запросов
gotoxy(40,20);
printf(" ");
gotoxy(40,21);
printf(" ");
gotoxy(40,22) ;
printf(" ");
xdens=(xmax-xmin)/getmaxx(); //Вычисление коэффициента масштабирования по x
ydens=(ymax-ymin)/getmaxy(); //Вычисление коэффициента масштабирования по y
hx=(xmax-xmin)/n; // Вычисление шага
setcolor(7); // Установка цвета для вывода осей
line(ex(xmin,0), ey(xmin,0), ex(xmax,0), ey(xmax,0)); // Вывод оси X
line(ex(0,ymax), ey(0,ymax), ex(0,ymin), ey(0,ymin)); // Вывод оси Y
gotoxy(39,2); printf("Y"); // Вывод подписи оси Y
gotoxy(78,16); printf("X"); // Вывод подписи оси X
gotoxy(39,16); printf("0"); // Вывод 0 в начале координат
// Вывод стрелок
line(ex(0,ymax),ey(0,ymax),ex(0,ymax)-3,ey(0,ymax)+8);
line(ex(0,ymax),ey(0,ymax),ex(0,ymax)+3,ey(0,ymax)+8);
line(ex(xmax,0),ey(xmax,0),ex(xmax,0)-8,ey(xmax,0)+3);
line(ex(xmax,0),ey(xmax,0),ex(xmax,0)-8,ey(xmax,0)-3);
setcolor(15); // Установка цвета для графика функции
// Вывод графика функции x*sin(x)
for(x=xmin;x<xmax;x+=hx)
line(ex(x,f(x)),ey(x,f(x)), ex(x+hx, f(x+hx)), ey(x+hx, f(x+hx)));
gotoxy (1 , 1); printf("function x*sin(x)"); // Вывод подписи
getch(); // Ожидание нажатия любой клавиши
closegraph (); // Выход из графического режима
}
Результат работы программы