📄 3dgraphics1.c
字号:
Y = y;
XuanZhuan(&X,&Y,q);
putpixel(X,Y,color);
X = x2;
Y = y;
XuanZhuan(&X,&Y,q);
putpixel(X,Y,color);
y++;
}
}
/******************************/
/* */
/* 椭圆的平移 */
/* */
/******************************/
/*平移后椭圆的4对称点的显示*/
void EllipsePoints_PinYi(int x0,int y0,int x,int y,int color,int tx,int ty) /*椭圆的中心为:(x0,y0)*/
{
int X,Y;
X = x;
Y = y;
PinYi(&X,&Y,tx,ty);
putpixel(X,Y,color); /*(x, y)*/
X = 2*x0-x;
Y = y;
PinYi(&X,&Y,tx,ty);
putpixel(X,Y,color); /*(-x, y)*/
X = 2*x0-x;
Y = 2*y0-y;
PinYi(&X,&Y,tx,ty);
putpixel(X,Y,color); /*(-x,-y)*/
X = x;
Y = 2*y0-y;
PinYi(&X,&Y,tx,ty);
putpixel(X,Y,color); /*(x, -y)*/
}
/* 椭圆的平移*/
void MidPointEllipse_PinYi(TuoYuan E,int tx,int ty)
{
int x,y,xP,yP,x0,y0,a,b,color;
float d,squrarea,squrareb;
a = E.a;
b = E.b;
color = E.color;
x0 = E.o.x;
y0 = E.o.y;
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_PinYi(x0,y0,x,y,color,tx,ty);
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_PinYi(x0,y0,x,y,color,tx,ty);
}
/* 生成下半部椭圆*/
x = x0 + a;
y = y0;
d = 4 * (squrarea - squrareb * a) + squrareb;
EllipsePoints_PinYi(x0,y0,x,y,color,tx,ty);
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_PinYi(x0,y0,x,y,color,tx,ty);
}
}
/******************************/
/* */
/* 椭圆的旋转 */
/* */
/******************************/
/* 椭圆旋转后的4对称点的显示 */
void EllipsePoints_XuanZhuan(int m,int n,int x0,int y0,int x,int y,int color,float q) /*椭圆的中心为:(x0,y0),绕点(m,n)旋转*/
{
int X,Y;
X = x;
Y = y;
XuanZhuan_RY(m,n,&X,&Y,q);
putpixel(X,Y,color); /*(x, y) */
X = 2*x0-x;
Y = y;
XuanZhuan_RY(m,n,&X,&Y,q);
putpixel(X,Y,color); /*(-x, y) */
X = 2*x0-x;
Y = 2*y0-y;
XuanZhuan_RY(m,n,&X,&Y,q);
putpixel(X,Y,color); /*(-x,-y) */
X = x;
Y = 2*y0-y;
XuanZhuan_RY(m,n,&X,&Y,q);
putpixel(X,Y,color); /*(x, -y) */
}
/* 椭圆的旋转 */
MidPointEllipse_XuanZhuan(TuoYuan E,Point A,float q) /*绕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_XuanZhuan(m,n,x0,y0,x,y,color,q);
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_XuanZhuan(m,n,x0,y0,x,y,color,q);
}
/* 生成下半部椭圆*/
x = x0 + a;
y = y0;
d = 4 * (squrarea - squrareb * a) + squrareb;
EllipsePoints_XuanZhuan(m,n,x0,y0,x,y,color,q);
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_XuanZhuan(m,n,x0,y0,x,y,color,q);
}
}
/******************************/
/* */
/* 椭圆的放缩 */
/* */
/******************************/
/* 椭圆放缩后的4对称点的显示 */
void EllipsePoints_FangSuo(int m,int n,int x0,int y0,int x,int y,int color,float sx,float sy) /*椭圆的中心为:(x0,y0),以(m,n)为参考点放缩*/
{
int X,Y;
X = x;
Y = y;
FangSuo_RY(m,n,&X,&Y,sx,sy);
putpixel(X,Y,color); /*(x, y) */
X = 2*x0-x;
Y = y;
FangSuo_RY(m,n,&X,&Y,sx,sy);
putpixel(X,Y,color); /*(-x, y) */
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);
}
}
/***************************/
/**** ****/
/**** 图形显示函数 ****/
/**** ****/
/***************************/
/** 显示一条直线 **/
void Show_L(Line L)
{
LineDDA(L.A,L.B,L.color);
}
/** 显示一个圆 **/
void Show_C(Yuan C)
{
MidPointCircle_3((C.o),C.r,C.color);
}
/** 显示一个椭圆 **/
void Show_E(TuoYuan E)
{
MidPointEllipse(E.o,E.a,E.b,E.color);
}
/** 显示一个球 **/
void Show_Q(Qiu Q)
{
QiuEC(Q.o,Q.r,Q.color);
}
/** 显示一个矩形 **/
void Show_R(Rect R)
{
Rectangle(R.LeftTop,R.RightDown,R.color);
}
/** 显示一个长方体**/
void Show3D_Cf(CFT C,float q,float qx,float qy,float qz)/*观察方向为(qx,qy,qz)*/
{
Cft3D(C.A,C.a,C.b,C.h,q,qx,qy,qz);
}
/** 显示一个四棱锥**/
void Show3D_S(SLZ S,float qx,float qy,float qz)
{
Slz3D(S.A,S.h,S.r,qx,qy,qz);
}
/** 显示一个藄三棱柱**/
void Show3D_SLZU(SLZU Sz,float qx,float qy,float qz)
{
SLZU3D(Sz.A,Sz.r,Sz.h,qx,qy,qz);
}
main()
{
int i;
float k,h;
Point PointA,PointB;
Point * P;
Line L1,L2;
Yuan C1,C2;
TuoYuan E1,E2,E3,E4;
Qiu Q1,Q2,Q3;
Rect R1,R2;
Point3D D1,D2,D3;
CFT Cf1,Cf2;
SLZ S1,S2;
SLZU Sz1,Sz2;
int graphdriver = DETECT,graphmode;
initgraph(&graphdriver,&graphmode,"");
PointA.x = 550,PointA.y = 100;PointB.x = 100,PointB.y = 100;
L1.A = PointA;
L1.B = PointB;
L1.color = 2;
/* Show_L(L1);
MidPointLine(L1.A,L1.B,15);*/
C1.o.x = 300;
C1.o.y = 300;
C1.r = 60;
C1.color = 11;
C1.color = 4;
/*Show_C(C1);*/
PointA.x = 300;
PointA.y = 240;
k = 0.001;
while(0)
{
C1.color = 0;
MidPointCircle_CuoQie(C1,PointA,k - 0.001,0);
C1.color = 4;
MidPointCircle_CuoQie(C1,PointA,k,0);
k = k + 0.001;
}
E1.o.x = 250;
E1.o.y = 250;
E1.a = 60; E1.b = 30;
E1.color = 11;
/* Show_E(E1);*/
E2.o.x = 380;
E2.o.y = 250;
E2.a = 60; E2.b = 30;
E2.color = 11;
/* Show_E(E2); */
E3.o.x = 315;
E3.o.y = 180;
E3.a = 30; E3.b = 60;
E3.color = 11;
/* Show_E(E3); */
E4.o.x = 315;
E4.o.y = 320;
E4.a = 30; E4.b = 60;
E4.color = 11;
/* Show_E(E4);
PointA.x = 315;
PointA.y = 248;
R1.LeftTop.x = 313;
R1.LeftTop.y = 248;
R1.RightDown.x = 319;
R1.RightDown.y = 450;
R1.color = 2;
Show_R(R1);*/
k = 1;
while(0)
{
E1.color = 0;
E2.color = 0;
E3.color = 0;
E4.color = 0;
MidPointEllipse_XuanZhuan(E1,PointA,k-1);
MidPointEllipse_XuanZhuan(E2,PointA,k-1);
MidPointEllipse_XuanZhuan(E3,PointA,k-1);
MidPointEllipse_XuanZhuan(E4,PointA,k-1);
Show_R(R1);
E1.color = 11;
E2.color = 11;
E3.color = 11;
E4.color = 11;
MidPointEllipse_XuanZhuan(E1,PointA,k);
MidPointEllipse_XuanZhuan(E2,PointA,k);
MidPointEllipse_XuanZhuan(E3,PointA,k);
MidPointEllipse_XuanZhuan(E4,PointA,k);
k = k + 1;
}
PointB.x =190 ;
PointB.y = 250;
E1.color = 4;
/* MidPointEllipse_FangSuo(E1,PointB,2,2);
MidPointEllipse_PinYi(E1,150,0);*/
Q1.o.x = 500;
Q1.o.y = 400;
Q1.r = 60;
Q1.color = 11;
/* Show_Q(Q1);
R1.LeftTop.x = 50;
R1.LeftTop.y = 150;
R1.RightDown.x = 300;
R1.RightDown.y = 200;
R1.color = 11;
Show_R(R1);
Rectangle_XuanZhuan(R1,32);
S1.A.x = 350;
S1.A.y = 250;
S1.A.z = 100;
S1.r = 400;
S1.h = 100;
Show3D_S(S1,45,45,60);*/
Cf1.A.x = 350;
Cf1.A.y = 250;
Cf1.A.z = 200;
Cf1.a = 200;
Cf1.b = 300;
Cf1.h = 200;
Show3D_Cf(Cf1,-15,50,40,35);
Sz1.A.x = 350;
Sz1.A.y = 250;
Sz1.A.z = 130;
Sz1.r = 300;
Sz1.h = 350;
Show3D_SLZU(Sz1,50,40,35);
getch();
closegraph();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -