1.2. Вывод прямолинейного отрезка

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

}