计算机图形学 考试实验代码分析3 消隐图形算法


消隐图形算法

数据

   0     4     5     9    10    14
  15    19    20    24    25    29
   1     2     6     5     1
   5     6     7     8     5
   1     5     8     4     1
   2     3     7     6     2
   3     4     8     7     3
   1     4     3     2     1 
  100    0     0
  100   100    0
   0    100    0
   0     0     0
  100    0    100
  100   100   100
   0    100   100
   0     0    100
 0.935  0.333  -0.118   0
-0.354  0.882  -0.312   0
   0    0.333   0.943   0
   0     0      0       1

代码

void CMy77View::OnDraw(CDC* pDC)
{
	CMy77Doc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	float b[8][3],t[4][4],b1[8][3],B[6];
    //b存储各点的初始坐标,t存储变换矩阵,b1存储变换后的坐标,B储存计算的值
	int i=0,j=0,k=0,NF[6][2],h[30];
  	//NF储存数据前两行的数据,h储存六个面的法向量
	CPen mypen;
	FILE *fp=NULL;
	fp=fopen("d:\\xiaoyin.txt","r");
	mypen.CreatePen(PS_SOLID,1,RGB(255,255,255));
	for(i=0;i<6;i++)
		fscanf(fp,"%d%d",&NF[i][0],&NF[i][1]);
	for(i=0;i<30;i++)
		fscanf(fp,"%d",&h[i]);
	for(i=0;i<8;i++){
		for(j=0;j<3;j++)
			fscanf(fp,"%f",&b[i][j]);
	}
	for(i=0;i<4;i++){
		for(j=0;j<4;j++)
			fscanf(fp,"%f",&t[i][j]);
	}
	for(i=0;i<8;i++){
		b1[i][0]=-(b[i][0]*t[0][0] + b[i][1]*t[1][0] + b[i][2]*t[2][0])+200;
		b1[i][1]=-(b[i][0]*t[0][1] + b[i][1]*t[1][1] + b[i][2]*t[2][1])+200;
		b1[i][2]=-(b[i][0]*t[0][2] + b[i][1]*t[1][2] + b[i][2]*t[2][2]);
	}
  	//坐标变换,加“-”是为了使图形正过来
	for(i=0;i<6;i++){
		B[i]=(b1[h[NF[i][0]+1]-1][2]-b1[h[NF[i][0]]-1][2])*(b1[h[NF[i][0]+2]-1][0]-b1[h[NF[i][0]]-1][0])
			-(b1[h[NF[i][0]+2]-1][2]-b1[h[NF[i][0]]-1][2])*(b1[h[NF[i][0]+1]-1][0]-b1[h[NF[i][0]]-1][0]);
	}
  	//能理解理解,不能理解背下来(反正我不能理解)
	for(i=0;i<=5;i++){
		if(B[i]>0){
			pDC->MoveTo(b1[h[NF[i][0]]-1][0]+200,b1[h[NF[i][0]]-1][2]+200);
			for(j=1;j<6;j++)
				pDC->LineTo(b1[h[NF[i][0]+j]-1][0]+200,b1[h[NF[i][0]+j]-1][2]+200);
		}
	}
}

结果