📄 tuxing3.c
字号:
#include"stdio.h";
#include"graphics.h"
#include"math.h"
#include"dos.h"
#include"time.h"
/********************/
/* */
/* 二维图形 */
/* */
/********************/
typedef struct Point /* 点 */
{
int x;
int y;
}Point;
typedef struct Line /* 线 */
{
Point A;/*起点*/
Point B;/*终点*/
int color; /*颜色*/
}Line;
typedef struct Yuan /* 圆 */
{
Point o; /*圆心*/
int r; /*半径*/
int color;/*颜色*/
}Yuan;
typedef struct TuoYuan /*椭 圆*/
{
Point o;/*中心*/
int a; /*长轴*/
int b; /*短轴*/
int color;/*颜色*/
}TuoYuan;
typedef struct Qiu /* 球 */
{
Point o;/*中心*/
int r;
int color; /*颜色*/
}Qiu;
typedef struct Rect /* 矩形*/
{
Point LeftTop;
Point RightDown;
int color;
}Rect;
/********************************/
/**** 二维基本变换 ******/
/********************************/
/* 点的平移变换 */
void PinYi(int * x,int * y,int tx,int ty)
{
*x = *x + tx;
*y = *y + ty;
}
/* 点的旋转变换 */
void XuanZhuan(int * x,int * y,float q)
{
int m ;
int n;
float Q;
Q = (3.1415926/180)*q;
m = (*x);
n = (*y);
*x = m * cos(Q) - n * sin(Q);
*y = m * sin(Q) + n * cos(Q);
}
/* 绕任意点的旋转变换 */
void XuanZhuan_RY(int m,int n,int * x,int * y,float q)/* 绕(m,n)的旋转*/
{
PinYi(x,y,-m,-n);
XuanZhuan(x,y,q);
PinYi(x,y,m,n);
}
/* 点的放缩变换 */
void FangSuo(int * x,int * y,float sx,float sy)
{
*x =*x * sx;
*y =*y * sy;
}
/* 以任意点的放缩变换 */
void FangSuo_RY(int m,int n,int * x,int * y,float sx,float sy) /*以(m,n)为参考点*/
{
PinYi(x,y,-m,-n);
FangSuo(x,y,sx,sy);
PinYi(x,y,m,n);
}
/* 点的错切变换 */
void CuoQie(int * x,int * y,float q,int flag)
{
float Q;
Q = (3.1415926/180) * q;
if(flag==0)/* y为依赖轴 */
{
*x = *x + tan(Q)*(*y);
*y = *y;
}
else
{
*y = *y + tan(Q)*(*x);
*x = *x;
}
}
/* 以任意点的错切变换 */
void CuoQie_RY(int m,int n,int * x,int * y,float q,int flag) /* 以为(m,n)参考点*/
{
PinYi(x,y,-m,-n);
CuoQie(x,y,q,flag);
PinYi(x,y,m,n);
}
/***********************/
/* */
/* 三维图形 */
/* */
/***********************/
typedef struct Point3D /* 点 */
{
int x;
int y;
int z;
}Point3D;
typedef struct ZFT /*正方体*/
{
Point3D A;/*正方体的中心*/
int r; /* 边长 */
int color;/* 第一面颜色 */
}ZFT;
/********************************/
/**** ******/
/**** 三维基本变换 ******/
/**** ******/
/********************************/
/* 点的平移变换 */
void PinYi3D(int * x,int * y,int * z,int tx,int ty,int tz)
{
*x = *x + tx;
*y = *y + ty;
*z = *z + tz;
}
/* 点旋转变换 */
void XuanZhuan3D(int * x,int * y,int *z,float q,int flag)
{
int m,n,t;
float Q;
m = (*x);
n = (*y);
t = (*z);
Q = (3.1415926/180)*q;
if(flag==1) /* 绕x轴旋转*/
{
*x = *x;
*y = n * cos(Q) - t * sin(Q);
*z = n * sin(Q) + t * cos(Q);
}
if(flag==2) /* 绕y轴旋转*/
{
*x = m * cos(Q) + t * sin(Q);
*y = *y;
*z = -m * sin(Q) + t * cos(Q);
}
if(flag==3) /* 绕z轴旋转*/
{
*x = m * cos(Q) - n * sin(Q);
*y = m * sin(Q) + n * cos(Q);
*z = *z;
}
}
/* 以任意轴 的点的旋转变换 */
void XuanZhuan3D_RY(int * x,int * y,int *z,float q,int flag,int s)
{
if(flag==1) /* 绕x = s 轴旋转*/
{
PinYi3D(x,y,z,-s,0,0);
XuanZhuan3D(x,y,z,q,flag);
PinYi3D(x,y,z,s,0,0);
}
if(flag==2) /* 绕y = s轴旋转*/
{
PinYi3D(x,y,z,0,-s,0);
XuanZhuan3D(x,y,z,q,flag);
PinYi3D(x,y,z,0,s,0);
}
if(flag==3) /* 绕z = s轴旋转*/
{
PinYi3D(x,y,z,0,0,-s);
XuanZhuan3D(x,y,z,q,flag);
PinYi3D(x,y,z,0,0,s);
}
}
/* 点放缩变换 */
void FangSuo3D(int * x,int * y,int * z,float sx,float sy,float sz)
{
*x =*x * sx;
*y =*y * sy;
*z =*z * sz;
}
/* 以任意点的放缩变换 */
void FangSuo3D_RY(int m,int n,int t,int * x,int * y,int *z,float sx,float sy,float sz) /*以(m,n,t)为参考点*/
{
PinYi3D(x,y,z,-m,-n,-t);
FangSuo3D(x,y,z,sx,sy,sz);
PinYi3D(x,y,z,m,n,t);
}
/************************/
/* */
/* 三维坐标系的旋转变换 */
/* */
/************************/
void XuanZhuan3D_ZBX(int * x,int * y,int *z,float q,int flag)
{
int m,n,t;
float Q;
m = (*x);
n = (*y);
t = (*z);
Q = (3.1415926/180 )*q;
if(flag==1) /* x,y轴的旋转*/
{
*x = m * cos(Q) + n * sin(Q);
*y = m * cos(Q) - n * sin(Q);
*z = *z;
}
if(flag==2) /* y,z的轴旋转*/
{
*x = *x;
*y = n * cos(Q) + t * sin(Q);
*z = n * sin(Q) - t * cos(Q);
}
if(flag==3) /* z,x的轴旋转*/
{
*x = t * sin(Q) - m * cos(Q);
*y = *y;
*z = t * cos(Q) + m * sin(Q);
}
}
/********************************/
/* */
/* 三维空间点到二维平面点的投影 */
/* */
/********************************/
void Point3D_2D(int * x,int * y,int * z,float qx,float qy,float qz)/*投影方向为(qx,qy,qz)*/
{
XuanZhuan3D_ZBX(x,y,z,qx,1);
XuanZhuan3D_ZBX(x,y,z,qz,2);
}
/***********************/
/* 直线的DDA 算法 */
/***********************/
void LineDDA(Point A,Point B,int color)
{
int x0,y0,x1,y1,x;
float dy,dx,y,m;
if(A.x<B.x)
{
x0 = A.x;
y0 = A.y;
x1 = B.x;
y1 = B.y;
dx = x1 - x0;
dy = y1 - y0;
m = dy/dx;
y = y0;
for(x = x0;x <= x1;x++)
{
putpixel(x,(int)(y + 0.5),color);
y = y + m;
}
}
if(A.x>B.x)
{
x0 = B.x;
y0 = B.y;
x1 = A.x;
y1 = A.y;
dx = x1 - x0;
dy = y1 - y0;
m = dy/dx;
y = y0;
for(x = x0;x <= x1;x++)
{
putpixel(x,(int)(y + 0.5),color);
y = y + m;
}
}
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;
}
}
}
}
/***********************/
/* 直线的中点算法 */
/***********************/
void MidPointLine(Point A,Point B,int color)
{
int dx,dy,incrE,incrNE,d,x,y,x0,y0,x1,y1;
x0 = A.x;
y0 = A.y;
x1 = B.x;
y1 = B.y;
dx = x1 - x0;
dy = y1 - y0;
d = dx - 2 * dy;
incrE = -2 * dy;
incrNE = 2 * (dx - dy);
x = x0,y = y0;
putpixel(x,y,color);
while(x < x1)
{
if(d > 0)
d = d + incrE;
else
{
d = d + incrNE;
y++;
}
x++;
putpixel(x,y,color);
}
}
/*********************/
/* 圆的中点算法 */
/*********************/
/* 圆的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 Zft3D(Point3D A,int r,int color,float qx,float qy,float qz) /* 观察方向为(qx,qy,qz)*/
{
int x,y,z,X,Y,Z;
Point3D B1,B2,B3,B4,B5,B6,B7,B8;
Point A1,A2,A3,A4,A5,A6,A7,A8;
x = A.x;
y = A.y;
z = A.z;
B1.x = x + r/2.0; B1.y = y - r/2.0; B1.z = z - r/2.0;
B2.x = x + r/2.0; B2.y = y + r/2.0; B2.z = z - r/2.0;
B3.x = x - r/2.0; B3.y = y + r/2.0; B3.z = z - r/2.0;
B4.x = x - r/2.0; B4.y = y - r/2.0; B4.z = z - r/2.0;
B5.x = x + r/2.0; B5.y = y - r/2.0; B5.z = z + r/2.0;
B6.x = x + r/2.0; B6.y = y + r/2.0; B6.z = z + r/2.0;
B7.x = x - r/2.0; B7.y = y + r/2.0; B7.z = z + r/2.0;
B8.x = x - r/2.0; B8.y = y - r/2.0; B8.z = z + r/2.0;
X = B1.x; Y = B1.y; Z = B1.z;
Point3D_2D(&X,&Y,&Z,qx,qy,qz);
A1.x = X; A1.y = Y;
putpixel(X,Y,color);
X = B2.x; Y = B2.y; Z = B2.z;
Point3D_2D(&X,&Y,&Z,qx,qy,qz);
A2.x = X; A2.y = Y;
putpixel(X,Y,color);
X = B3.x; Y = B3.y; Z = B3.z;
Point3D_2D(&X,&Y,&Z,qx,qy,qz);
A3.x = X; A3.y = Y;
putpixel(X,Y,color);
X = B4.x; Y = B4.y; Z = B4.z;
Point3D_2D(&X,&Y,&Z,qx,qy,qz);
A4.x = X; A4.y = Y;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -