📄 3dgraphics4.c
字号:
X = 2*x0-x;
Y = 2*y0-y;
FangSuo_RY(m,n,&X,&Y,sx,sy);
putpixel(X,Y,color); /*(-x,-y) */
X = x;
Y = 2*y0-y;
FangSuo_RY(m,n,&X,&Y,sx,sy);
putpixel(X,Y,color); /*(x, -y) */
}
/* 椭圆的放缩 */
void MidPointEllipse_FangSuo(TuoYuan E,Point A,float sx,float sy) /*以A点为参考点放缩*/
{
int x,y,xP,yP,x0,y0,a,b,color,m,n;
float d,squrarea,squrareb;
m = A.x;
n = A.y;
x0 = E.o.x;
y0 = E.o.y;
a = E.a;
b = E.b;
color = E.color;
squrarea = a * a;
squrareb = b * b;
/*计算分解点P*/
xP = (int)(0.5 + squrarea/sqrt(squrarea + squrareb));
yP = (int)(0.5 + squrareb/sqrt(squrarea + squrareb));
/* 生成上半部椭圆*/
x = x0;
y = y0 + b;
d = 4 * (squrareb - squrarea * b) + squrarea;
EllipsePoints_FangSuo(m,n,x0,y0,x,y,color,sx,sy);
while((x - x0)<=xP)
{
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_FangSuo(m,n,x0,y0,x,y,color,sx,sy);
}
/* 生成下半部椭圆*/
x = x0 + a;
y = y0;
d = 4 * (squrarea - squrareb * a) + squrareb;
EllipsePoints_FangSuo(m,n,x0,y0,x,y,color,sx,sy);
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_FangSuo(m,n,x0,y0,x,y,color,sx,sy);
}
}
/************************/
/** **/
/** 圆的错切变换 **/
/** **/
/************************/
/* 错切后圆的8对称点的显示 */
void CirclePoints_CuoQie(int m,int n,int x0,int y0,int x,int y,int color,float q,int flag)/* 圆心为(x0,y0);以(m,n)为参考点*/
{
int X,Y;
X = x;
Y = y;
CuoQie_RY(m,n,&X,&Y,q,flag);
putpixel(X,Y,color); /*(x, y) */
X = x0-y0+y;
Y = y0-x0+x;
CuoQie_RY(m,n,&X,&Y,q,flag);
putpixel(X,Y,color); /*(y, x) */
X = x0+y0-y;
Y = y0-x0+x;
CuoQie_RY(m,n,&X,&Y,q,flag);
putpixel(X,Y,color); /*(-y, x) */
X = 2*x0-x;
Y = y;
CuoQie_RY(m,n,&X,&Y,q,flag);
putpixel(X,Y,color); /*(-x, y) */
X = x0-y0+y;
Y = y0+x0-x;
CuoQie_RY(m,n,&X,&Y,q,flag);
putpixel(X,Y,color); /*(y, -x) */
X = x;
Y = 2*y0-y;
CuoQie_RY(m,n,&X,&Y,q,flag);
putpixel(X,Y,color); /*(x, -y) */
X =2*x0-x;
Y =2*y0-y;
CuoQie_RY(m,n,&X,&Y,q,flag);
putpixel(X,Y,color); /*(-x,-y) */
X =x0+y0-y;
Y =y0+x0-x;
CuoQie_RY(m,n,&X,&Y,q,flag);
putpixel(X,Y,color); /*(-y,-x) */
}
/* 圆 的错切 */
void MidPointCircle_CuoQie(Yuan C,Point A,float q,int flag)/* 圆心为(x0,y0);*/
{
int x,y,d,deltaE,deltaSE,x0,y0,radius,color,m,n;
m = A.x;
n = A.y;
x0 = C.o.x;
y0 = C.o.y;
radius = C.r;
color = C.color;
x = x0;
y = y0 + radius;
d = 5 - 4*radius;
deltaE = 12;
deltaSE = 20 - 8*radius;
CirclePoints_CuoQie(m,n,x0,y0,x,y,color,q,flag);
while((y-y0)>(x-x0))
{
if(d<=0)
{
d = d + deltaE;
deltaSE=deltaSE + 8;
}
else
{
d = d + deltaSE;
deltaSE=deltaSE + 16;
y--;
}
deltaE=deltaE + 8;
x++;
CirclePoints_CuoQie(m,n,x0,y0,x,y,color,q,flag);
}
}
/***************************/
/** **/
/** 3D空间矩形面 **/
/** 平行于X-Y平面 **/
/***************************/
void Rect_3DXY(Point3D A,int a,int b,int color,Point3D B,float qx,float qy,float qz)
{
int i,j,k,X,Y,Z;
Point3D B1,B2,B3,B4;
B1.x = A.x + b/2.0; B1.y = A.y - a/2.0; B1.z = A.z;
B2.x = A.x + b/2.0; B2.y = A.y + a/2.0; B2.z = A.z;
B3.x = A.x - b/2.0; B3.y = A.y + a/2.0; B3.z = A.z;
B4.x = A.x - b/2.0; B4.y = A.y - a/2.0; B4.z = A.z;
X = B1.x; Y = B1.y; Z = B1.z;
i = X; j = Y;
while(j <= B2.y)
{
while(i >= B4.x)
{
Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
putpixel(X,Y,color);
i--;
X = i; Y = j; Z = B1.z;
}
j++;
X = B1.x; Y = j; Z = B1.z; i = X;
}
}
/***************************/
/** **/
/** 3D空间矩形面 **/
/** 平行于X-Z平面 **/
/***************************/
void Rect_3DXZ(Point3D A,int a,int b,int color,Point3D B,float qx,float qy,float qz)
{
int i,j,k,X,Y,Z;
Point3D B1,B2,B3,B4;
B1.x = A.x + a/2.0; B1.y = A.y; B1.z = A.z - b/2.0;
B2.x = A.x - a/2.0; B2.y = A.y; B2.z = A.z - b/2.0;
B3.x = A.x - a/2.0; B3.y = A.y; B3.z = A.z + b/2.0;
B4.x = A.x + a/2.0; B4.y = A.y; B4.z = A.z + b/2.0;
X = B1.x; Y = B1.y; Z = B1.z;
i = X; k = Z;
while(i >= B2.x)
{
while(k <= B4.z)
{
Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
putpixel(X,Y,color);
k++;
X = i; Y =A.y; Z = k;
}
i--;
X = i; Y = A.y; Z = B1.z; k = Z;
}
}
/***************************/
/** **/
/** 3D空间矩形面 **/
/** 平行于Y-Z平面 **/
/***************************/
void Rect_3DYZ(Point3D A,int a,int b,int color,Point3D B,float qx,float qy,float qz)
{
int i,j,k,X,Y,Z;
Point3D B1,B2,B3,B4;
B1.x = A.x; B1.y = A.y - a/2.0; B1.z = A.z - b/2.0;
B2.x = A.x; B2.y = A.y + a/2.0; B2.z = A.z - b/2.0;
B3.x = A.x; B3.y = A.y + a/2.0; B3.z = A.z + b/2.0;
B4.x = A.x; B4.y = A.y - a/2.0; B4.z = A.z + b/2.0;
X = B1.x; Y = B1.y; Z = B1.z;
j = Y; k = Z;
while(j <= B2.y)
{
while(k <= B4.z)
{
Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
putpixel(X,Y,color);
k++;
X = A.x; Y =j; Z = k;
}
j++;
X = A.x; Y = j; Z = B1.z; k = Z;
}
}
/***************************/
/** **/
/** 3D空间矩形面的旋转 **/
/** 平行于X-Y平面 **/
/***************************/
void Rect_3DXY_XuanZhuan(Point3D A,int a,int b,int color,int q,Point3D D,int flag,Point3D B,float qx,float qy,float qz)
{
int i,j,k,X,Y,Z;
int ii,jj,kk;
Point3D B1,B2,B3,B4;
ii = D.x; jj = D.y; kk = D.z;
B1.x = A.x + b/2.0; B1.y = A.y - a/2.0; B1.z = A.z;
B2.x = A.x + b/2.0; B2.y = A.y + a/2.0; B2.z = A.z;
B3.x = A.x - b/2.0; B3.y = A.y + a/2.0; B3.z = A.z;
B4.x = A.x - b/2.0; B4.y = A.y - a/2.0; B4.z = A.z;
X = B1.x; Y = B1.y; Z = B1.z;
i = X; j = Y;
while(j <= B2.y)
{
while(i >= B4.x)
{
XuanZhuan3D_RY(&X,&Y,&Z,q,ii,jj,kk,flag);
Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
putpixel(X,Y,color);
i--;
X = i; Y = j; Z = B1.z;
}
j++;
X = B1.x; Y = j; Z = B1.z; i = X;
}
}
/***************************/
/** **/
/** 3D空间矩形面的旋转 **/
/** 平行于X-Z平面 **/
/***************************/
void Rect_3DXZ_XuanZhuan(Point3D A,int a,int b,int color,int q,Point3D D,int flag,Point3D B,float qx,float qy,float qz)
{
int i,j,k,X,Y,Z;
int ii,jj,kk;
Point3D B1,B2,B3,B4;
ii = D.x; jj = D.y; kk = D.z;
B1.x = A.x + a/2.0; B1.y = A.y; B1.z = A.z - b/2.0;
B2.x = A.x - a/2.0; B2.y = A.y; B2.z = A.z - b/2.0;
B3.x = A.x - a/2.0; B3.y = A.y; B3.z = A.z + b/2.0;
B4.x = A.x + a/2.0; B4.y = A.y; B4.z = A.z + b/2.0;
X = B1.x; Y = B1.y; Z = B1.z;
i = X; k = Z;
while(i >= B2.x)
{
while(k <= B4.z)
{
XuanZhuan3D_RY(&X,&Y,&Z,q,ii,jj,kk,flag);
Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
putpixel(X,Y,color);
k++;
X = i; Y =A.y; Z = k;
}
i--;
X = i; Y = A.y; Z = B1.z; k = Z;
}
}
/***************************/
/** **/
/** 3D空间矩形面的旋转 **/
/** 平行于Y-Z平面 **/
/***************************/
void Rect_3DYZ_XuanZhuan(Point3D A,int a,int b,int color,int q,Point3D D,int flag,Point3D B,float qx,float qy,float qz)
{
int i,j,k,X,Y,Z;
int ii,jj,kk;
Point3D B1,B2,B3,B4;
ii = D.x; jj = D.y; kk = D.z;
B1.x = A.x; B1.y = A.y - a/2.0; B1.z = A.z - b/2.0;
B2.x = A.x; B2.y = A.y + a/2.0; B2.z = A.z - b/2.0;
B3.x = A.x; B3.y = A.y + a/2.0; B3.z = A.z + b/2.0;
B4.x = A.x; B4.y = A.y - a/2.0; B4.z = A.z + b/2.0;
X = B1.x; Y = B1.y; Z = B1.z;
j = Y; k = Z;
while(j <= B2.y)
{
while(k <= B4.z)
{
XuanZhuan3D_RY(&X,&Y,&Z,q,ii,jj,kk,flag);
Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
putpixel(X,Y,color);
k++;
X = A.x; Y =j; Z = k;
}
j++;
X = A.x; Y = j; Z = B1.z; k = Z;
}
}
/***************************/
/** **/
/** 3D空间三角形 **/
/** 平行于X-Y平面 **/
/***************************/
void SanJiaoxing_3DXY(Point3D A,int a,int h,int color,Point3D B,float qx,float qy,float qz)
{
int X,Y,Z,i,j,k;
Point3D B1,B2,B3;
Point C1,C2,C3,T;
B1.x = A.x + h/2.0; B1.y = A.y - a/2.0; B1.z = A.z;
B2.x = A.x + h/2.0; B2.y = A.y + a/2.0; B1.z = A.z;
B1.x = A.x - h/2.0; B1.y = A.y; B1.z = A.z;
X = B1.x; Y = B1.y; Z = B1.z;
Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
C1.x = X; C1.y = Y;
X = B2.x; Y = B2.y; Z = B2.z;
Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
C2.x = X; C2.y = Y;
X = B3.x; Y = B3.y; Z = B3.z;
Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
C3.x = X; C3.y = Y;
X = B1.x; Y = B1.y; Z = B1.z;
j = B1.y; i = B1.x;
while(j <= B2.y)
{
Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
T.x = X; T.y = Y;
LineDDA(C3,T,color);
j++;
}
}
/***************************/
/** **/
/** 3D空间圆 **/
/** 平行于X-Y平面 **/
/***************************/
/* 3D圆的8对称点的显示 */
void CirclePoints_3DXY(Point3D A,int x,int y,int color,Point3D B,float qx,float qy,float qz)/* 圆心为A;*/
{
int X,Y,Z;
X = x; Y = y; Z = A.z; /*(x, y) */
Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
putpixel(X,Y,color);
X = A.x-A.y+y; Y = A.y-A.x+x; Z = A.z;/*(y, x) */
Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
putpixel(X,Y,color);
X = A.x+A.y-y; Y = A.y-A.x+x; Z = A.z; /*(-y, x) */
Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
putpixel(X,Y,color);
X = 2*A.x-x; Y = y; Z = A.z; /*(-x, y) */
Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
putpixel(X,Y,color);
X = A.x-A.y+y; Y = A.y+A.x-x; Z = A.z; /*(y, -x) */
Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
putpixel(X,Y,color);
X = x; Y = 2*A.y-y; Z = A.z; /*(x, -y) */
Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
putpixel(X,Y,color);
X = 2*A.x-x; Y = 2*A.y-y; Z = A.z; /*(-x,-y) */
Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
putpixel(X,Y,color);
X = A.x+A.y-y; Y = A.y+A.x-x; Z = A.z;/*(-y,-x) */
Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
putpixel(X,Y,color);
}
void Yuan_3DXY(Point3D A,int r,int color,Point3D B,float qx,float qy,float qz)
{
int x,y,d,deltaE,deltaSE,x0,y0,X,Y,Z;
x0 = A.x;
y0 = A.y;
x = x0;
y = y0 + r;
d = 5 - 4*r;
deltaE = 12;
deltaSE = 20 - 8*r;
CirclePoints_3DXY(A,x,y,color,B,qx,qy,qz);
while((y-y0)>(x-x0))
{
if(d<=0)
{
d = d + deltaE;
deltaSE=deltaSE + 8;
}
else
{
d = d + deltaSE;
deltaSE=deltaSE + 16;
y--;
}
deltaE=deltaE + 8;
x++;
CirclePoints_3DXY(A,x,y,color,B,qx,qy,qz);
}
}
/***************************/
/** **/
/** 3D空间圆 **/
/** 平行于X-Z平面 **/
/***************************/
/* 3D圆的8对称点的显示 */
void CirclePoints_3DXZ(Point3D A,int x,int z,int color,Point3D B,float qx,float qy,float qz)/* 圆心为A;*/
{
int X,Y,Z;
X = x; Y = A.y; Z = z; /*(x, z) */
Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
putpixel(X,Y,color);
X = A.x - A.z + z; Y = A.y; Z = A.z - A.x + x; /*(z, x) */
Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
putpixel(X,Y,color);
X = A.x + A.z - z; Y = A.y; Z = A.z - A.x + x;/*(-z, x) */
Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
putpixel(X,Y,color);
X = 2 * A.x - x; Y = A.y; Z = z; /*(-x, z) */
Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
putpixel(X,Y,color);
X = A.x - A.z + z; Y = A.y; Z = A.z + A.x - x; /*(z, -x) */
Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
putpixel(X,Y,color);
X = x; Y = A.y; Z = 2 * A.z - z; /*(x, -z) */
Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
putpixel(X,Y,color);
X = 2 * A.x - x; Y = A.y; Z = 2 * A.z - z; /*(-x,-z) */
Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
putpixel(X,Y,color);
X = A.x + A.z - z; Y = A.y; Z = A.z + A.x - x; /*(-z,-x) */
Point3D_2D(&X,&Y,&Z,B,qx,qy,qz);
putpixel(X,Y,color);
}
void Yuan_3DXZ(Point3D A,int r,int color,Point3D B,float qx,float qy,float qz)
{
int x,z,d,deltaE,deltaSE,x0,z0,X,Y,Z;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -