📄 4.1-4.2.c
字号:
/*line-circle*/
#include "Conio.h"
#include "graphics.h"
#include "stdio.h"
#include "math.h"
#define closegr closegraph
#define xo 300
#define yo 250
#define DELTA 1.0
#define max 100
/*最大顶点数*/
typedef struct
{int x;
int y;
}Point;
typedef struct
{int pointNum;
Point *vertices;
}Polygon;
void initgr(void) /* BGI初始化 */
{
int gd = DETECT, gm = 0; /* 和gd = VGA,gm = VGAHI是同样效果 */
registerbgidriver(EGAVGA_driver);/* 注册BGI驱动后可以不需要.BGI文件的支持运行 */
initgraph(&gd, &gm, "");
}
/*控制线宽*/
void putpixels(int x,int y,int color,int n)
{ int i,j;
for(i=-n/2;i<=n/2;i++)
for(j=-n/2;j<=n/2;j++)
putpixel(x+j,y+i,color);
}
void putpixelt(int x,int y,int color,int i)
{int a[8]={1,1,1,1,0,0,0,0};
if(a[i%8])putpixel(x,y,color);
}
/*画点*/
void EllipsePoints(int x,int y,int color)
{putpixel(xo+x,yo+y,color);
putpixel(xo-x,yo+y,color);
putpixel(xo+x,yo-y,color);
putpixel(xo-x,yo-y,color);
}
void CirclePoints(int x,int y,int color)
{putpixel(xo+x,yo+y,color);
putpixel(xo+y,yo+x,color);
putpixel(xo-y,yo+x,color);
putpixel(xo-x,yo+y,color);
putpixel(xo+y,yo-x,color);
putpixel(xo+x,yo-y,color);
putpixel(xo-x,yo-y,color);
putpixel(xo-y,yo-x,color);
}
/*画直线*/
void LineDDAwidth(int x0,int y0,int x1,int y1,int color,int n)
{int x;
float dy,dx,y,m;
dx=x1-x0;
dy=y1-y0;
m=dy/dx;
y=y0;
for(x=x0;x<=x1;x++)
{putpixels(x,(int)(y+0.5),color,n);
y+=m;
}
}
void LineDDAdash(int x0,int y0,int x1,int y1,int color)
{int x,i=0;
float dy,dx,y,m;
dx=x1-x0;
dy=y1-y0;
m=dy/dx;
y=y0;
for(x=x0;x<=x1;x++)
{putpixelt(x,(int)(y+0.5),color,i++);
y+=m;
}
}
void MidPointLine(int x0,int y0,int x1,int y1,int color)
{int dx,dy,incrE,incrNE,d,x,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);
if(dy<dx)
{
while(x<x1)
{if(d>0)
d+=incrE;
else
{d+=incrNE;
y++;
}
x++;
putpixel(x,y,color);
}
}
else
{d=dy-2*dx;
incrE=-2*dx;
incrNE=2*(dy-dx);
x=x0,y=y0;
putpixel(x,y,color);
while(y<y1)
{if(d>0)
d+=incrE;
else
{d+=incrNE;
x++;
}
y++;
putpixel(x,y,color);
}
}
}
/*画圆*/
void MidPointCircle(int radius,int color)
/*生成圆弧的中点算法*/
{int x,y;
float d;
x=0;
y=radius;
d=5.0/4-radius;
CirclePoints(x,y,color);
while(y>x)
{if(d<=0)
d+=2.0*x+3;
else
{d+=2.0*(x-y)+5;
y--;
}
x++;
CirclePoints(x,y,color);
}
}
void MidPointCircle1(int radius,int color)
/*消除了乘法运算的中点算法*/
{int x,y,d,E=12,SE=20-8*radius;
x=0;
y=radius;
d=5-4*radius;
CirclePoints(x,y,color);
while(y>x)
{if(d<=0)
{d+=E;
SE+=8;}
else
{d+=SE;
SE+=16;
y--;
}
E+=8;
x++;
CirclePoints(x,y,color);
}
}
void PositiveNegativeArc(int radius,int color)
/* 正负法生成圆弧 */
{int x,y,d;
x=0;
y=radius;
EllipsePoints(x,y,color);
x=1;
EllipsePoints(x,y,color);
d=1;
while(y>=0)
{if(d>=0)
{d=d-2*y+1;
y--;
}
else
{d=d+2*x+1;
x++;
}
EllipsePoints(x,y,color);
}
}
/*多边形迫近法生成多边形*/
Polygon *CircleToPolygon(int radius,Polygon *polygon)
{int i,n;
float x,y,xnew,ynew,cos1,sin1,alfa;
/* 计算圆心角和边数n */
alfa=2*acos(((float)radius-DELTA)/(float)radius);
n=(int)(2*3.1415926/alfa+0.5);
/* 分配记录多边形顶点所需要的空间 */
polygon->pointNum=n;
polygon->vertices=(Point *)malloc(n*sizeof(Point));
/* 由递推式求解顶点 */
x=0.0;
y=(float)radius;
polygon->vertices[0].x=0;
polygon->vertices[0].y=radius;
cos1=cos(alfa);
sin1=sin(alfa);
for(i=1;i<n;i++)
{xnew=cos1*x-sin1*y;
ynew=sin1*x+cos1*y;
x=xnew;
y=ynew;
polygon->vertices[i].x=(int)(x+0.5);
polygon->vertices[i].y=(int)(y+0.5);
}
printf("%d",n); /*n边形*/
return(polygon);
}
void CircleToPolygonDraw(int radius,int color)
{ int i=0;
Polygon *polygon=NULL;
CircleToPolygon(radius,polygon);
setcolor(color);
for(i=0;i<polygon->pointNum-1;i++)
{ line(xo+polygon->vertices[i].x, yo+polygon->vertices[i].y,xo+polygon->vertices[i+1].x,
yo+polygon->vertices[i+1].y);}
line(xo+polygon->vertices[i].x, yo+polygon->vertices[i].y,
xo+polygon->vertices[0].x, yo+polygon->vertices[0].y);
}
main()
{
initgr(); /* BGI初始化 */
LineDDAwidth(10,50,160,200,14,5);
LineDDAdash(50,50,200,200,15);
MidPointLine(100,50,250,200,2);
MidPointCircle1(100,3);
PositiveNegativeArc(150,4);
CircleToPolygonDraw(200,5);
getch(); /* 暂停一下,看看前面绘图代码的运行结果 */
closegr(); /*恢复TEXT屏幕模式 */
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -