Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Программирование на языке Си. Методические рекомендации и задачи по программированию

.pdf
Скачиваний:
0
Добавлен:
09.08.2026
Размер:
457 Кб
Скачать

OSI();

PLOSK(3);

}

theta=0.0;

thinc=0.01;

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

{

theta=theta+thinc;

Vector(3,1);

delay(100);

cleardevice();

OSI();

PLOSK(3);

}

Tx=0.0;

Ty=0.0;

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

{

Tx=Tx+0.1;Ty=Ty-0.1; V_ector(3); delay(100); cleardevice();

OSI();

PLOSK(3); } // Init();

Sx=1;

Sy=1;

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

{

Sx=Sx-0.002;Sy=Sy-0.002; V_ecto_r(3);

delay(100);

cleardevice();

OSI();

PLOSK(3);

}

}

141

Задача 5.2

Растяжение и сжатие трехмерного пространства, вращение трехмерного объекта, удаление невидимых линий.

//Рисуется октаэдр, его можно вращать, используя клавиши 1..9 #include <IOSTREAM.H>

#include <graphics.h> #include <stdlib.h> #include <stdio.h> #include <conio.h> #include <complex.h> #include <math.h> #include <dos.h> float map=50;

float x[9],y[9],z[9]; float xc[9],yc[9]; int Gd,Gm,i;

float v,psi,fi,a11,a12,a13,a21,a22,a23,a31,a32,a33; int launch[9][4];

float vertical,horizontal; char ch;

float cc,butco,erco; long msx,msy;

int lb,rb,tb;

float moverx,movery;

float gx(float a,float b,float c); float gy(float a,float b,float c); void normalize(void);

void launcher(void);

void subcounter(int x,int y,int z,float &x1,float &y1,float &z1,

float fi,float psi); float normal(int a,int b,int c,float x[9],float y[9],float z[9],float &v);

float gx(float a,float b,float c)

{

float x; x=320+a*100+c*sqrt(0.5)*100;

142

return x;

}

float gy(float a,float b,float c)

{

float y; y=250+b*100+c*sqrt(0.5)*100; return y;

}

void normalize(void)

{

for(i=1;i<9;i++)

{

xc[i]=gx(x[i],y[i],z[i]);

yc[i]=gy(x[i],y[i],z[i]);

}

}

void launcher(void)

{

moverx=0.05;

movery=0.05;

launch[1][1]=1; launch[1][2]=1; launch[1][3]=1; launch[2][1]=1; launch[2][2]=0-1; launch[2][3]=1; launch[3][1]=1; launch[3][2]=0-1; launch[3][3]=0-1; launch[4][1]=1; launch[4][2]=1; launch[4][3]=0-1; launch[5][1]=0-1; launch[5][2]=1; launch[5][3]=1; launch[6][1]=0-1; launch[6][2]=0-1; launch[6][3]=1; launch[7][1]=0-1; launch[7][2]=0-1; launch[7][3]=0-1; launch[8][1]=0-1; launch[8][2]=1; launch[8][3]=0-1;

}

void subcounter(int x,int y,int z,float &x1,float &y1,float &z1,

float fi,float psi)

{

a11=cos(psi); a12=sin(fi)*sin(psi); a13=0; a21=0; a22=cos(fi); a23=0; a31=sin(psi); a32=0-cos(psi)*sin(fi); a33=0;

x1=a11*x+a21*y+a31*z;

143

y1=a12*x+a22*y+a32*z;

z1=a13*x+a23*y+a33*z;

}

float normal(int a,int b,int c,float x[9],float y[9],float z[9],float &v)

{

float a1,a2,b1,b2,c1,c2,n,m; a1=x[a]-x[b]; b1=y[a]-y[b]; c1=z[a]-z[b]; a2=x[a]-x[c]; b2=y[a]-y[c]; c2=z[a]-z[c]; n=b1*c2-c1*b2; m=c1*a2-a1*c2; v=a1*b2-a2*b1;

if ((x[a]*n+y[a]*m+z[a]*v)<0){v=0-v;} return v;

}

void drawcub(void)

{

int cnt; float v;

for(cnt=1;cnt<9;cnt++){

subcounter(launch[cnt][1],launch[cnt][2],launch[cnt][3],x[cnt],

y[cnt],z[cnt],fi,psi);}

normalize();

v=normal(8,5,4,x,y,z,v); if (v<=0)

{

line(xc[5],yc[5],xc[8],yc[8]);

line(xc[8],yc[8],xc[4],yc[4]);

line(xc[1],yc[1],xc[4],yc[4]);

line(xc[1],yc[1],xc[5],yc[5]);

};

v=normal(2,1,3,x,y,z,v); if (v>=0)

{

line(xc[1],yc[1],xc[2],yc[2]);

line(xc[2],yc[2],xc[3],yc[3]);

line(xc[3],yc[3],xc[4],yc[4]);

line(xc[1],yc[1],xc[4],yc[4]);

}

v=normal(1,2,5,x,y,z,v);

144

if (v>=0)

{

line(xc[1],yc[1],xc[5],yc[5]);

line(xc[5],yc[5],xc[6],yc[6]);

line(xc[6],yc[6],xc[2],yc[2]);

line(xc[1],yc[1],xc[2],yc[2]);

}

v=normal(4,3,8,x,y,z,v); if (v<=0)

{

line(xc[3],yc[3],xc[4],yc[4]);

line(xc[8],yc[8],xc[4],yc[4]);

line(xc[8],yc[8],xc[7],yc[7]);

line(xc[7],yc[7],xc[3],yc[3]);

}

v=normal(8,5,7,x,y,z,v); if (v>=0)

{

line(xc[5],yc[5],xc[8],yc[8]);

line(xc[8],yc[8],xc[7],yc[7]);

line(xc[7],yc[7],xc[6],yc[6]);

line(xc[6],yc[6],xc[5],yc[5]);

}

v=normal(3,2,7,x,y,z,v); if (v<=0)

{

line(xc[2],yc[2],xc[3],yc[3]);

line(xc[3],yc[3],xc[7],yc[7]);

line(xc[7],yc[7],xc[6],yc[6]);

line(xc[6],yc[6],xc[2],yc[2]);

}

}

void main(void)

{

int x,y;

int gdriver = DETECT, gmode, errorcode; int midx, midy;

initgraph(&gdriver, &gmode, "");

145

horizontal=1; vertical=1; launcher();movery=0;moverx=0; for(;;)

{

if (ch=='\x0'){ ch=getch();} if (ch=='\x1B'){ break; }

if (ch=='8'){movery = -0.05; moverx=0;} if (ch=='4'){moverx = 0.05; movery=0;} if (ch=='2'){movery = 0.05; moverx=0;} if (ch=='6'){moverx = -0.05; movery=0;}

if (ch=='7'){movery = -0.05; moverx=-0.05;} if (ch=='9'){moverx = 0.05; movery=0.05;} vertical=vertical+movery; horizontal=horizontal+moverx;

psi = horizontal; fi = vertical; setcolor(14); drawcub(); ch=getch(); setcolor(0); drawcub();

}

getch();

closegraph();

}

Задача 5.3

//Синхронное вращение трех октаэдров клавишами 1..9

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

146

float map=50; float x[9],y[9],z[9]; float xc[9],yc[9]; int Gd,Gm,i;

float v,psi,fi,a11,a12,a13,a21,a22,a23,a31,a32,a33; int launch[9][4];

float vertical,horizontal; char ch;

float cc,butco,erco; long msx,msy;

int lb,rb,tb;

float moverx,movery;

float gx(float a,float b,float c); float gy(float a,float b,float c); void normalize(void);

void launcher(void);

void subcounter(int x,int y,int z,float &x1,float &y1,float &z1,

float fi,float psi); float normal(int a,int b,int c,float x[9],float y[9],float z[9],float &v);

float gx(float a,float b,float c)

{

float x; x=320+a*50+c*sqrt(0.5)*50+b; return x;

}

float gy(float a,float b,float c)

{

float y; y=250+b*50+c*sqrt(0.5)*50+a; return y;

}

void normalize(void)

{

for(i=1;i<9;i++)

{

xc[i]=gx(x[i],y[i],z[i]);

147

yc[i]=gy(x[i],y[i],z[i]);

}

}

void launcher(void)

{

moverx=0.05;

movery=0.05;

launch[1][1]=1; launch[1][2]=1; launch[1][3]=1; launch[2][1]=1; launch[2][2]=0-1; launch[2][3]=1; launch[3][1]=1; launch[3][2]=0-1; launch[3][3]=0-1; launch[4][1]=1; launch[4][2]=1; launch[4][3]=0-1; launch[5][1]=0-1; launch[5][2]=1; launch[5][3]=1; launch[6][1]=0-1; launch[6][2]=0-1; launch[6][3]=1; launch[7][1]=0-1; launch[7][2]=0-1; launch[7][3]=0-1; launch[8][1]=0-1; launch[8][2]=1; launch[8][3]=0-1;

}

void subcounter(int x,int y,int z,float &x1,float &y1,float &z1,

float fi,float psi)

{

a11=cos(psi); a12=sin(fi)*sin(psi); a13=0; a21=0; a22=cos(fi); a23=0;

a31=sin(psi); a32=0-cos(psi)*sin(fi);a33=0; x1=a11*x+a21*y+a31*z; y1=a12*x+a22*y+a32*z; z1=a13*x+a23*y+a33*z;

}

float normal(int a,int b,int c,float x[9],float y[9],float z[9],float &v)

{

float a1,a2,b1,b2,c1,c2,n,m; a1=x[a]-x[b]; b1=y[a]-y[b]; c1=z[a]-z[b]; a2=x[a]-x[c]; b2=y[a]-y[c]; c2=z[a]-z[c]; n=b1*c2-c1*b2; m=c1*a2-a1*c2; v=a1*b2-a2*b1;

if ((x[a]*n+y[a]*m+z[a]*v)<0){v=0-v;} return v;

}

148

void drawcub(int L,int L1,int L2,int L3,int L4,int L5,int L6)

{

int cnt; float v;

int poly[8],pol[8]; for(cnt=1;cnt<9;cnt++){

subcounter(launch[cnt][1],launch[cnt][2],launch[cnt][3],x[cnt],

y[cnt],z[cnt],fi,psi);}

normalize();

v=normal(8,5,4,x,y,z,v); if (v<=0)

{

line(xc[5],yc[5],xc[8],yc[8]);

line(xc[8],yc[8],xc[4],yc[4]);

line(xc[1],yc[1],xc[4],yc[4]);

line(xc[1],yc[1],xc[5],yc[5]); poly[0] = xc[5];

poly[1] =yc[5]; poly[2] = xc[8]; poly[3] = yc[8]; poly[4] = xc[4]; poly[5] = yc[4]; poly[6] = xc[1]; poly[7] = yc[1];

setfillstyle(3, L); fillpoly(4, poly); poly[0] = xc[5]+25;

poly[1] =yc[5]+25; circle(xc[5]+25,yc[5]+25,15);circle(xc[5]+25,yc[5]+25,5); circle(xc[5]+25,yc[5]+25,3);

poly[2] = xc[8]+25; poly[3] = yc[8]+25;

circle(xc[8]+25,yc[8]+25,15);circle(xc[8]+25,yc[8]+25,5);

circle(xc[8]+25,yc[8]+25,3); poly[4] = xc[4]+25;

poly[5] = yc[4]+25; circle(xc[4]+25,yc[4]+25,15);circle(xc[4]+25,yc[4]+25,5); circle(xc[4]+25,yc[4]+25,3);

149

poly[6] = xc[1]+25; poly[7] = yc[1]+25;

circle(xc[1]+25,yc[1]+25,15);circle(xc[1]+25,yc[1]+25,5);

circle(xc[1]+25,yc[1]+25,3); setfillstyle(1, L); fillpoly(4, poly);

pol[0] = xc[5]+150; pol[1] =yc[5]+150; pol[2] = xc[8]+150; pol[3] = yc[8]+150; pol[4] = xc[4]+150; pol[5] = yc[4]+150; pol[6] = xc[1]+150; pol[7] = yc[1]+150;

setfillstyle(1, L); fillpoly(4, pol);

pol[0] = xc[5]-150; pol[1] =yc[5]-150; pol[2] = xc[8]-150; pol[3] = yc[8]-150; pol[4] = xc[4]-150; pol[5] = yc[4]-150; pol[6] = xc[1]-150; pol[7] = yc[1]-150;

setfillstyle(1, L); fillpoly(4, pol);

};

v=normal(2,1,3,x,y,z,v); if (v>=0)

{

line(xc[1],yc[1],xc[2],yc[2]);

line(xc[2],yc[2],xc[3],yc[3]);

line(xc[3],yc[3],xc[4],yc[4]);

line(xc[1],yc[1],xc[4],yc[4]); poly[0] = xc[1];

poly[1] =yc[1]; poly[2] = xc[2]; poly[3] = yc[2];

150

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]