Наиболее часто употребляемыми графическими функциями являются функции вывода прямолинейных отрезков. Вывод отрезка можно производить, задавая координаты (x0, y0) начала и координаты (x1,y1) конца отрезка: voidline(intx0,inty0,intx1,inty1). Например, после вызова функции
line(0,0,getmaxx(),getmaxy());
будет выведена прямая линия, соединяющая левый верхний угол экрана с правым нижним.
Существует некоторая пара чисел, называемая CP, в которых хранятся координаты текущей позиции вывода. После вызова функции initgraph эти координаты устанавливаются в 0. Координаты текущей позиции вывода могут быть вычислены с помощью функций intgetx(void); intgety(void). Координаты (xСР,yСР) текущей позиции CP используются для вывода отрезка в следующих функциях: voidlineto(intx,inty), voidlinerel(intdx,intdy). Функция lineto соединяет прямолинейным отрезком точку (xСР,yСР) с точкой (x,y). При этом точка CP перемещается в точку (x,y). Функция linerel соединяет точку (xСР,yСР) с точкой (xСР+dx, yСР+dy). Текущая позиция CP переносится в точку (xСР+dx,yСР+dy).
Установка текущей позиции производится с помощью функций voidmoveto(intx,inty), voidmoverel(intdx,intdy).
Функция moveto(x,y) переносит CP в точку (x,y), а функция moverel(dx,dy) — в точку (xСР +dx , yСР +dy ).
Координаты CP можно вычислить с помощью функций intgetx(void), intgety(void), возвращающих x и y — координаты точки CP.
Существуют два различных режима вывода точек отрезка, которые устанавливаются с помощью функции voidsetwritemode(intmode).
Если параметр mode равен нулю, то точки отрезка просто накладываются на изображение на экране (а точнее — в активной странице). Если параметр mode=1, то цвет каждой точки отрезка складывается поразрядно по модулю 2 с цветом соответствующей точки экрана (активной страницы) и результат будет новым цветом этой точки экрана.
Пример 1.3. Выводится отрезок, вращающийся вокруг одного из своих концов. Здесь для сравнения траектории конца отрезка с круговой траекторией мы выведем окружность. Функция вывода окружности в графической библиотеке Турбо Си описывается как voidcircle(intx,inty,intradius), где (x,y) — координаты центра, а radius — радиус окружности в пикселях по оси абсцисс.
#include <stdio.h>
#include <graphics.h>
#include <math.h>
#include <conio.h>
#include <stdlib.h>
#include <dos.h>
main()
{
int gdriver=DETECT, gmode;
float x0, y0; // координаты центра вращения
float x1, y1, x, y;
float cos_teta, sin_teta=0.01;
int xasp, yasp;
float r=100;
cos_teta=sqrt(1-sin_teta*sin_teta);
// Инициализация графического режима
initgraph (&gdriver, &gmode, "D:\BC\BGI") ;
if (graphresult()!=grOk)
{
printf("nGraphics error");
getch();
exit(1);
}
// Создание звездного неба
cleardevice();
randomize();
while (!kbhit())
{
putpixel (random(getmaxx()),random(getmaxy()),random(getmaxcolor()));
}
// Ожидание нажатия любой клавиши
getch() ;
x0=getmaxx()/2; y0=getmaxy()/2;
x1=x0+r; y1=y0;
getaspectratio(&xasp, &yasp);
// Установка режима XOR_PUT
setwritemode(XOR_PUT);
// Вывод окружности
circle(x0, y0, x1-x0);
// Вывод вращающегося отрезка
line(x0,y0,x1,(y1-y0)*xasp/yasp+y0);
do
{
line(x0,y0,x1,y*xasp/yasp+y0) ;
x=(x1-x0)*cos_teta+(y1-y0)*sin_teta+x0;
y=(x1-x0)*(-sin_teta)+(y1-y0)*cos_teta;
y1=y+y0;
x1=x;
line(x0,y0,x1,y*xasp/yasp+y0);
// Временная приостановка работы программы
delay (20);
} while(!kbhit());
getch();
closegraph();
}