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

Лабы / Labs 2004 / LAB7 / BSPL_3D

.CPP
Скачиваний:
22
Добавлен:
16.04.2013
Размер:
5.17 Кб
Скачать
//аЁб㥬 3D - «Ё­Ёо

#include <conio.h>
#include <stdio.h>
#include <process.h>
#include <graphics.h>
#include <math.h>
#include <BIOS.h>
#include <DOS.h>


  union inkey         //§¤Ґбм еа ­Ёвбп Ё­д®а¬ жЁп ® ­ ¦ в®© Є« ўЁиҐ
  {                   //ch[0] -¬« ¤иЁ© Ў ©в, ch[1] -бв аиЁ© Ў ©в
	 char ch[2];       //ch[1] -Є®¤ бЄ ­Ёа®ў ­Ёп Є« ўЁиЁ
	 int i;            //ch[0] -ASCII Є®¤
  } c;                //i -®ЎкҐ¤Ё­Ґ­ЁҐ ¤ўге Ў ©в ў б«®ў®

double Px[4], Py[4], Pz[4];


double Bspl(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 t)
{
  double S=0;
  for(int i=0; i<4; i++)
	 S += Px[i]*Bspl(i,t);
  return S;
}

double splineY(double t)
{
  double S=0;
  for(int i=0; i<4; i++)
	 S += Py[i]*Bspl(i,t);
  return S;
}


double splineZ(double t)
{
  double S=0;
  for(int i=0; i<4; i++)
	 S += Pz[i]*Bspl(i,t);
  return S;
}





double fi,teta,sf,cf,st,ct;

//ЇҐаҐе®¤ ў ўЁ¤®ўго бЁб⥬㠪®®а¤Ё­ в Ё ®ав®Ја дЁзҐбЄ®Ґ Їа®ҐЄвЁа®ў ­ЁҐ
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;
}



//ЇҐаҐў®¤ ўЁ¤®ўле Є®®а¤Ё­ в ў Є®®а¤Ё­ вл ЇЁЄбҐ«Ґ©

//Ј«®Ў «м­лҐ ЇҐаҐ¬Ґ­лҐ
double xe1, xe2, ye1, ye2;
int ne1, ne2, me1, me2;


//ЇҐаҐе®¤ ®в x Є ЇЁЄбҐ«о n
inline int xn(double x)
{
	return (int)((x - xe1)/(xe2 - xe1)*(ne2 - ne1)) + ne1;
}


//ЇҐаҐе®¤ ®в y Є ЇЁЄбҐ«о m
inline int ym(double y)
{
	return (int)((y - ye1)/(ye2 - ye1)*(me2 - me1)) + me1;
}








void main()
{

	Px[0] = 0.6; Py[0] = 0; Pz[0] = 0;
	Px[1] = 0; Py[1] = 0.6; Pz[1] = 0.5;
	Px[2] = -0.6; Py[2] = 0; Pz[2] = 0.3;
	Px[3] = 0; Py[3] = -0.6; Pz[3] = 0.9;

//	Px[0] = 0.5*(Px[1]+Px[2]); Py[0] = 0.5*(Py[1]+Py[2]); Pz[0] = 0.5*(Pz[1]+Pz[2]);

//ђ §¬Ґал ўЁ¤®ў®Ј® ®Є­  (дЁ§ЁзҐбЄЁҐ Є®®а¤Ё­ вл)
//Ё а §¬Ґал ®Є­  ­  нЄа ­Ґ (ЇЁЄбҐ«Ё)
	xe1 = -2; xe2 = 2; ye1 = -2; ye2 = 2;
	ne1 = 150; ne2 = 450; me1 = 350; me2 = 50;

//¬ ЄбЁ¬ «м­лҐ ¤«Ё­л ®бҐ© -¬Ёа®ўлҐ Є®®а¤Ё­ вл
  double xmax=1.2, ymax=1.2, zmax=1.2;


  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);
  }








  double fi1, fi2, rad;
  //Є®®а¤Ё­ вл Їа®ҐЄвЁа㥬®© в®зЄЁ
  double xe, ye;
  //Є®®а¤Ё­ вл ЇЁЄбҐ«®ў
	int x1,y1,x2,y2;

	fi=30, teta=60;   //­ з «м­®Ґ Ї®«®¦Ґ­ЁҐ ўЁ¤®ў®© бЁбвҐ¬л Є®®а¤Ё­ в
lbl_1:
	cleardevice();

	moveto(ne1,me1);
	lineto(ne2,me1);
	lineto(ne2,me2);
	lineto(ne1,me2);
	lineto(ne1,me1);




  char ss[20];
  sprintf(ss,"fi=   %4.0lf",fi);
  outtextxy(550,50,ss);
  sprintf(ss,"teta= %4.0lf",teta);
  outtextxy(550,70,ss);

	//ўлзЁб«Ґ­ЁҐ бЁ­гб®ў Ё Є®бЁ­гб®ў ®аЁҐ­вЁа®ўЄЁ ўЁ¤®ў®© бЁбвҐ¬л Є®®а¤Ё­ в
	sf=sin(M_PI*fi/180);
	cf=cos(M_PI*fi/180);
	st=sin(M_PI*teta/180);
	ct=cos(M_PI*teta/180);

	setcolor(3);

//®бм Ox
		xe=Xe(0,0);
		ye=Ye(0,0,0);
		x1=xn(xe);
		y1=ym(ye);
		xe=Xe(xmax,0);
		ye=Ye(xmax,0,0);
		x2=xn(xe);
		y2=ym(ye);
		line(x1,y1,x2,y2);
		outtextxy(x2,y2," X");

//®бм Oy
		xe=Xe(0,0);
		ye=Ye(0,0,0);
		x1=xn(xe);
		y1=ym(ye);
		xe=Xe(0,ymax);
		ye=Ye(0,ymax,0);
		x2=xn(xe);
		y2=ym(ye);
		line(x1,y1,x2,y2);
		outtextxy(x2,y2," Y");


//®бм Oz
		xe=Xe(0,0);
		ye=Ye(0,0,0);
		x1=xn(xe);
		y1=ym(ye);
		xe=Xe(0,0);
		ye=Ye(0,0,zmax);
		x2=xn(xe);
		y2=ym(ye);
		line(x1,y1,x2,y2);
		outtextxy(x2,y2," Z");
		setcolor(15);



		xe = Xe(Px[0],Py[0]);
		ye = Ye(Px[0],Py[0],Pz[0]);
		x1=xn(xe);
		y1=ym(ye);
		for(int k=1; k<4; k++)
		{
			xe = Xe(Px[k],Py[k]);
			ye = Ye(Px[k],Py[k],Pz[k]);
			x2 = xn(xe);
			y2 = ym(ye);
			line(x1,y1,x2,y2);
			x1 = x2; y1 = y2;
		}

	int J=40;
	double xt, yt, zt, t, dt = 1.0/J;

		for(int j=0; j<J; j++)
		{
			t = dt*j;
			xt = splineX(t);
			yt = splineY(t);
			zt = splineZ(t);
			xe = Xe(xt,yt);
			ye = Ye(xt,yt,zt);
			x1 = xn(xe);
			y1 = ym(ye);
			putpixel(x1,y1,14);
		}





	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; }

	closegraph();

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