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

Лабы / Labs 2004 / Labor3 / Surfaces / B_SPL_3D

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

#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 -®ЎкҐ¤Ё­Ґ­ЁҐ ¤ўге Ў ©в ў б«®ў®



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


int Px[4][4], Py[4][4], Pz[4][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;
	  default : printf("\nError in function Bezie"); exit(1);
	}
	return b;
}



/*
double Bezie(int i, double t)  //зҐвлॠдг­ЄжЁЁ ЃҐ§мҐ (ЃҐа­и⥩­ )
{
	double b;
	switch(i)
	{
	  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)
{
  double S1=0, S2;
  int i,j;
  for(i=0; i<4; i++)
  {
	 S2=0;
	 for(j=0; j<4; j++)
		S2 += Px[i][j]*Bspl(j,v);
	 S1 += S2*Bspl(i,u);
  }
  return S1;
}


double splineY(double u,double v)
{
  double S1=0, S2;
  int i,j;
  for(i=0; i<4; i++)
  {
	 S2=0;
	 for(j=0; j<4; j++)
		S2 += Py[i][j]*Bspl(j,v);
	 S1 += S2*Bspl(i,u);
  }
  return S1;
}

double splineZ(double u,double v)
{
  double S1=0, S2;
  int i,j;
  for(i=0; i<4; i++)
  {
	 S2=0;
	 for(j=0; j<4; j++)
		S2 += Pz[i][j]*Bspl(j,v);
	 S1 += S2*Bspl(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=0; i<4; i++)
	 for(j=0; j<4; j++)
	 {
		Px[i][j] = i*100; Py[i][j] = j*100;
	 }





  for(i=0; i<4; i++)
	 for(j=0; j<4; j++)
		 Pz[i][j]=functionZ((double)Px[i][j],(double)Py[i][j]);


  int driver=DETECT;
  int mode;
  int res;

  initgraph(&driver,&mode,"d:\\mathemat\\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, "Elementary becubic B-Spline surface");


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




  int N=30;
  int Ppx[4][30],Ppy[4][30];
  int Ppx1[4][30],Ppy1[4][30];

  double u,v,du=1.0/N,dv=1.0/N;
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),splineY(u,v)));
	 y1=(int)(scale*Ye(splineX(u,v),splineY(u,v),splineZ(u,v)));
		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),splineY(u,v)));
	 y1=(int)(scale*Ye(splineX(u,v),splineY(u,v),splineZ(u,v)));
		Ppy1[j][i]=200-y1;
		Ppx1[j][i]=250+x1;
//    putpixel(x1,y1,12);
  }
}


//	cleardevice();
	clearviewport();

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


		setcolor(3);

		x1=(int)Xe(0,0);
		y1=(int)Ye(0,0,0);
		x2=(int)Xe(180,0);
		y2=(int)Ye(180,0,0);
		y1=200-y1;   y2=200-y2;
		x1=250+x1;   x2=250+x2;
		line(x1,y1,x2,y2);
	outtextxy(x2,y2," X");


		x1=(int)Xe(0,0);
		y1=(int)Ye(0,0,0);
		x2=(int)Xe(0,180);
		y2=(int)Ye(0,180,0);
		y1=200-y1;   y2=200-y2;
		x1=250+x1;   x2=250+x2;
		line(x1,y1,x2,y2);
	outtextxy(x2,y2," Y");


		x1=(int)Xe(0,0);
		y1=(int)Ye(0,0,0);
		x2=(int)Xe(0,0);
		y2=(int)Ye(0,0,180);
		y1=200-y1;   y2=200-y2;
		x1=250+x1;   x2=250+x2;
		line(x1,y1,x2,y2);
	outtextxy(x2,y2," Z");


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


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


double t, dt;
dt = 1.0/200;
for(i=0; i<200; i++)
{
	 t = dt*i;
	 u = t;

	 v=t + 0.4*sin(6.28*t);
	 x1=(int)(scale*Xe(splineX(u,v),splineY(u,v)));
	 y1=(int)(scale*Ye(splineX(u,v),splineY(u,v),splineZ(u,v)));
		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),splineY(u,v)));
	 y1=(int)(scale*Ye(splineX(u,v),splineY(u,v),splineZ(u,v)));
		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),splineY(u,v)));
	 y1=(int)(scale*Ye(splineX(u,v),splineY(u,v),splineZ(u,v)));
		y1=200-y1;
		x1=250+x1;
	 putpixel(x1,y1,10);

}



		setcolor(15);

  for(i=0; i<4; i++)
	 for(j=0; j<3; 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<4; j++)
	 for(i=0; i<3; 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();

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