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

Лабы / Labs 2004 / LABOR5 / VAR12

.CPP
Скачиваний:
21
Добавлен:
16.04.2013
Размер:
9.6 Кб
Скачать
//Ї®бв஥­ЁҐ Ї®ўҐае­®бвЁ ЃҐ§мҐ

#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();

}
Соседние файлы в папке LABOR5