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

Лабы / 5 / VOVA / ZBUFER

.CPP
Скачиваний:
20
Добавлен:
16.04.2013
Размер:
3.78 Кб
Скачать
//Z ЎгдҐа ў ЁбЇ®«­Ґ­ЁЁ Ѓ аЄ®ў . Њ®¦­® б¤ вм в®«мЄ® Ѓ «Ё­®ўЁзг
#include<conio.h>
#include<iostream.h>
#include<string.h>
#include<graphics.h>
#include<dos.h>
#include<math.h>
//#define d 2
struct point {float x,y,z,a,b,c,d;} p[6][4];

void PLOSK(int i)
{
 p[i][0].a=(p[i][1].y-p[i][0].y)*(p[i][2].z-p[i][0].z)-(p[i][2].y-p[i][0].y)*(p[i][1].z-p[i][0].z);
 p[i][0].b=(p[i][1].z-p[i][0].z)*(p[i][2].x-p[i][0].x)-(p[i][2].z-p[i][0].z)*(p[i][1].x-p[i][0].x);
 p[i][0].c=(p[i][1].x-p[i][0].x)*(p[i][2].y-p[i][0].y)-(p[i][2].x-p[i][0].x)*(p[i][1].y-p[i][0].y);
 p[i][0].d=-((p[i][0].a)*(p[i][0].x)+(p[i][0].b)*(p[i][0].y)+(p[i][0].c)*(p[i][0].z));
}
void POVOROT(float fi, float teta, float ro)
{
  float x,y,z;
for (int i=0; i<6; i++)
 {
  for(int j=0;j<4;j++)
   {
    x=p[i][j].x; y=p[i][j].y; z=p[i][j].z;
    p[i][j].x=(x)*(-sin(fi))+(y)*(cos(fi));
    p[i][j].y=(x)*(-cos(teta))*(cos(fi))+(y)*(-cos(teta))*(sin(fi))+(z)*(sin(teta));
    p[i][j].z=(x)*(-sin(teta))*(cos(fi))+(y)*(-sin(teta))*(sin(fi))+(z)*(-cos(teta))+ro;
   }
  PLOSK(i);
 }
}
double Z(int i,float x,float y)
{
 return ((-(p[i][0].d+(p[i][0].a)*x+(p[i][0].b)*y))/p[i][0].c);
}
int PROVERKA(int i,float x,float y)
{
 int priz;
 float k,c;
 for(int j=0;j<4;j++)
  {
   if (j!=3)
    c=(p[i][j+1].x-p[i][j].x)*(y-p[i][j].y)-(x-p[i][j].x)*(p[i][j+1].y-p[i][j].y);
   else
    c=(p[i][0].x-p[i][j].x)*(y-p[i][j].y)-(x-p[i][j].x)*(p[i][0].y-p[i][j].y);

   if(j==0)
    {
     k=c-fabs(c);
     if (k>=0)
	priz=1;
     else
      priz=0;
    }
   else
    {
     k=c-fabs(c);
     if (!(((k>=0)&&(priz==1))||((k<0)&&(priz==0)))) return 0;
    }
   }
 return 1;
}
void main(void)
{
 while(1)
 {
 p[0][0].x=2;   p[0][0].y=0;  p[0][0].z=0;
 p[0][1].x=2;   p[0][1].y=1;  p[0][1].z=0;
 p[0][2].x=2;   p[0][2].y=1;  p[0][2].z=1;
 p[0][3].x=2;   p[0][3].y=0;  p[0][3].z=1;

 p[1][0].x=2;   p[1][0].y=1;  p[1][0].z=0;
 p[1][1].x=0;   p[1][1].y=1;  p[1][1].z=0;
 p[1][2].x=0;   p[1][2].y=1;  p[1][2].z=1;
 p[1][3].x=2;   p[1][3].y=1;  p[1][3].z=1;

 p[2][0].x=0;   p[2][0].y=1;  p[2][0].z=0;
 p[2][1].x=0;   p[2][1].y=1;  p[2][1].z=1;
 p[2][2].x=0;   p[2][2].y=0;  p[2][2].z=1;
 p[2][3].x=0;   p[2][3].y=0;  p[2][3].z=0;

 p[3][0].x=2;   p[3][0].y=1;  p[3][0].z=1;
 p[3][1].x=0;   p[3][1].y=1;  p[3][1].z=1;
 p[3][2].x=0;   p[3][2].y=0;  p[3][2].z=1;
 p[3][3].x=2;   p[3][3].y=0;  p[3][3].z=1;

 p[4][0].x=2;   p[4][0].y=0;  p[4][0].z=0;
 p[4][1].x=0;   p[4][1].y=0;  p[4][1].z=0;
 p[4][2].x=0;   p[4][2].y=0;  p[4][2].z=1;
 p[4][3].x=2;   p[4][3].y=0;  p[4][3].z=1;

 p[5][0].x=2;   p[5][0].y=0;  p[5][0].z=0;
 p[5][1].x=2;   p[5][1].y=1;  p[5][1].z=0;
 p[5][2].x=0;   p[5][2].y=1;  p[5][2].z=0;
 p[5][3].x=0;   p[5][3].y=0;  p[5][3].z=0;

clrscr();
int f,t;
float ff,tt;
char ch;
cout<<"‚ўҐ¤ЁвҐ гЈ®« ”€: "; cin>>f;
cout<<"BўҐ¤ЁвҐ гЈ®« ’Ґвв : "; cin>>t;
ff=M_PI*f/180;
tt=M_PI*t/180;

POVOROT(ff,tt,5);
int driver=VGA;
int mode=VGAHI;
initgraph(&driver,&mode,"c:\\BC\\BGI");
cleardevice();
float xwmax=3, xwmin=-3, ywmax=3, ywmin=-3,
      xvmax=0.8, xvmin=0.2, yvmax=0.8, yvmin=0.2;
float u,v,xv,yv;
double z=1000,cvet=0;
 for (u=xwmin;u<=xwmax;u+=0.01)
  {
   for (v=ywmin;v<=ywmax;v+=0.01)
    {
     z=1000; cvet=0;
     for(int i=0; i<6;i++)
      {
       if (p[i][0].c!=0)
	if (PROVERKA(i,u,v)==1)
	 if (Z(i,u,v)<z)
	  {
	   z=Z(i,u,v);
	   cvet=i+1;
	//  getch();
	  }
       }
     xv=(xvmin+(((xvmax-xvmin)/(xwmax-xwmin))*(u-xwmin)))*640;
     yv=(yvmin+(((yvmax-yvmin)/(ywmax-ywmin))*(v-ywmin)))*480;
    // cvet=4;
     putpixel(xv,yv,cvet);
   // getch();
    }
  }
getch();
closegraph();
clrscr();
cout<<"…йҐ - Є« ўЁи ; ‚л室 - Spase.";
ch=getch();
if (ch==32) break;
}
}