📄 3dgraphics7.c
字号:
{
if(d<=0)
d = d + 4 * squrareb * (2 * (x - x0) + 3);
else
{
d = d + 4 * squrareb * (2 * (x - x0) + 3)-8 * squrarea * ((y - y0) - 1);
y--;
}
x++;
EllipsePoints_3DXY_XhuanZhuan(A,x,y,color,q,i,j,k,flag,B,qx,qy,qz);
}
/* 生成下半部椭圆*/
x = x0 + a;
y = y0;
d = 4 * (squrarea - squrareb * a) + squrareb;
EllipsePoints_3DXY_XhuanZhuan(A,x,y,color,q,i,j,k,flag,B,qx,qy,qz);
while((y-y0) < yP)
{
if(d<=0)
d = d + 4 * squrarea * (2 * (y - y0) + 3);
else
{
d = d + 4 * squrarea * (2 * (y - y0) + 3)-8 * squrareb * ((x - x0) - 1);
x--;
}
y++;
EllipsePoints_3DXY_XhuanZhuan(A,x,y,color,q,i,j,k,flag,B,qx,qy,qz);
}
}
/***************************/
/** **/
/** 圆柱的算法 **/
/** **/
/***************************/
void YuanZhu3D(Point3D A,int r,int h,Point3D B,float qx,float qy,float qz)
{
Point3D T;
T.x = A.x; T.y = A.y; T.z = A.z -h/2.0;
while(T.z <= A.z + h/2.0)
{
Yuan_3DXY(T,r,6,B,qx,qy,qz);
T.z++;
}
while(r>=0)
{
Yuan_3DXY(T,r,2,B,qx,qy,qz);
r--;
}
}
/******************************************/
/** **/
/** 长方体的算法(包含隐藏面的消隐算法) **/
/** **/
/******************************************/
void Cft3D(Point3D A,int a,int b,int h,Point3D B,float qx,float qy,float qz)
{
int X,Y,Z,i,j;
Point3D B1,B2,B3,B4,B5,B6;
Depth dp[6],temp;
B1.x = A.x + b/2.0; B1.y = A.y; B1.z = A.z;
B2.x = A.x; B2.y = A.y + a/2.0; B2.z = A.z;
B3.x = A.x - b/2.0; B3.y = A.y; B3.z = A.z;
B4.x = A.x; B4.y = A.y - a/2.0; B4.z = A.z;
B5.x = A.x; B5.y = A.y; B5.z = A.z - h/2.0;
B6.x = A.x; B6.y = A.y; B6.z = A.z + h/2.0;
/*深度信息初始化*/
X = B1.x; Y = B1.y; Z = B1.z;
Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
dp[0].s = '1'; dp[0].d = Z; /*第 1 面的深度*/
X = B2.x; Y = B2.y; Z = B2.z;
Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
dp[1].s = '2'; dp[1].d = Z; /*第 2 面的深度*/
X = B3.x; Y = B3.y; Z = B3.z;
Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
dp[2].s = '3'; dp[2].d = Z; /*第 3 面的深度*/
X = B4.x; Y = B4.y; Z = B4.z;
Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
dp[3].s = '4'; dp[3].d = Z; /*第 4 面的深度*/
X = B5.x; Y = B5.y; Z = B5.z;
Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
dp[4].s = '5'; dp[4].d = Z; /*第 5 面的深度*/
X = B6.x; Y = B6.y; Z = B6.z;
Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
dp[5].s = '6'; dp[5].d = Z; /*第 6 面的深度*/
for(i = 0; i <=4; i++) /* 深度排序 */
{
for(j = i+1;j<=5;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 <= 5) /*画家算法*/
{
switch(dp[i++].s)
{
case'1': Rect_3DYZ(B1,a,h,4,B,qx,qy,qz);
break;
case'2': Rect_3DXZ(B2,b,h,12,B,qx,qy,qz);
break;
case'3': Rect_3DYZ(B3,a,h,4,B,qx,qy,qz);
break;
case'4': Rect_3DXZ(B4,b,h,12,B,qx,qy,qz);
break;
case'5': Rect_3DXY(B5,a,b,1,B,qx,qy,qz);
break;
case'6': Rect_3DXY(B6,a,b,1,B,qx,qy,qz);
break;
}
}
}
/***************************/
/** **/
/** 长方体的旋转 **/
/** (包含隐藏面的消隐算法)**/
/***************************/
void Cft3D_XuanZhuan(Point3D A,int a,int b,int h,float q,Point3D D,int flag,Point3D B,float qx,float qy,float qz)
{
int X,Y,Z,i,j;
Depth dp[6],temp;
Point3D B1,B2,B3,B4,B5,B6;
B1.x = A.x + b/2.0; B1.y = A.y; B1.z = A.z;
B2.x = A.x; B2.y = A.y + a/2.0; B2.z = A.z;
B3.x = A.x - b/2.0; B3.y = A.y; B3.z = A.z;
B4.x = A.x; B4.y = A.y - a/2.0; B4.z = A.z;
B5.x = A.x; B5.y = A.y; B5.z = A.z - h/2.0;
B6.x = A.x; B6.y = A.y; B6.z = A.z + h/2.0;
/*深度信息初始化*/
X = B1.x; Y = B1.y; Z = B1.z;
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 = '1'; dp[0].d = Z; /*第 1 面的深度*/
X = B2.x; Y = B2.y; Z = B2.z;
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 = '2'; dp[1].d = Z; /*第 2 面的深度*/
X = B3.x; Y = B3.y; Z = B3.z;
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 = '3'; dp[2].d = Z; /*第 3 面的深度*/
X = B4.x; Y = B4.y; Z = B4.z;
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 = '4'; dp[3].d = Z; /*第 4 面的深度*/
X = B5.x; Y = B5.y; Z = B5.z;
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 = '5'; dp[4].d = Z; /*第 5 面的深度*/
X = B6.x; Y = B6.y; Z = B6.z;
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 = '6'; dp[5].d = Z; /*第 6 面的深度*/
for(i = 0; i <=4; i++) /* 深度排序 */
{
for(j = i+1;j<=5;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 <= 5) /*画家算法*/
{
switch(dp[i++].s)
{
case'1': Rect_3DYZ_XuanZhuan(B1,a,h,4,q,D,flag,B,qx,qy,qz);
break;
case'2': Rect_3DXZ_XuanZhuan(B2,b,h,12,q,D,flag,B,qx,qy,qz);
break;
case'3': Rect_3DYZ_XuanZhuan(B3,a,h,4,q,D,flag,B,qx,qy,qz);
break;
case'4': Rect_3DXZ_XuanZhuan(B4,b,h,12,q,D,flag,B,qx,qy,qz);
break;
case'5': Rect_3DXY_XuanZhuan(B5,a,b,1,q,D,flag,B,qx,qy,qz);
break;
case'6': Rect_3DXY_XuanZhuan(B6,a,b,1,q,D,flag,B,qx,qy,qz);
break;
}
}
}
/***************************************/
/*** ***/
/*** 常见的实物实体画法 ***/
/*** ***/
/***************************************/
/*****************************/
/** 栏杆(平行于X轴) **/
/*****************************/
void LanGan_X(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; 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 - 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;
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)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -