1.5. Преобразование координат

При изображении плоских объектов возможна ситуация, при которой реальные размеры объектов несовместимы с экранной системой координат. В этом случае, к произвольной прямоугольной плоской области, стороны которой параллельны осям координат, называемой (вещественным) окном, привязывается  прямоугольная область экрана — область вывода. В приведенном ниже примере окно ограничено прямыми 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 ();    // Выход из графического режима

}

Результат  работы программы