中点画线完整算法c语言,中点画线算法(任意斜率)

这篇博客详细介绍了Bresenham算法的基本原理和实现过程,包括在不同斜率条件下如何选择下一个像素点。提供了0≤k≤1斜率时的代码实现,并扩展到其他斜率情况,通过调整公式来适应各种直线绘制。文章还给出了具体的Drawpixel函数调用,用于在画布上实际绘制像素。
摘要由CSDN通过智能技术生成

基本原理

在画直线段的过程中,当前像素点为(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

{

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=0 && m<=1) {d=2*a+b;d1=2*a,d2=2*(a+b); while (x=-1) {d=2*a-b;d1=2*a-2*b,d2=2*a; while (x0) { 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 (y0) { 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);的意思

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值