Программирование на языке Си. Методические рекомендации и задачи по программированию
.pdfOSI();
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
