直线生成算法

点斜式算法

点斜式算法是计算机图形学中一种基于直线的点斜式方程来生成直线的方法

算法思想

直线的点斜式方程y-y1=k(x-x1);

设直线通过P1(x1,y1),Pn(xn,yn),则斜率k=Δy/Δx=(yn-y1)/(xn-x1)。

如果已知第 i 点的坐标,可用步长 stepxstepy得到i+1点坐标

xi+1=xi+stepx

yi+1=yi+stepyyi+1=yi+k*stepx

如果stepx=1,stepy=k。

算法具体实现:在0≤k≤1的情况下,我们x每次增加1,相应的y每次增加k,如果y1+k>y1+0.5,则y2=y1+1,否则y2=y1;将y1再增加k,如果y1+2*k>y2+0.5,则y3=y2+1,否则y3=y2;如此反复比较直到终点yn。由于都是比较运算,为了方便计算,我们可以将k扩大2*Δx倍,进行比较运算。

算法描述

#include "stdafx.h"

#include "iostream"

#include "graphics.h"

#include "stdlib.h"

#include "stdio.h"

#include "conio.h"

#include "dos.h"

using namespace std;

void line(int x1,int y1,int xn,int yn,int color)

{

int x,y,dx,dy,t;

dx=xn-x1;

dy=yn-y1;

if(abs(dx)>=abs(dy))

if(dy>0) //0≤k≤1下情况

for(x=x1,y=y1,t=1;x<=xn;x++,t++)

{

if(2*dx*y1+2*t*dy>2*dx*y+dx)

y=y+1;

putpixel(x,y,color);

}

else //-1≤k≤0下情况

for(x=x1,y=y1,t=1;x<=xn;x++,t++)

{

if(2*dx*y1+2*t*dy<2*dx*y-dx)

y=y-1;

putpixel(x,y,color);

}

else if(dx>0) //k>1下情况

for(x=x1,y=y1,t=1;y<=yn;y++,t++)

{

if(2*dy*x1+2*t*dx>2*dy*x+dy)

x=x+1;

putpixel(x,y,color);

}

else //k<-1下情况

for(x=x1,y=y1,t=1;y<=yn;y++,t++)

{

if(2*dy*x1+2*t*dx<2*dy*x-dy)

x=x-1;

putpixel(x,y,color);

}

}

int main()

{

    initgraph(1024,768);             //启动图形库

    line(0,0,480,480,BLUE);   //画直线

    getchar();

    closegraph();                   //关闭图形库

    return 0;

}

VS2012编译下通过执行,效果如下:

  • 12
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wgcqhf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值