消隐图形算法
数据
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);
}
}
}
结果