您的位置:首页 > 其它

中点画线算法(任意斜率)

2010-04-03 14:31 260 查看
基本原理

在画直线段的过程中,当前像素点为(xp
,yp
),下一个像素点有两种可选择点P1(xp
+1,yp
)或P2(xp
+1,yp
+1)。若M=(xp
+1,yp
+0.5)为P1与P2之中点,Q为P理想直线与x=xp
+1垂线的交点。当M在Q的下方,则P2应为下一个像素点;M在Q的上方,应取P1为下一个像素点。



在斜率0<=k<=1的时候,实现代码如下(书本代码):

void
MidpointLine(int
x0,int
y0,int
x1,int
y1,int
color)

{

int
a,b,d1,d2,d,x,y;

a=y0-y1,b=x1-x0,d=2*a+b;

d1=2*a,d2=2*(a+b);

x=x0,y=y0;

Drawpixel(x,y,color);

while
(x<x1)

{

if
(d<0)

{ x++,y++,d+=d2;}

else


{ x++,d+=d1; }

Drawpixel(x,y,color);

}

}

对于其他斜率,我们可以推出如下关系:





实现代码如下:

void MidpointLine(int x0,int y0,int x1,int y1,int color)
{
	int a,b,d1,d2,d,x,y;float m;if (x1<x0){d=x0,x0=x1,x1=d;d=y0,y0=y1,y1=d;}
	a=y0-y1,b=x1-x0;if (b==0) m=-1*a*100;
	else m=(float)a/(x0-x1);x=x0,y=y0;
	Drawpixel(x,y,color);		
	if (m>=0 && m<=1)
	{d=2*a+b;d1=2*a,d2=2*(a+b);
	 while (x<x1)
	 {	if (d<=0)	{	x++,y++,d+=d2;}
		else	{	x++,d+=d1;	}
		Drawpixel(x,y,color);
	 }}
	else if (m<=0 && m>=-1)
	{d=2*a-b;d1=2*a-2*b,d2=2*a;
   	 while (x<x1)
	 {	if (d>0)	{	x++,y--,d+=d1;}
		else	{	x++,d+=d2;	}
		Drawpixel(x,y,color);
	 }	}
	else if (m>1)
	{d=a+2*b;d1=2*(a+b),d2=2*b;
	 while (y<y1)
	 {	if (d>0)	{	x++,y++,d+=d1;}
		else	{	y++,d+=d2;	}
		Drawpixel(x,y,color);
	 }	}
	else
	{d=a-2*b;d1=-2*b,d2=2*(a-b);	
	 while (y>y1)
	 {	if (d<=0)	{	x++,y--,d+=d2;}
		else	{	y--,d+=d1;	}
		Drawpixel(x,y,color);
	 }}	
}


备注:Drawpixel(x,y,color);是pDC->SetPixel(x,y,crColor);的意思
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: