cc++实现控制台下字符画直线和画圆.docx
《cc++实现控制台下字符画直线和画圆.docx》由会员分享,可在线阅读,更多相关《cc++实现控制台下字符画直线和画圆.docx(13页珍藏版)》请在冰豆网上搜索。
cc++实现控制台下字符画直线和画圆
c/c++实现控制台下字符画直线,画圆
DDA画直线法,DDA算法原理:
ε=1/max(|△x|,|△y|)
中点BH画圆法
八分法
首先解决八分之一圆弧
算法步骤:
1.输入圆的半径R。
2.计算初始值d=1.25-R、x=0、y=R。
3.绘制点(x,y)及其在八分圆中的另外七个对称点。
4.判断d的符号。
若d≤0,则先将d更新为d+2x+3,再将(x,y)更新为(x+1,y);否则先将d更新为d+2(x-y)+5,再将(x,y)更新为(x+1,y-1)。
5.当x否则结束。
改进:
用d-0.25代替d
算法步骤:
1.输入圆的半径R。
2.计算初始值d=1-R、x=0、y=R。
3.绘制点(x,y)及其在八分圆中的另外七个对称点。
4.判断d的符号。
若d≤0,则先将d更新为d+2x+3,再将(x,y)更新为(x+1,y);否则先将d更新为d+2(x-y)+5,再将(x,y)更新为(x+1,y-1)。
5.当x否则结束。
源代码:
DDA画直线:
#include
#include
usingnamespacestd;
intarr[100][100];
voiddrawLine(intx0,inty0,intx1,inty1)
{
intymax=y1;
intymin=y0;
if(y0>y1){
ymax=y0;
ymin=y1;
}
intxmax=x0;
if(x1>x0)xmax=x1;
for(intj=ymin;j{
for(inti=0;i{
if(arr[i][j]==1)cout<<"*";
elsecout<<"";
}
cout<}
cout<}
voidDDAline(intx0,inty0,intx1,inty1)
{
intdx,dy,epsl,k;
floatx,y,xIncre,yIncre;
dx=x1-x0;dy=y1-y0;x=x0;y=y0;
if(abs(dx)>abs(dy))epsl=abs(dx);
elseepsl=abs(dy);
xIncre=(float)(dx)/epsl;
yIncre=(float)(dy)/epsl;
for(k=0;k<=epsl;k++)
{
inttx=(int)(x+0.5);
intty=(int)(y+0.5);
arr[tx][ty]=1;
//putpixel((int)(x+0.5),(int)(y+0.5));
x+=xIncre;
y+=yIncre;
}
drawLine(x0,y0,x1,y1);
}
intmain()
{
intx0,y0,x1,y1;
while(true)
{
cout<<"请输入第一个点的x,y值:
";
cin>>x0>>y0;
cout<<"请输入第二个点的x,y值:
";
cin>>x1>>y1;
if(y0>y1)//交换值使得y1在y0下面
{
inttemp=y1;
y1=y0;
y0=temp;
temp=x1;
x1=x0;
x0=temp;
}
drawLine(x0,y0,x1,y1);
}
return0;
}
中点BH画圆法
#include
intarr[100];//存储由算法找到的第一象限y>=x区间的所有的圆点坐标
intarrXY[100][100];//存储最终的圆点矩阵
//intr:
r为要画的圆半径
voidCircle(intr,intnumOfarr)
{
intx,y;
//找到其他划分区间的圆点坐标,在存储矩阵上标记
for(inti=0;i{
//-x,-y
if(i==0)x=r;
elsex=-i+r;
y=-arr[i]+r;
arrXY[x][y]=1;
//-y,-x
if(i==0)y=r;
elsey=-i+r;
x=-arr[i]+r;
arrXY[x][y]=1;
//y,-x
if(i==0)y=r;
elsey=-i+r;
x=arr[i]+r;
arrXY[x][y]=1;
//x,-y
if(i==0)x=r;
elsex=i+r;
y=-arr[i]+r;
arrXY[x][y]=1;
//x,y
if(i==0)x=r;
elsex=i+r;
y=arr[i]+r;
arrXY[x][y]=1;
//y,x
if(i==0)y=r;
elsey=i+r;
x=arr[i]+r;
arrXY[x][y]=1;
//-y,x
if(i==0)y=r;
elsey=i+r;
x=-arr[i]+r;
arrXY[x][y]=1;
//-x,y
if(i==0)x=r;
elsex=-i+r;
y=arr[i]+r;
arrXY[x][y]=1;
}
for(inti=0;i<=2*r;i++)
{
for(intj=0;j<=2*r;j++)
{
if(arrXY[j][i]<=0)printf("");
elseif(arrXY[j][i]==1)printf("*");
elseprintf("+");
}
printf("\n");
}
}
voidDraw(intr)
{
intx=0,y=r,d=1-r;
while(x<=y)
{
arr[x]=y;//存储坐标,
if(d<0)d+=2*x+3;
else{
d+=2*(x-y)+5;
y--;
}
x++;
}
Circle(r,x);
printf("\n");
return;
}
intmain()
{
intr=25;
printf("请输入圆半径:
");
scanf("%d",&r);
Draw(r);
return0;
}