Хочешь добавить в свою простую программу немерянной красоты и при этом не истоптать пальцы об клавиатуру, тогда читай дальше. Красота, будет хоть и немерянной, но достаточно простой. В первой программе показан пример имитации вращения вокруг одной оси двух пирамид. Математическая подоплека алгоритма строится на параметрически заданном уравнении эллипса:

X=Xmax*COS(W*t),
Y=Ymax*SIN(W*t).

Здесь X,Y — физические координаты точки; Xmax,Ymax — полуоси эллипса (если одинаковые, то будет окружность ); W — циклическая частота вращения точек; t — время. W*t — имеет размерность угла, чем и является на самом деле, в некоторых книгах этот угол называют фазой, имейте ввиду, что полный оборот точка совершит когда значение фазы изменится на 2π.

Алгоритм предельно прост: в цикле вычисляем координаты для каждой узловой точки с соответствующим сдвигом по фазе, правильно соединяем точки линиями, в конце цикла поставлена задержка, что бы в секунду рисовалось не больше 25 кадров.

Сама программа:

#include <graphics.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>
#include <dos.h>

void main()
{
int gdriver = DETECT, gmode,gerr;
int x11,y11,x12,y12,x13,y13,x14,y14;
int x21,y21,x22,y22,x23,y23,x24,y24;
float t,omega=8;
int xc1,yc1,xc2,yc2;
float pi=3.141592;

//инициализация графики
initgraph(&gdriver,&gmode,"c:\\tcpp\\bgi");
gerr=graphresult();
if (gerr != grOk)
{
printf("Ошибка BGI: %s\n",grapherrormsg(gerr));
exit(gerr);
}

int r=getmaxy()/4;
xc1=getmaxx()/4;
xc2=3*getmaxx()/4;
yc1=yc2=getmaxy()/2;
setcolor(WHITE);
setfillstyle(SOLID_FILL,BLUE);

//анимация
t=0.01;
do{

//все стерли
bar(xc1-r/4,r,xc2+r/4,3*r);

//вычисляем координаты
x11=xc1+(r/4)*cos(omega*t);
y11=yc1+r*sin(omega*t);
x12=xc1+(r/4)*cos(omega*t+pi/2);
y12=yc1+r*sin(omega*t+pi/2);
x13=xc1+(r/4)*cos(omega*t+pi);
y13=yc1+r*sin(omega*t+pi);
x14=xc1+(r/4)*cos(omega*t-pi/2);
y14=yc1+r*sin(omega*t-pi/2);
x21=xc2+(r/4)*cos(omega*t+pi);
y21=yc2+r*sin(omega*t+pi);
x22=xc2+(r/4)*cos(omega*t-pi/2);
y22=yc2+r*sin(omega*t-pi/2);
x23=xc2+(r/4)*cos(omega*t);
y23=yc2+r*sin(omega*t);
x24=xc2+(r/4)*cos(omega*t+pi/2);
y24=yc2+r*sin(omega*t+pi/2);

//рисуем ребра
line(x11,y11,x21,y21);
line(x12,y12,x22,y22);
line(x13,y13,x23,y23);
line(x14,y14,x24,y24);

//основание левой пирамиды
line(x11,y11,x12,y12);
line(x12,y12,x13,y13);
line(x13,y13,x14,y14);
line(x14,y14,x11,y11);

//основание правой пирамиды
line(x21,y21,x22,y22);
line(x22,y22,x23,y23);
line(x23,y23,x24,y24);
line(x24,y24,x21,y21);

delay(1000/25);
t+=0.005;
}while (!kbhit());
getch();
closegraph();
}

Программа компилировалась в среде ТС 3.0. Скомпилируйте и посмотрите, как вращается фигура. (Кому лениво компилировать скачайте отсюда исполнимый файл). В зависимости от настроения, времени суток и просто от направления взгляда вращение будет происходить то по часовой стрелке то против, иногда пирамидки крутятся в разные стороны. Не пугайтесь, с головой все в порядке: мозгу не достает информации о пространственном расположении фигур и поэтому он подстраивает восприятие каждый раз по-разному. В следующий раз покрутим фигуры с учетом перспективы и прочих вещей.

Hosted by uCoz