社区
图形处理/算法
帖子详情
bresenham画直线
heyi80
2004-03-31 11:22:16
用BRESENHAM算法画直线,为任意斜率,怎么实现,我试着写了一个 ,调试没有错误。但运行时就会使系统假死;
那位高手能帮我写一个,我学习学习你们的算法;
谢谢了!!!!!!
我是新手,第一次发贴哈,以后还要向大家学习哈。
...全文
909
2
打赏
收藏
bresenham画直线
用BRESENHAM算法画直线,为任意斜率,怎么实现,我试着写了一个 ,调试没有错误。但运行时就会使系统假死; 那位高手能帮我写一个,我学习学习你们的算法; 谢谢了!!!!!! 我是新手,第一次发贴哈,以后还要向大家学习哈。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
2 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
itmaster
2004-03-31
打赏
举报
回复
直线的Bresenham算法
本算法由Bresenham在1965年提出。设直线从起点(x1, y1)到终点(x2, y2)。直线可表示为方程y=mx+b。其中
b = y1 - m * x1,
m =
我们的讨论先将直线方向限于1a象限(图2.1.1)在这种情况下,当直线光栅化时,x每次都增加1个单元,即
xi+1=xi+1
而y的相应增加应当小于1。为了光栅化,yi+1只可能选择如下两种位置之一(图2.1.2)。
图2.1.2
图2.1.2 yi+1的位置选择yi-1=yi 或者 yi+1=yi+1
选择的原则是看精确值y与yi及yi+1的距离d1及d2的大小而定。计算式为:
y=m(xi+1)+b (2.1.1)
d1=y-yi (2.1.2)
d2=yi+1-y (2.1.3)
如果d1-d2>0,则yi+1=yi+1,否则yi+1=yi。因此算法的关键在于简便地求出d1-d2的符号。将式(2.1.1)、(2.1.2)、(2.1.3)代入d1-d2,得
d1-d2=2y-2yi-1=2(xi+1)-2yi+2b-1
用dx乘等式两边,并以Pi=dx(d1-d2)代入上述等式,得
Pi=2xidy-2yidx+2dy+dx(2b-1) (2.1.4)
d1-d2是我们用以判断符号的误差。由于在1a象限,dx总大于0,所以Pi仍旧可以用作判断符号的误差。Pi-1为:
Pi+1=Pi+2dy-2dx(yi+1-yi) (2.1.5)
误差的初值P1,可将x1, y1,和b代入式(2.1.4)中的xi, yi而得到:
P1=2dy-dx
综述上面的推导,第1a象限内的直线Bresenham算法思想如下:
1、画点(x1, y2); dx=x2-x1; dy=y2-y1;
计算误差初值P1=2dy-dx; i=1;
2、求直线的下一点位置:
xi+1=xi+1;
if Pi>0 则yi+1=yi+1;
否则yi+1=yi;
3、画点(xi+1, yi-1);
4、求下一个误差Pi+1;
if Pi>0 则Pi+1=Pi+2dy-2dx;
否则Pi+1=Pi+2dy;
5、i=i+1; if i<dx+1则转2;否则end。
Bresenham算法的优点是:
1、不必计算直线之斜率,因此不做除法;
2、不用浮点数,只用整数;
3、只做整数加减法和乘2运算,而乘2运算可以用硬件移位实现。
Bresenham算法速度很快,并适于用硬件实现。
由上述算法思想编制的程序如程序2.1.2。这个程序适用于所有8个方向的直线(图2.1.1)的生成。程序用色彩C画出一条端点为(x1, y1)和(x2, y2)的直线。其中变量的含义是:P是误差;const1和const2,是误差的逐点变化量;inc是y的单位递变量,值为1或-1;tmp是用作象限变换时的临时变量。程序以判断|dx|>|dy|为分支,并分别将2a, 3a象限的直线和3b, 4b象限的直线变换到1a, 4a和2b, 1b方向去,以求得程序处理的简洁。
void line (x1, y1, x2, y2, c)
int x1, y1, x2, y2, c;
{
int dx;
int dy;
int x;
int y;
int p;
int const1;
int const2;
int inc;
int tmp;
dx=x2-x1;
dy=y2-y1;
if (dx*dy>=0) /*准备x或y的单位递变值。*/
inc=1;
else
inc=-1;
if (abs(dx)>abs(dy)){
if(dx<0){
tmp=x1; /*将2a, 3a象限方向*/
x1=x2; /*的直线变换到1a, 4a*/
x2=tmp;
tmp=y1; /*象限方向去*/
y1=y2;
dx=-dy;
dy=-dy;
}
p=2*dy-dx;
const1=2*dy; /*注意此时误差的*/
const2=2*(dy-dy); /*变化参数取值. */
x=x1;
y=y1;
set_pixel(x, y, c);
while (x<x2){
x++;
if (p<0)
p+=const1;
else{
y+=inc;
p+=const2;
}
set_piexl(x, y, c);
}
}
else {
if (dy<0){
tmp=x1; /* 将3b, 4b象限方向的*/
x1=x2; /*直线变换到2b, 1b */
x2=tmp; /*象限方向去. */
tmp=y1;
y1=y2;
dx=-dy;
dy=-dy;
}
p=2*dx-dy; /*注意此时误差的*/
const1=2*dx; /*变化参数取值. */
const2=2*(dx-dy);
x=x1;
y=y1;
set_pixel (x, y, c);
while (y<y2){
y++;
if(p<0)
p+=const1;
else{
x+=inc;
p+=const2;
set_pixel (x, y, c);
}
}
}
heyi80
2004-03-31
打赏
举报
回复
谢谢“大师”了,太感谢了^_^,这里真是好地方,我会好好理解你代码的。
再一次感谢!!!
bresenham
画
直线
源代码
用opengl函数,采用
bresenham
画
直线
的程序,调试通过,可以放心下载
Bresenham
画
直线
算法
本文是关于
Bresenham
画
直线
算法。
Bresenham
画
直线
MATLAB实现
Bresenham
画
直线
MATLAB实现,可以借鉴借鉴。
计算机图形学
bresenham
画
直线
c程序
计算机图形学
bresenham
画
直线
c程序
计算机图形学DDA
画
直线
,中点
画
直线
,
Bresenham
画
直线
java程序
计算机图形学DDA算法,中点
画
直线
算法,
Bresenham
算法java源代码
图形处理/算法
19,468
社区成员
50,698
社区内容
发帖
与我相关
我的任务
图形处理/算法
VC/MFC 图形处理/算法
复制链接
扫一扫
分享
社区描述
VC/MFC 图形处理/算法
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章