📄 3dgraphics4.c
字号:
if(dp[i].d>dp[j].d)
{
temp.s = dp[i].s; temp.d = dp[i].d;
dp[i].s = dp[j].s; dp[i].d = dp[j].d;
dp[j].s = temp.s; dp[j].d = temp.d;
}
}
}
i = 0;
while(i <= 4) /*画家算法*/
{
switch(dp[i++].s)
{
case'A': B.x = A.x - L/2.0; B.y = A.y; B.z = A.z; /*四条竖线*/
Cft3D(B,15,15,h + 40,BB,qx,qy,qz);
break;
case'B': B.x = A.x - L/2.0 + L/4.0; B.y = A.y; B.z = A.z;
Cft3D(B,15,15,h - 15,BB,qx,qy,qz);
break;
case'C': B.x = A.x - L/2.0 + L/2.0; B.y = A.y; B.z = A.z;
Cft3D(B,15,15,h - 15,BB,qx,qy,qz);
break;
case'D': B.x = A.x - L/2.0 + 3*L/4.0; B.y = A.y; B.z = A.z;
Cft3D(B,15,15,h - 15,BB,qx,qy,qz);
break;
case'E': B.x = A.x - L/2.0 + L; B.y = A.y; B.z = A.z;
Cft3D(B,15,15,h + 40,BB,qx,qy,qz);
break;
}
}
B.x = A.x; B.y = A.y; B.z = A.z + h/2.0; /*两条横线*/
Cft3D(B,15,L - 15,15,BB,qx,qy,qz);
B.x = A.x; B.y = A.y; B.z = A.z - h/2.0;
Cft3D(B,15,L - 15,15,BB,qx,qy,qz);
}
/*****************************/
/** 栏杆(平行于Y轴) **/
/*****************************/
void LanGan_Y(Point3D A,int L,int h,Point3D BB,float qx,float qy,float qz)
{
int X,Y,Z,i,j;
Point3D B;
Depth dp[7],temp;
X = A.x - L/2.0; Y = A.y; Z = A.z; /*五条竖线的深度*/
Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
dp[0].s = 'A'; dp[0].d = Z;
X = A.x - L/2.0+ L/4.0; Y = A.y; Z = A.z;
Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
dp[1].s = 'B'; dp[1].d = Z;
X = A.x - L/2.0 + L/2.0; Y = A.y; Z = A.z;
Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
dp[2].s = 'C'; dp[2].d = Z;
X = A.x - L/2.0 + 3*L/4.0 - 10; Y = A.y; Z = A.z;
Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
dp[3].s = 'D'; dp[3].d = Z;
X = A.x - L/2.0 + L; Y = A.y; Z = A.z;
Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
dp[4].s = 'E'; dp[4].d = Z;
for(i = 0; i <=3; i++) /* 深度排序 */
{
for(j = i+1;j<=4;j++)
{
if(dp[i].d>=dp[j].d)
{
temp.s = dp[i].s; temp.d = dp[i].d;
dp[i].s = dp[j].s; dp[i].d = dp[j].d;
dp[j].s = temp.s; dp[j].d = temp.d;
}
}
}
i = 0;
while(i <= 4) /*画家算法*/
{
switch(dp[i++].s)
{
case'A': B.x = A.x; B.y = A.y - L/2.0; B.z = A.z; /*四条竖线*/
Cft3D(B,15,15,h +40,BB,qx,qy,qz);
break;
case'B': B.x = A.x; B.y = A.y - L/2.0 + L/4.0; B.z = A.z;
Cft3D(B,15,15,h - 15,BB,qx,qy,qz);
break;
case'C': B.x = A.x ; B.y = A.y- L/2.0 + L/2.0; B.z = A.z;
Cft3D(B,15,15,h - 15,BB,qx,qy,qz);
break;
case'D': B.x = A.x ; B.y = A.y- L/2.0 + 3*L/4.0; B.z = A.z;
Cft3D(B,15,15,h - 15,BB,qx,qy,qz);
break;
case'E': B.x = A.x ; B.y = A.y- L/2.0 + L; B.z = A.z;
Cft3D(B,15,15,h + 40,BB,qx,qy,qz);
break;
}
}
B.x = A.x; B.y = A.y; B.z = A.z + h/2.0;
Cft3D(B,L - 15,15,15,BB,qx,qy,qz);
B.x = A.x; B.y = A.y; B.z = A.z - h/2.0;
Cft3D(B,L - 15,15,15,BB,qx,qy,qz);
}
/*****************************/
/** 树 **/
/*****************************/
void Shu(Point3D A,int r,Point3D BB,float qx,float qy,float qz)
{
int k;
Point3D B;
setbkcolor(2);
B.x = A.x + r; B.y = A.y; B.z = A.z;
k=0;
while(k<360)
{
Rect_3DXY_XuanZhuan(B,40,20,7,k,A,3,BB,qx,qy,qz);
k = k+30;
}
B.x = A.x; B.y = A.y; B.z = A.z + 50; /* 树干 */
YuanZhu3D(B,15,100,BB,qx,qy,qz);
B.x = A.x; B.y = A.y; B.z = A.z + 15;
k = 15;
while(B.z>=A.z)
{
if((int)B.z%2==0)
Yuan_3DXY(B,k,2,BB,qx,qy,qz);
else
Yuan_3DXY(B,k,4,BB,qx,qy,qz);
B.z--;
k = k + 1;
}
B.x = A.x; B.y = A.y; B.z = A.z + 100; /*树叶*/
k=80;
while(k>=0)
{
Yuan_3DXY(B,k--,8,BB,qx,qy,qz);
}
k=100; /*树叶1*/
while(k>=0)
{
if(k%2==0)
Yuan_3DXY(B,k,3,BB,qx,qy,qz);
else
Yuan_3DXY(B,k,4,BB,qx,qy,qz);
B.z = B.z + 2;
k--;
}
B.x = A.x; B.y = A.y; B.z = A.z + 200;
k=80;
while(k>=0)
{
Yuan_3DXY(B,k--,8,BB,qx,qy,qz);
}
k=80; /*树叶2*/
while(k>=0)
{
if(k%2==0)
Yuan_3DXY(B,k,3,BB,qx,qy,qz);
else
Yuan_3DXY(B,k,4,BB,qx,qy,qz);
B.z = B.z + 2;
k--;
}
}
/*****************************/
/** 凳子 **/
/*****************************/
void DengZi(Point3D A,int a,int b,int h,Point3D B,float qx,float qy,float qz)
{
int X,Y,Z,i,j;
Point3D D;
Depth dp[12],temp;
setbkcolor(2);
/* Rect_3DXY(A,a + 100,b + 100,8,B,qx,qy,qz);*//*凳子下的地板*/
/* 深度初始化*/
X = A.x - b/2.0; Y = A.y - a/2.0; Z = A.z + h/2.0;
Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
dp[0].s = 'A'; dp[0].d = Z;
X = A.x - b/2.0; Y = A.y + a/2.0; Z = A.z + h/2.0;
Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
dp[1].s = 'B'; dp[1].d = Z;
X = A.x + b/2.0; Y = A.y - a/2.0; Z = A.z + h/2.0;
Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
dp[2].s = 'C'; dp[2].d = Z;
X = A.x + b/2.0; Y = A.y + a/2.0; Z = A.z + h/2.0;
Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
dp[3].s = 'D'; dp[3].d = Z;
X = A.x - b/2.0; Y = A.y; Z = A.z + h/2.0;
Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
dp[4].s = 'E'; dp[4].d = Z;
X = A.x + b/2.0; Y = A.y; Z = A.z + h/2.0;
Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
dp[5].s = 'F'; dp[5].d = Z;
X = A.x; Y = A.y - a/2.0; Z = A.z + h;
Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
dp[6].s = 'H'; dp[6].d = Z;
X = A.x; Y = A.y - a/2.0 + a/5.0; Z = A.z + h;
Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
dp[7].s = 'I'; dp[7].d = Z;
X = A.x; Y = A.y - a/2.0 + 2*a/5.0; Z = A.z + h;
Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
dp[8].s = 'J'; dp[8].d = Z;
X = A.x; Y = A.y - a/2.0 + 3*a/5.0; Z = A.z + h;
Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
dp[9].s = 'K'; dp[9].d = Z;
X = A.x; Y = A.y - a/2.0 + 4*a/5.0; Z = A.z + h;
Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
dp[10].s = 'L'; dp[10].d = Z;
X = A.x; Y = A.y - a/2.0 + a; Z = A.z + h;
Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
dp[11].s = 'M'; dp[11].d = Z;
for(i = 0; i <=11; i++) /* 深度排序 */
{
for(j = i+1;j<=12;j++)
{
if(dp[i].d>dp[j].d)
{
temp.s = dp[i].s; temp.d = dp[i].d;
dp[i].s = dp[j].s; dp[i].d = dp[j].d;
dp[j].s = temp.s; dp[j].d = temp.d;
}
}
}
i = 0;
while(i <= 11) /*画家算法*/
{
switch(dp[i++].s)
{
case 'A': D.x = A.x - b/2.0; D.y = A.y - a/2.0; D.z = A.z + h/2.0; /* 四个脚 */
Cft3D(D,20,20,h+20,B,qx,qy,qz);
break;
case 'B': D.x = A.x - b/2.0; D.y = A.y + a/2.0; D.z = A.z + h/2.0;
Cft3D(D,20,20,h+20,B,qx,qy,qz);
break;
case 'C': D.x = A.x + b/2.0; D.y = A.y - a/2.0; D.z = A.z + h/2.0;
Cft3D(D,20,20,h+20,B,qx,qy,qz);
break;
case 'D': D.x = A.x + b/2.0; D.y = A.y + a/2.0; D.z = A.z + h/2.0;
Cft3D(D,20,20,h+20,B,qx,qy,qz);
break;
case 'E': D.x = A.x - b/2.0; D.y = A.y; D.z = A.z + h; /*上面的条木*/
Cft3D(D,a+20,10,10,B,qx,qy,qz);
break;
case 'F': D.x = A.x + b/2.0; D.y = A.y; D.z = A.z + h;
Cft3D(D,a+20,10,10,B,qx,qy,qz);
break;
case 'H': D.x = A.x; D.y = A.y - a/2.0; D.z = A.z + h;
Cft3D(D,10,b+20,10,B,qx,qy,qz);
break;
case 'I': D.x = A.x; D.y = A.y - a/2.0 + a/5.0; D.z = A.z + h;
Cft3D(D,10,b+20,10,B,qx,qy,qz);
break;
case 'J': D.x = A.x; D.y = A.y - a/2.0 + 2*a/5.0; D.z = A.z + h;
Cft3D(D,10,b+20,10,B,qx,qy,qz);
break;
case 'K': D.x = A.x; D.y = A.y - a/2.0 + 3*a/5.0; D.z = A.z + h;
Cft3D(D,10,b+20,10,B,qx,qy,qz);
break;
case 'L': D.x = A.x; D.y = A.y - a/2.0 + 4*a/5.0; D.z = A.z + h;
Cft3D(D,10,b+20,10,B,qx,qy,qz);
break;
case 'M': D.x = A.x; D.y = A.y - a/2.0 + a; D.z = A.z + h;
Cft3D(D,10,b+20,10,B,qx,qy,qz);
break;
}
}
}
/*****************************/
/** 梯子 **/
/*****************************/
void TiZi_Y_XuanZhuan(Point3D A,int a,int b,int h,float q,Point3D D,int flag,Point3D BB,float qx,float qy,float qz)/*0度时平行于负Y轴的梯子,A为直角的中心点*/
{
int X,Y,Z,k,d,i,j,max;
Point3D B;
Depth dp[15],temp;
k = (float)h/20.0; /*台阶个数*/
d = ((float)a)/((float)k); /*每个梯阶的宽度*/
X = A.x; Y = A.y - (float)d/2.0; Z = A.z + h/2.0;
XuanZhuan3D_RY(&X,&Y,&Z,q,D.x,D.y,D.z,flag);
Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
dp[0].s = 'A'; dp[0].d = Z;
X = A.x; Y = A.y - (float)d/2.0 - d; Z = A.z + h/2.0;
XuanZhuan3D_RY(&X,&Y,&Z,q,D.x,D.y,D.z,flag);
Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
dp[1].s = 'B'; dp[1].d = Z;
X = A.x; Y = A.y - a/2.0 - 2*d; Z = A.z + h/2.0;
XuanZhuan3D_RY(&X,&Y,&Z,q,D.x,D.y,D.z,flag);
Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
dp[2].s = 'C'; dp[2].d = Z;
X = A.x; Y = A.y - a/2.0 - 3*d; Z = A.z + h/2.0;
XuanZhuan3D_RY(&X,&Y,&Z,q,D.x,D.y,D.z,flag);
Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
dp[3].s = 'D'; dp[3].d = Z;
X = A.x; Y = A.y - a/2.0 - 4*d; Z = A.z + h/2.0;
XuanZhuan3D_RY(&X,&Y,&Z,q,D.x,D.y,D.z,flag);
Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
dp[4].s = 'E'; dp[4].d = Z;
X = A.x; Y = A.y - a/2.0 - 5*d; Z = A.z + h/2.0;
XuanZhuan3D_RY(&X,&Y,&Z,q,D.x,D.y,D.z,flag);
Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
dp[5].s = 'F'; dp[5].d = Z;
X = A.x; Y = A.y - a/2.0 - 6*d; Z = A.z + h/2.0;
XuanZhuan3D_RY(&X,&Y,&Z,q,D.x,D.y,D.z,flag);
Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
dp[6].s = 'H'; dp[6].d = Z;
X = A.x; Y = A.y - a/2.0 - 7*d; Z = A.z + h/2.0;
XuanZhuan3D_RY(&X,&Y,&Z,q,D.x,D.y,D.z,flag);
Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
dp[7].s = 'I'; dp[7].d = Z;
X = A.x; Y = A.y - a/2.0 - 8*d; Z = A.z + h/2.0;
XuanZhuan3D_RY(&X,&Y,&Z,q,D.x,D.y,D.z,flag);
Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
dp[8].s = 'J'; dp[8].d = Z;
X = A.x; Y = A.y - a/2.0 - 9*d; Z = A.z + h/2.0;
XuanZhuan3D_RY(&X,&Y,&Z,q,D.x,D.y,D.z,flag);
Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
dp[9].s = 'K'; dp[9].d = Z;
X = A.x; Y = A.y - a/2.0 - 10*d; Z = A.z + h/2.0;
XuanZhuan3D_RY(&X,&Y,&Z,q,D.x,D.y,D.z,flag);
Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
dp[10].s = 'L'; dp[10].d = Z;
X = A.x; Y = A.y - a/2.0 - 11*d; Z = A.z + h/2.0;
XuanZhuan3D_RY(&X,&Y,&Z,q,D.x,D.y,D.z,flag);
Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
dp[11].s = 'M'; dp[11].d = Z;
for(i = 0; i <=k-2; i++) /* 深度排序 */
{
for(j = i+1;j<=k-1;j++)
{
if(dp[i].d>dp[j].d)
{
temp.s = dp[i].s; temp.d = dp[i].d;
dp[i].s = dp[j].s; dp[i].d = dp[j].d;
dp[j].s = temp.s; dp[j].d = temp.d;
}
}
}
i = 0;
while(i <= k-1) /*画家算法*/
{
switch(dp[i++].s)
{
case'A': B.x = A.x; B.y = A.y - (float)d/2.0; B.z = A.z + h/2.0;
Cft3D_XuanZhuan(B,d,b,h,q,D,flag,BB,qx,qy,qz);
break;
case'B': B.x = A.x; B.y = A.y - (float)d/2.0 - d; B.z = A.z + h/2.0 - 10;
Cft3D_XuanZhuan(B,d,b,h-20,q,D,flag,BB,qx,qy,qz);
break;
case'C': B.x = A.x; B.y = A.y - (float)d/2.0 - 2*d; B.z = A.z + h/2.0 - 20;
Cft3D_XuanZhuan(B,d,b,h-40,q,D,flag,BB,qx,qy,qz);
break;
case'D': B.x = A.x; B.y = A.y - (float)d/2.0 - 3*d; B.z = A.z + h/2.0 - 30;
Cft3D_XuanZhuan(B,d,b,h-60,q,D,flag,BB,qx,qy,qz);
break;
case'E': B.x = A.x; B.y = A.y - (float)d/2.0 - 4*d; B.z = A.z + h/2.0 - 40;
Cft3D_XuanZhuan(B,d,b,h-80,q,A,flag,BB,qx,qy,qz);
break;
case'F': B.x = A.x; B.y = A.y - (float)d/2.0 - 5*d; B.z = A.z + h/2.0 - 50;
Cft3D_XuanZhuan(B,d,b,h-100,q,D,flag,BB,qx,qy,qz);
break;
case'H': B.x = A.x; B.y = A.y - (float)d/2.0 - 6*d; B.z = A.z + h/2.0 - 60;
Cft3D_XuanZhuan(B,d,b,h-120,q,D,flag,BB,qx,qy,qz);
break;
case'I': B.x = A.x; B.y = A.y - (float)d/2.0 - 7*d; B.z = A.z + h/2.0 - 70;
Cft3D_XuanZhuan(B,d,b,h-140,q,D,flag,BB,qx,qy,qz);
break;
case'J': B.x = A.x; B.y = A.y - (float)d/2.0 - 8*d; B.z = A.z + h/2.0 - 80;
Cft3D_XuanZhuan(B,d,b,h-160,q,D,flag,BB,qx,qy,qz);
break;
case'K': B.x = A.x; B.y = A.y - (float)d/2.0 - 9*d; B.z = A.z + h/2.0 - 90;
Cft3D_XuanZhuan(B,d,b,h-180,q,D,flag,BB,qx,qy,qz);
break;
case'L': B.x = A.x; B.y = A.y - (float)d/2.0 - 10*d; B.z = A.z + h/2.0 - 100;
Cft3D_XuanZhuan(B,d,b,h-200,q,D,flag,BB,qx,qy,qz);
break;
case'M': B.x = A.x; B.y = A.y - (float)d/2.0 - 11*d; B.z = A.z + h/2.0 - 110;
Cft3D_XuanZhuan(B,d,b,h-220,q,D,flag,BB,qx,qy,qz);
break;
}
}
}
/*****************************/
/** 房子 **/
/*****************************/
void FangZi(Point3D A,int a,int b,int h,Point3D BB,float qx,float qy,float qz)
{
int X,Y,Z,i,j,d;
Point3D B,C;
Depth dp[9],temp;
X = A.x; Y = A.y; Z = A.z; /*深度信息初始化*/
Point3D_2D(&X,&Y,&Z,BB,qx,qy,qz);
dp[0].s = 'A'; dp[0].d = Z; /* 长方体的深度*/
X = A.x + b/2.0 + 30; Y = A.y; Z = A.z;
Point3D_2D(&X,&Y,&Z,BB,qx,qy,qz);
dp[1].s = 'B'; dp[1].d = Z; /*门框的深度*/
X = A.x + b/2.0 + a/12.0 + 60; Y = A.y - a/6.0; Z = A.z;
Point3D_2D(&X,&Y,&Z,BB,qx,qy,qz);
dp[2].s = 'C'; dp[2].d = Z; /*门1的深度*/
X = A.x + b/2.0 + a/12.0 + 60; Y = A.y + a/6.0; Z = A.z;
Point3D_2D(&X,&Y,&Z,BB,qx,qy,qz);
dp[3].s = 'D'; dp[3].d = Z; /*门2的深度*/
X = A.x; Y = A.y + a/2.0; Z = A.z;
Point3D_2D(&X,&Y,&Z,BB,qx,qy,qz);
dp[4].s = 'E'; dp[4].d = Z; /* 窗框1的深度 */
X = A.x; Y = A.y + a/2.0 + 25; Z = A.z - h/8.0;
Point3D_2D(&X,&Y,&Z,BB,qx,qy,qz);
dp[5].s = 'F'; dp[5].d = Z; /* 窗台1的深度 */
X = A.x; Y = A.y - a/2.0; Z = A.z;
Point3D_2D(&X,&Y,&Z,BB,qx,qy,qz);
dp[6].s = 'H'; dp[6].d = Z; /* 窗框2的深度 */
X = A.x; Y = A.y - a/2.0 - 25; Z = A.z - h/8.0;
Point3D_2D(&X,&Y,&Z,BB,qx,qy,qz);
dp[7].s = 'I'; dp[7].d
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -