帮你复制一份我学习时老师给的画线两例:
#include<graphics.h>
#include<math.h>
/*
###############################################################################
功 能:本函数的作用是用逐点比较法来画一条直线
格 式:void myline1(int x1,int y1,int x2,int y2,int color)
参数说明:x1,y1是起始点坐标,x2,y2是终止点,color是画线的颜色
调用示例:myline1(10,20,500,440,4)
###############################################################################
*/
void myline1(int x1,int y1,int x2,int y2,int color)
{
/*变量定义开始(2007/10/16增加)*/
int iTx/*x轴终点的相对坐标xa或临时变量*/
int iTy/*y轴终点的相对坐标ya或临时变量*/
int iDx/*x轴方向的步长dx*/
int iDy/*y轴方向的步长dy*/
int iFt/*偏差Fm*/
int iSt/*记数循环数(dx+dy)S*/
int iXt/*x方向循环变量xm*/
int iYt/*y方向循环变量ym*/
/*变量定义结束*/
/*变量初始化开始*/
/*如果是第三象限或第四象限则换成第一或第二象限*/
if(y2<y1)
{
iTx=x1
x1=x2
x2=iTx
iTy=y1
y1=y2
y2=iTy
}
iTx=x2-x1/*取x轴的相对坐标*/
iTy=y2-y1/粗李*取y轴的相对坐标*/
iDx=1
iDy=1
iFt=0
iSt=iTx+iTy
if(iTx<0)iSt=-1*iTx+iTy/*如果在第二象限,则x轴方向步长取负值*/
iXt=0
iYt=0
/*变量初始化结束*/
/*数据处理开始*/
while(iSt>0)
{
putpixel(x1+iXt,y1+iYt,color)
if(iTx>=0) /*如果在第一象限*/
{
if(iFt<0) /*如果偏差小于0*/
{
iYt+=iDy/*y方向走一步*/
iFt+=iTx
}
else /睁辩*如果偏差大于或等于0*/
{
iXt+=iDx/*x方向走一步*/
iFt-=iTy
}
}
else
{
if(iFt<0) /*如果偏差小于0*/
{
iXt-=iDx/*负x方向走一步*/
iFt+=iTy
}
else /*如果偏差大于或等于0*/
{
iYt+=iDy/*y方向走一步*/
iFt+=iTx
}
}
iSt--
}
}
/*
###############################################################################
功 能:本函数的悉凳缺作用是用来画一条直线
格 式:void myline2(int x1,int y1,int x2,int y2,int color)
参数说明:x1,y1是起始点坐标,x2,y2是终止点,color是画线的颜色
调用示例:myline2(10,20,500,440,4)
###############################################################################
*/
int myline2(int x1,int y1,int x2,int y2,int color)
{
int iX/*x方向的坐标变量*/
int iY/*y方向的坐标变量*/
int iTx/*x方向的步长变量*/
int iTy/*y方向的步长变量*/
float fDx/*x方向的差分变量*/
float fDy/*y方向的差分变量*/
float fMinf/*算法中的f*/
float fMaxF/*算法中的F*/
float fS/*终点判断变量*/
fMinf=0.5/*f=0.5*/
iX=x1
iY=y1
putpixel(x1,y1,color)
if(x1==x2&&y1==y2) /*如果终点和起始点相同*/
{
return(1)
}
iTx=1
iTy=1
fDx=(float)(x2-x1)
fDy=(float)(y2-y1)
fMaxF=fDy/fDx>0?fDy/fDx:(-fDy/fDx)/*F=|dy/dx|*/
if(fDx<0)iTx=-1
if(fDy<0)iTy=-1
fS=fDx>0?fDx:(-fDx)
if(fMaxF==1) /*如果F=1*/
{
iX=x1
iY=y1
while(fS>0)
{
iX+=iTx/*x方向走一步*/
iY+=iTy/*y方向走一步*/
putpixel(iX,iY,color)
fS--
}
}
else if(fMaxF>1) /*如果F>1*/
{
fS+=fDy>0?fDy:(-fDy)
while(fS>0)
{
iY+=iTy/*y方向走一步*/
putpixel(iX,iY,color)
fMinf+=1/fMaxF/*f=f+1/F*/
fS--
if(fMinf>=1) /*如果f>=1*/
{
iX+=iTx/*x方向走一步*/
fMinf--/*f=f-1*/
putpixel(iX,iY,color)
fS--
}
}
}
else /*如果F<1*/
{
fS+=fDy>0?fDy:(-fDy)
while(fS>0)
{
iX+=iTx/*x方向走一步*/
putpixel(iX,iY,color)
fMinf+=fMaxF/*f=f+F*/
fS--
if(fMinf>=1) /*如果f>=1*/
{
iY+=iTy/*y方向走一步*/
fMinf--/*f=f-1*/
putpixel(iX,iY,color)
fS--
}
}
}
}
Bresenham算法生成直线假定直线从(x1,y1)到(x2,y2),
令dx=x2-x1,dy=y2-y1
不妨设(dx,dy)在第一象限,并且直线的斜率春纳不大于1
画线过程中有三个循环变量
x,y,d
初值
x=x1,y=y1,d=2*dy-dx
循环,直到x==x2为止
{
如果d>=0,y++,d+=2*(dy-dx)
如果d<0 ,x++,d+=2*dy
}
如果(dx,dy)不在第一象限,要做变换,即先把第一象限好森没的画出来友纳
如果斜率大于1,x,y交换
非常简单的,很容易实现
圆的算法:
int Bres(int x0,int y0,double r,int color)
{
int x,y,d
x=0
y=(int)r
d=(int)(3-2*r)
while(x<y)
{
cirpot(x0,y0,x,y,color)
if(d<0)
d+=4*x+6
else
{
d+=4*(x-y)+10
y--
}
x++
}
if(x==y)
cirpot(x0,y0,x,y,color)
return(0)
}
int cirpot(int x0,int y0,int x,int y,int color)
{
setcolor(color)
putxicl((x0+x),(y0+y))
putxicl((x0+y),(y0+x))
putxicl((x0+y),(y0-x))
putxicl((x0+x),(y0-y))
putxicl((x0-x),(y0-y))
putxicl((x0-y),(y0-x))
putxicl((x0-y),(y0+x))
putxicl((x0-x),(y0+y))
setcolor(color)
return(0)
}
这是圆的算法,你若要整个程序,把你的电邮给我,我给你发过去、
运行环境是Turboc 2.0
int Bresline(int x1,inty1,int x2,int y2,int color)
{
int color,itag
int dx,dy,tx,ty,inc1,inc2,d,curx,cury
setcolor(color)
putxicl(x1,y1)
if(x1==x2&&y1==y2)
{
setcolor(color)
return(1)
}
itag=0
dx=abs(x2-x1)
dy=abs(y2-y1)
if(dx<dy)
{
itag=1]
iswap(&x1,&y1)
iswap(&x2,&y2)
iswap(&dx,&dy)
}
tx=(x2-x1)>0? 1:-1
ty=(y2-y1)>0? 1:-1
curx=x1
cury=y1
inc1=2*dy
inc2=2*(dy-dx)
d=inc1-dx
while(curx!x2)
{
if(d<0)
{
d+=inc1
}
else
{
cury+=ty
d+=inc2
}
if(itag)
setpixel(cury,curx)
else
setpixel(curx,cury)
curxd+=tx
}
setcolor(color)
return(0)
}
iswap(int*a,int*b)
{
int tmp
tmp=*a
*a=*b
*b=tmp
}
这是直线的算法:和圆的差不多,你可以参考一下:)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)