При изображении плоских объектов возможна ситуация, при которой реальные
размеры объектов несовместимы с экранной системой координат. В этом случае, к
произвольной прямоугольной плоской области, стороны которой параллельны осям
координат, называемой (вещественным) окном, привязывается прямоугольная область
экрана - область вывода. В приведенном ниже примере окно ограничено прямыми
x=xmin, x=xmax, y=ymin, y=ymax , а областью вывода является весь экран. Точка
(xmin, ymin) отображается в нижнем левом углу экрана, а точка
(xmax, ymax) - в правом верхнем. Каждому пикселу экрана соответствует
прямоугольник в окне, имеющий размеры
, .
Таким образом, координаты пиксела можно вычислить по формулам
, .
При выводе графика функции y=f(x) можно использовать два подхода:
построение точечных графиков и построение
кусочно-линейных графиков . В первом случае, на экран
выводятся точки с координатами (x,y) , где y=f(x) , а во
втором случае две соседние точки графика соединяются отрезком прямой.
Фактически, во втором случае строится интерполяционный линейный сплайн. Как
правило, в первом случае используется функция putpixel , а во втором-функция
line . В дальнейшем мы будем строить только кусочно-линейные графики.
Код на C++ #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));} void main() { int graphdriver= DETECT, graphmode, n; float x,y; // Инициализация графического режима: initgraph(&graphdriver,&graphmode,""); // Запрос параметров: 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(LIGHTGRAY); // Установка цвета для вывода осей 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(WHITE); // Установка цвета для графика функции // Вывод графика функции 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 (); // Выход из графического режима }
|