Добавил:
korayakov
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:
//Ї®бв஥ЁҐ Ї®ўҐае®бвЁ ЃҐ§мҐ
#include <conio.h>
#include <stdio.h>
#include <process.h>
#include <graphics.h>
#include <math.h>
#include <BIOS.h>
union inkey //§¤Ґбм еа Ёвбп Ёд®а¬ жЁп ® ¦ в®© Є« ўЁиҐ
{ //ch[0] -¬« ¤иЁ© Ў ©в, ch[1] -бв аиЁ© Ў ©в
char ch[2]; //ch[1] -Є®¤ бЄ Ёа®ў Ёп Є« ўЁиЁ
int i; //ch[0] -ASCII Є®¤
} c; //i -®ЎкҐ¤ЁҐЁҐ ¤ўге Ў ©в ў б«®ў®
inline double sq(double x)
{
return x*x;
}
double fi,teta,sf,cf,st,ct;
const Ni = 9, Nj = 6;
int Px[Ni][Nj], Py[Ni][Nj], Pz[Ni][Nj]; //иҐбв ¤ж вм в®зҐЄ Ї®ўҐае®бвЁ ЃҐ§мҐ
double Bezie(int i, double t) //зҐвлॠдгЄжЁЁ ЃҐ§мҐ (ЃҐаи⥩ )
{
double b;
double t2 = t*t, t3 = t2*t;
switch(i)
{
case 0: b = (1 - 3*t + 3*t2 - t3)/6; break;
case 1: b = (4 - 6*t2 + 3*t3)/6; break;
case 2: b = (1 + 3*t + 3*t2 - 3*t3)/6; break;
case 3: b = t3/6; break;
// case 0 : b=(1-t)*(1-t)*(1-t); break;
// case 1 : b=3*t*(1-t)*(1-t); break;
// case 2 : b=3*t*t*(1-t); break;
// case 3 : b=t*t*t; break;
default : printf("\nError in function Bezie"); exit(1);
}
return b;
}
double splineX(double u,double v,int n,int m)
{
double S1=0, S2;
int i,j;
for(i=0; i<4; i++)
{
S2=0;
for(j=0; j<4; j++)
S2 += Px[i+n][j+m]*Bezie(j,v);
S1 += S2*Bezie(i,u);
}
return S1;
}
double splineY(double u,double v,int n,int m)
{
double S1=0, S2;
int i,j;
for(i=0; i<4; i++)
{
S2=0;
for(j=0; j<4; j++)
S2 += Py[i+n][j+m]*Bezie(j,v);
S1 += S2*Bezie(i,u);
}
return S1;
}
double splineZ(double u,double v,int n,int m)
{
double S1=0, S2;
int i,j;
for(i=0; i<4; i++)
{
S2=0;
for(j=0; j<4; j++)
S2 += Pz[i+n][j+m]*Bezie(j,v);
S1 += S2*Bezie(i,u);
}
return S1;
}
//double functionZ(double x,double y)
//{
// return 300.*sqrt(1.-(x/300)*(x/300))*sqrt(1.-(y/300)*(y/300));
//}
double Xe(double x,double y)
{
return -sf*x+cf*y;
}
double Ye(double x,double y,double z)
{
return -ct*cf*x-ct*sf*y+st*z;
}
void main()
{
/*
Px[0][0]=0; Py[0][0]=0;
Px[0][1]=0; Py[0][1]=100;
Px[0][2]=0; Py[0][2]=200;
Px[0][3]=0; Py[0][3]=300;
Px[1][0]=100; Py[1][0]=0;
Px[1][1]=100; Py[1][1]=100;
Px[1][2]=100; Py[1][2]=200;
Px[1][3]=100; Py[1][3]=300;
Px[2][0]=200; Py[2][0]=0;
Px[2][1]=200; Py[2][1]=100;
Px[2][2]=200; Py[2][2]=200;
Px[2][3]=200; Py[2][3]=300;
Px[3][0]=300; Py[3][0]=0;
Px[3][1]=300; Py[3][1]=100;
Px[3][2]=300; Py[3][2]=200;
Px[3][3]=300; Py[3][3]=300;
*/
int i,j;
// for(i=1; i<6; i++)
// for(j=1; j<6; j++)
// {
// Px[i][j] = (i-1)*100; Py[i][j] = (j-1)*100;
// }
// for(i=1; i<6; i++)
// for(j=1; j<6; j++)
// Pz[i][j]=functionZ((double)Px[i][j],(double)Py[i][j]);
double aa = 100, bb = 100, cc = 100;
double fifi, zz, rr;
for(i=0; i<Ni-3; i++)
for(j=0; j<Nj; j++)
{
zz = 70*j + cc;
fifi = M_PI/180*60*(i-1);
rr = sqrt(sq(zz/cc)-1);
rr = rr/sqrt(sq(cos(fifi)/aa)+sq(sin(fifi)/bb));
Px[i][j+1] = rr*cos(fifi);
Py[i][j+1] = rr*sin(fifi);
Pz[i][j+1] = zz;
// if(j==1) Pz[i][j] +=20;
}
for(j=0; j<Nj; j++)
{
Px[Ni-3][j] = Px[0][j];
Py[Ni-3][j] = Py[0][j];
Pz[Ni-3][j] = Pz[0][j];
Px[Ni-2][j] = Px[1][j];
Py[Ni-2][j] = Py[1][j];
Pz[Ni-2][j] = Pz[1][j];
Px[Ni-1][j] = Px[2][j];
Py[Ni-1][j] = Py[2][j];
Pz[Ni-1][j] = Pz[2][j];
}
for(i=0; i<Ni; i++)
{
Px[i][0] = 2*Px[i][1] - Px[i][2];
Py[i][0] = 2*Py[i][1] - Py[i][2];
Pz[i][0] = 2*Pz[i][1] - Pz[i][2];
}
/*
for(i=1; i<Ni; i++)
{
Px[i][0] = 2*Px[i][1] - Px[i][2];
Py[i][0] = 2*Py[i][1] - Py[i][2];
Pz[i][0] = 2*Pz[i][1] - Pz[i][2];
}
for(j=1; j<Nj; j++)
{
Px[0][j] = 2*Px[1][j] - Px[2][j];
Py[0][j] = 2*Py[1][j] - Py[2][j];
Pz[0][j] = 2*Pz[1][j] - Pz[2][j];
}
Px[0][0] = 2*Px[1][0] - Px[2][0];
Py[0][0] = 2*Py[1][0] - Py[2][0];
Pz[0][0] = 2*Pz[1][0] - Pz[2][0];
*/
int driver=DETECT;
int mode;
int res;
initgraph(&driver,&mode,"c:\\borlandc\\bgi");
if((res=graphresult())!=grOk)
{
printf("\nGraphics error: %s",grapherrormsg(res));
exit(1);
}
setfillstyle(1,3);
bar(0,0,getmaxx(),getmaxy());
setcolor(12);
outtextxy(5, 7, "Korneev V");
setcolor(15);
outtextxy(150, 7, "Closed becubic B-spline surface (points 9 x 7)");
setcolor(14);
outtextxy(40, 460, "Rotation - arrows,");
outtextxy(230, 460, "Increase - U, Decrease - D,");
outtextxy(500, 460, "Exit - Esc");
setcolor(15);
rectangle(30,30,getmaxx()-30,getmaxy()-30);
setviewport(33,33,getmaxx()-33,getmaxy()-33,1);
clearviewport();
// getch();
int x1,y1,x2,y2;
fi=30;
teta=60;
double scale=0.5;
/*
char ss[20];
sprintf(ss,"fi = %lf",55);
outtextxy(450,50,ss); circle(535,50,2);
sprintf(ss,"teta= %lf",teta);
outtextxy(450,70,ss); circle(535,70,2);
//getch();
*/
//lbl_1:
while(1)
{
sf=sin(M_PI*fi/180);
cf=cos(M_PI*fi/180);
st=sin(M_PI*teta/180);
ct=cos(M_PI*teta/180);
clearviewport();
int N=10;
int Ppx[4][30],Ppy[4][30];
int Ppx1[4][30],Ppy1[4][30];
double u,v,du=1.0/(N-1),dv=1.0/(N-1);
for(int n=0; n<Ni-3; n++)
for(int m=0; m<Nj-3; m++)
{
for(j=0; j<4; j++)
{
v=1.0/3.0*j;
for(i=0; i<N; i++)
{
u=du*i;
x1=(int)(scale*Xe(splineX(u,v,n,m),splineY(u,v,n,m)));
y1=(int)(scale*Ye(splineX(u,v,n,m),splineY(u,v,n,m),splineZ(u,v,n,m)));
Ppy[j][i]=200-y1;
Ppx[j][i]=250+x1;
// putpixel(x1,y1,14);
}
}
for(j=0; j<4; j++)
{
u=1.0/3.0*j;
for(i=0; i<N; i++)
{
v=dv*i;
x1=(int)(scale*Xe(splineX(u,v,n,m),splineY(u,v,n,m)));
y1=(int)(scale*Ye(splineX(u,v,n,m),splineY(u,v,n,m),splineZ(u,v,n,m)));
Ppy1[j][i]=200-y1;
Ppx1[j][i]=250+x1;
// putpixel(x1,y1,12);
}
}
setcolor(14);
for(j=0; j<4; j++)
for(i=0; i<N-1; i++)
line(Ppx[j][i],Ppy[j][i],Ppx[j][i+1],Ppy[j][i+1]);
// putpixel(Ppx[j][i],Ppy[j][i],14);
//getch();
setcolor(12);
for(j=0; j<4; j++)
for(i=0; i<N-1; i++)
line(Ppx1[j][i],Ppy1[j][i],Ppx1[j][i+1],Ppy1[j][i+1]);
// putpixel(Ppx1[j][i],Ppy1[j][i],12);
}
// cleardevice();
setcolor(13);
char ss[20];
sprintf(ss,"fi = %4.0lf",fi);
outtextxy(450,50,ss); circle(535,50,2);
sprintf(ss,"teta= %4.0lf",teta);
outtextxy(450,70,ss); circle(535,70,2);
//getch();
setcolor(11);
x1=(int)Xe(0,0);
y1=(int)Ye(0,0,0);
x2=(int)Xe(220,0);
y2=(int)Ye(220,0,0);
y1=200-y1; y2=200-y2;
x1=250+x1; x2=250+x2;
line(x1,y1,x2,y2);
outtextxy(x2,y2," X");
//getch();
x1=(int)Xe(0,0);
y1=(int)Ye(0,0,0);
x2=(int)Xe(0,220);
y2=(int)Ye(0,220,0);
y1=200-y1; y2=200-y2;
x1=250+x1; x2=250+x2;
line(x1,y1,x2,y2);
outtextxy(x2,y2," Y");
//getch();
x1=(int)Xe(0,0);
y1=(int)Ye(0,0,0);
x2=(int)Xe(0,0);
y2=(int)Ye(0,0,220);
y1=200-y1; y2=200-y2;
x1=250+x1; x2=250+x2;
line(x1,y1,x2,y2);
outtextxy(x2,y2," Z");
//getch();
//getch();
double t, dt;
dt = 1.0/100;
for(n=1; n<3; n++)
{
for(i=0; i<100; i++)
{
t = dt*i;
u = t;
v=t + 0.4*sin(6.28*t);
x1=(int)(scale*Xe(splineX(u,v,n,n),splineY(u,v,n,n)));
y1=(int)(scale*Ye(splineX(u,v,n,n),splineY(u,v,n,n),splineZ(u,v,n,n)));
y1=200-y1;
x1=250+x1;
putpixel(x1,y1,10);
v=t + 0.5*sin(6.28*t);
x1=(int)(scale*Xe(splineX(u,v,n,n),splineY(u,v,n,n)));
y1=(int)(scale*Ye(splineX(u,v,n,n),splineY(u,v,n,n),splineZ(u,v,n,n)));
y1=200-y1;
x1=250+x1;
putpixel(x1,y1,10);
v=t + 0.6*sin(6.28*t);
x1=(int)(scale*Xe(splineX(u,v,n,n),splineY(u,v,n,n)));
y1=(int)(scale*Ye(splineX(u,v,n,n),splineY(u,v,n,n),splineZ(u,v,n,n)));
y1=200-y1;
x1=250+x1;
putpixel(x1,y1,10);
}
}
/*
setcolor(15);
for(i=0; i<Ni-1; i++)
for(j=0; j<Nj-2; j++)
{
x1=(int)(scale*Xe((double)Px[i][j],(double)Py[i][j]));
y1=(int)(scale*Ye((double)Px[i][j],(double)Py[i][j],(double)Pz[i][j]));
x2=(int)(scale*Xe((double)Px[i][j+1],(double)Py[i][j+1]));
y2=(int)(scale*Ye((double)Px[i][j+1],(double)Py[i][j+1],(double)Pz[i][j+1]));
y1=200-y1; y2=200-y2;
x1=250+x1; x2=250+x2;
line(x1,y1,x2,y2);
}
for(j=0; j<Nj-1; j++)
for(i=0; i<Ni-2; i++)
{
x1=(int)(scale*Xe((double)Px[i][j],(double)Py[i][j]));
y1=(int)(scale*Ye((double)Px[i][j],(double)Py[i][j],(double)Pz[i][j]));
x2=(int)(scale*Xe((double)Px[i+1][j],(double)Py[i+1][j]));
y2=(int)(scale*Ye((double)Px[i+1][j],(double)Py[i+1][j],(double)Pz[i+1][j]));
y1=200-y1; y2=200-y2;
x1=250+x1; x2=250+x2;
line(x1,y1,x2,y2);
}
*/
while(!bioskey(1)); //Їа®ўҐапҐв Ґбвм «Ё бЁ¬ў®« ў ЎгдҐаҐ ўў®¤
//дгЄжЁп Ґ ®бв® ў«Ёў Ґв Їа®Ја ¬¬г
c.i=bioskey(0); //ў®§ўа й Ґв Є®¤ ¦ в®© Є« ўЁиЁ (ЇаҐалў ЁҐ 0x14)
//Ё § ЇЁблў Ґв ў ®ЎкҐ¤ЁҐҐ б
//Ґб«Ё ЎгдҐа Їгбв, в® Їа®Ја ¬¬ ®бв ў«Ёў Ґвбп
if(c.ch[0]==0 && c.ch[1]==72) teta += 5; //goto lbl_1; }
if(c.ch[0]==0 && c.ch[1]==80) teta -= 5; // goto lbl_1; }
if(c.ch[0]==0 && c.ch[1]==75) fi += 5; // goto lbl_1; }
if(c.ch[0]==0 && c.ch[1]==77) fi -= 5; //goto lbl_1; }
if(c.ch[0]==117 && c.ch[1]==22) scale += 0.1; // goto lbl_1; }
if(c.ch[0]==100 && c.ch[1]==32) scale -= 0.1; // goto lbl_1; }
if(c.ch[0]==27) break;
}
// getch();
closegraph();
}