📄 3dgraphics4.c
字号:
}
x++;
putpixel(y,x,color);
}
}
}
if(A.x==B.x)
{
if(A.y<=B.y)
{
x0 = A.x;
y0 = A.y;
while(y0<=B.y)
{
putpixel(x0,y0,color);
y0 = y0 +1;
}
}
else
{
x0 = B.x;
y0 = B.y;
while(y0<=A.y)
{
putpixel(x0,y0,color);
y0 = y0 +1;
}
}
}
}
/*********************/
/* 圆的中点算法 */
/*********************/
/* 圆的8对称点的显示 */
void CirclePoints(int x0,int y0,int x,int y,int color)/* 圆心为(x0,y0);*/
{
putpixel(x,y,color); /*(x, y) */
putpixel(x0-y0+y,y0-x0+x,color); /*(y, x) */
putpixel(x0+y0-y,y0-x0+x,color); /*(-y, x) */
putpixel(2*x0-x,y,color); /*(-x, y) */
putpixel(x0-y0+y,y0+x0-x,color); /*(y, -x) */
putpixel(x,2*y0-y,color); /*(x, -y) */
putpixel(2*x0-x,2*y0-y,color); /*(-x,-y) */
putpixel(x0+y0-y,y0+x0-x,color); /*(-y,-x) */
}
/* 算法 1:圆的中点算法 */
void MidPointCircle_1(Point Q,int radius,int color)/* 圆心为 Q */
{
int x,y,x0,y0;
float d;
x0 = Q.x;
y0 = Q.y;
x = x0;
y = y0+radius;
d = 5.0/4.0 - radius;
CirclePoints(x0,y0,x,y,color);
while((y-y0)>(x-x0))
{
if(d<=0)
d = d + 2.0*(x-x0) + 3;
else
{
d = d + 2.0*((x-x0)-(y-y0)) + 5;
y--;
}
x++;
CirclePoints(x0,y0,x,y,color);
}
}
/* 算法 2 :消除了浮点运算的中点算法 */
void MidPointCircle_2(Point Q,int radius,int color)/* 圆心为(x0,y0);*/
{
int x,y,d,x0,y0;
x0 = Q.x;
y0 = Q.y;
x = x0;
y = y0 + radius;
d = 5 - 4*radius;
CirclePoints(x0,y0,x,y,color);
while((y-y0)>(x-x0))
{
if(d<=0)
d = d + 8*(x-x0) + 12;
else
{
d = d + 8*((x-x0)-(y-y0)) + 20;
y--;
}
x++;
CirclePoints(x0,y0,x,y,color);
}
}
/* 算法 3 :消除了乘法运算的中点算法 */
void MidPointCircle_3(Point Q,int radius,int color)/* 圆心为(x0,y0);*/
{
int x,y,d,deltaE,deltaSE,x0,y0;
x0 = Q.x;
y0 = Q.y;
x = x0;
y = y0 + radius;
d = 5 - 4*radius;
deltaE = 12;
deltaSE = 20 - 8*radius;
CirclePoints(x0,y0,x,y,color);
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(x0,y0,x,y,color);
}
}
/***********************/
/* 椭圆的中点算法 */
/***********************/
/* 椭圆的4对称点的显示 */
void EllipsePoints(int x0,int y0,int x,int y,int color) /*椭圆的中心为:(x0,y0)*/
{
putpixel(x,y,color); /*(x, y) */
putpixel(2*x0-x,y,color); /*(-x, y) */
putpixel(2*x0-x,2*y0-y,color); /*(-x,-y) */
putpixel(x,2*y0-y,color); /*(x, -y) */
}
/* 椭圆的中点算法 */
void MidPointEllipse(Point Q,int a,int b,int color)
{
int x,y,xP,yP,x0,y0;
float d,squrarea,squrareb;
x0 = Q.x;
y0 = Q.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(x0,y0,x,y,color);
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(x0,y0,x,y,color);
}
/* 生成下半部椭圆*/
x = x0 + a;
y = y0;
d = 4 * (squrarea - squrareb * a) + squrareb;
EllipsePoints(x0,y0,x,y,color);
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(x0,y0,x,y,color);
}
}
/***********************/
/* 矩形的算法 */
/***********************/
void Rectangle(Point LeftTop,Point RightDown,int color)
{
int x1,y1,x2,y2,x,y;
x1 = LeftTop.x;
x2 = RightDown.x;
y1 = LeftTop.y;
y2 = RightDown.y;
x = x1;
while(x<=x2)
{
putpixel(x,y1,color);
putpixel(x,y2,color);
x++;
}
y = y1;
while(y<=y2)
{
putpixel(x1,y,color);
putpixel(x2,y,color);
y++;
}
}
/*************************/
/****** 网格球 *****/
/*************************/
void QiuEC(Point o,int r,int color) /* 球心为(x,y) */
{
float i,X,Y,ra,rb;
int k,x,y;
x = o.x;
y = o.y;
MidPointEllipse(o,r,15,color);
MidPointCircle_1(o,r,color);
for(i=1;i<=(r/5);i++)
{
MidPointEllipse(o,5*i,r,color);
}
k = (int)(r/4);
for(i=1;i<4;i++)
{
o.y = y-(4-i)*k;
MidPointEllipse(o,sqrt(2*r*(k*i)-k*i*k*i),i*4,color);
o.y = y+(4-i)*k;
MidPointEllipse(o,sqrt(2*r*(k*i)-k*i*k*i),i*4,color);
}
}
/*****************************/
/** **/
/** 矩形的旋转 **/
/** **/
/*****************************/
void Rectangle_XuanZhuan(Rect R,float q)
{
int x1,y1,x2,y2,x,y,color,X,Y;
color = R.color;
x1 = R.LeftTop.x;
y1 = R.LeftTop.y;
x2 = R.RightDown.x;
y2 = R.RightDown.y;
x = x1;
while(x<=x2)
{
X = x;
Y = y1;
XuanZhuan(&X,&Y,q);
putpixel(X,Y,color);
X = x;
Y = y2;
XuanZhuan(&X,&Y,q);
putpixel(X,Y,color);
x++;
}
y = y1;
while(y<=y2)
{
X = x1;
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) */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -