求一用C语言画直线的程序

求一用C语言画直线的程序,第1张

C语言的话画直线用MoveTo()和LineTo()很简单啊。

帮你复制一份我学习时老师给的画线两例:

#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

}

这是直线的算法:和圆的差不多,你可以参考一下:)


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12553368.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存