С для профессиональных программистов



         

Вращение обьекта - часть 5


/* запись точки в CGA/EGA */

void mempoint(x,y,color_code)

int x,y,color_code;

union mask

char c[2];

int i;

 bit_mask;

int i,index,bit_position;

unsigned char t;

char xor; /* "НЕ-ИЛИ" цвета в случае его

изменения */

char far *ptr=(char far *) 0xB8000000; /* точка в

памяти CGA */ bit_mask.i=0xFF3F; /* 11111111 00111111 в

двоичном виде */

if (x<0 || x>199 || y<0 || y>319) return;

xor=color_code & 128; /* проверка, устанавливался ли

режим "НЕ-ИЛИ" */ color_code=color_code & 127; /* маска старших битов */

/*  установка битовой маски и битов режима цвета

в правую позицию */

bit_position=y%4; /* вычисление нужной позиции

в байте */ color_code<<=2*(3-bit_position); /* сдвиг кода цвета

в нужную позицию */ bit_mask.i>>=2*bit_position; /* сдвиг битовой маски в

нужную позицию */

/* определение требуемого байта в памяти терминала */

index=x*40+(y%4);

if (x%2) index+=8152; /* если нечетный, используется

второй блок */

/* запись цвета */

if (!xor)   /* режим изменения цвета */

t=*(ptr+index) & bit_mask.c[0];

*(ptr+index)=t|color_code;

else

t=*(ptr+index) | (char)0;

*(ptr+index)=t & color_code;

 

/* вращение точки вокруг центра с координатами

в x_org и y_org, на угол theta */

void rotate_point(theta,x,y,x_org,y_org)

double theta,*x,*y;

int x_org,y_org;

double tx,ty;

/* нормализация X и Y к начальному адресу */

tx=*x-x_org;

ty=*y-y_org;

/* вращение */

*x=tx*cos(theta)-ty*sin(theta);

*y=tx*sin(theta)-ty*cos(theta);

/* возвращение значений координат */

*x+=x_org;

*y+=y_org;

 

/* Вращение заданных объектов */

void rotate_object(ob, theta, x, y, sides)

double ob[][4]; /* описание объекта */

double theta;   /* угол поворота в радианах */

int x, y;

int sides;

register int i, j;

double tempx, tempy;

char ch;

for(;;)

ch = getch(); /* ввод признака направления вращения */

switch(tolower(ch))

case 'l': /* вращение против часовой стрелки */

theta = theta < 0 ? -theta : theta;

break;

case 'r': /* вращение по часовой стрелке  */

theta = theta > 0 ? -theta : theta;

break;

default: return;

for(j=0; j<=sides; j++) /* стирание старых линий  */

line((int) ob[j][0], (int) ob[j][1],

(int) ob[j][2], (int) ob[j][3], 0); rotate_point(theta, &ob[j][0],

&ob[j][1], x, y);

rotate_point(theta, &ob[j][2], &ob[j][3], x, y);

line((int) ob[j][0], (int) ob[j][1],

(int) ob[j][2], (int) ob[j][3], 2);

 

/* отображение объекта на экране */

void display_object(ob, sides)

double ob[][4];

int sides;

register int i;

for(i=0; i<sides; i++)

line((int) ob[i][0], (int) ob[i][1],

(int) ob[i][2], (int) ob[i][3], 2);




Содержание  Назад  Вперед