Bresenham高效画线算法

画线的算法不少,但要作到高速、简单并不容易。斜率相乘法是最简单的方法之一,但计算每个点均要花费不少时间用于乘、除法运算;下面介绍的是Bresenham's高效画线算法,对每个点的坐标计算只要加、减法就能完成。
简化算法用伪Pascal语言描述如下:
procedure DrawLine(x1, y1, x2, y2: Integer);
var
x, y, DeltaX, DeltaY, HalfX, ErrorTerm, i: Integer;
begin
DeltaX := x2 - x1;
DeltaY := y2 - y1;
HalfX := (x2 - x1) shr 1;
ErrorTerm := 0;
x := x1;
y := y1;
for i:=0 to DeltaX do
begin
Plot(X, Y);
Inc(x);
ErrorTerm := ErrorTerm + DeltaY;
if ErrorTerm>HalfX then
begin
ErrorTerm := ErrorTerm - DeltaX;
Inc(y);
end;
end;
end;
为方便阅读,上述程序作了简化。实际程序应略作修正,以分别处理DeltaX与DeltaY比较大小, 必要时交换起始、结束点等。
修正后的的伪Pascal算法如下:
procedure DrawLine(x1, y1, x2, y2: Integer);
var
x, y, DeltaX, DeltaY, HalfCount, ErrorTerm, i, Flag: Integer;
begin
DeltaX := x2 - x1;
DeltaY := y2 - y1;

if Abs(DeltaY)<Abs(DeltaX) then
begin
if DeltaX<0 then
begin
i := x1; x1 := x2; x2 := i;
i := y1; y1 := y2; y2 := i;
DeltaX := x2 - x1;
DeltaY := y2 - y1;
end;
if DeltaY<0 then Flag := -1
else Flag := 1;
DeltaY := Abs(DeltaY);
HalfCount := DeltaX shr 1;
ErrorTerm := 0;
x := x1;
y := y1;
for i:=0 to DeltaX do
begin
Plot(X, Y);
Inc(x);
ErrorTerm := ErrorTerm + DeltaY;
if ErrorTerm>HalfCount then
begin
ErrorTerm := ErrorTerm - DeltaX;
y := y + Flag;
end;
end;
end
else
begin
if DeltaY<0 then
begin
i := x1; x1 := x2; x2 := i;
i := y1; y1 := y2; y2 := i;
DeltaX := x2 - x1;
DeltaY := y2 - y1;
end;
if DeltaX<0 then Flag := -1
else Flag := 1;
DeltaX := Abs(DeltaX);
HalfCount := DeltaY shr 1;
ErrorTerm := 0;
x := x1;
y := y1;
for i:=0 to DeltaY do
begin
Plot(X, Y);
Inc(y);
ErrorTerm := ErrorTerm + DeltaX;
if ErrorTerm>HalfCount then
begin
ErrorTerm := ErrorTerm - DeltaY;
x := x + Flag;
end;
end;
end;
end;

时间: 2024-09-11 07:26:13

Bresenham高效画线算法的相关文章

计算机图形学中的画线算法

问题描述 计算机图形学中的画线算法 计算机图形学 中点算法和bresenham 算法是什么关系? 解决方案 上面这个链接叙述的比较清楚

C# 在picturebox画线,画矩形,当需要擦除其中某一条曲线的时候怎么做?用异或画笔??这方面了解比较少,求大神。。。

问题描述 C#在picturebox画线,画矩形,当需要擦除其中某一条曲线的时候怎么做?用异或画笔??这方面了解比较少,求大神... 解决方案 解决方案二:这个,你只能做层,PS软件都没办法做到这点除了用图层,我想不到其他办法解决方案三:自己做图层List<Image>解决方案四:请问有没有图层的具体的例子?解决方案五:引用2楼crystal_lz的回复: 自己做图层List<Image> 请问有没有图层的具体的例子,这个list里面存放的是图片还是坐标点?解决方案六:可以用底色重

大家来理解Flash使用AS来画线的教程

教程 注:每种代码后面都有演示效果,你可以直接测试,在文章最后给大家提供了所有的源文件 给大家简单介绍一下Flash中使用AS来画线,从下面这个函数开始吧! _root.createEmptyMovieClip("terrain", 1); 这个函数的功能是创建一个空的MC,名字为terrain. 然后开始画线: _root.terrain.lineStyle(10, 0xff0000, 100); 10代表线的粗细:0xff0000代表线颜色:100代表线的alpha为100. 你可

画线实现蜘蛛丝的动态更新

动态 以前个人网上的一个点辍,用画线实现的,希望给有想象力的同志一点启发,抛砖先 (1)先建三个MC,如下: screen.width-333)this.width=screen.width-333" border=0> 一个是spider_mc,画一个蜘蛛,像样点就算了,呵呵!一个是net_mc一个网,当背景用的,没有用!最后一个是空的MC,叫line_mc,用来画线的. (2)回到场景,建三个层如下: screen.width-333)this.width=screen.width-3

Flash画线实现蜘蛛丝的动态更新

动态|蜘蛛 以前个人网上的一个点辍,用画线实现的,希望给有想象力的同志一点启发,抛砖先效果如下: 下面讲下实现的方法, (1)先建三个MC,如下: 一个是spider_mc,画一个蜘蛛,像样点就算了,呵呵!一个是net_mc一个网,当背景用的,没有用!最后一个是空的MC,叫line_mc,用来画线的. (2)回到场景,建三个层如下: 最底一个叫NET,用来放背景net 的,把net拉进去;中间一个层叫line,用来放line_mc的,把line_mc拉进来,并给这个剪辑命名line_mc;最后一

利用FlashMX的AS画线集萃

使用方法:把代码拷到帧中就可看到效果 效果:可按住鼠标任意画线,可作简单的涂鸭工具 代码: createEmptyMovieClip("xian",1); with (xian) { _root.onMouseMove = function() { if (draw) { _root.lineStyle(0, 0x000000, 100); _root.lineTo(_root._xmouse, _root._ymouse); } }; _root.onMouseDown = func

[Flash基础理论课03]制作简易涂鸦板[画线指令]

返回"Flash基础理论课 - 目录" 思路:1.设一个pressed变量,为布尔型,初始为false; 2.鼠标移动就画线; 3.当pressed=true 时,鼠标移动时,可以画线; 4.当pressed=false时,鼠标移动时,不能画线; 5.最后再加入一些按钮来调整线条粗细和清空画板. 步骤一: 放入三个按扭,实例名分别为: "clear_btn": 清除线条; "str_btn": 加粗线条; "thin_btn"

js实现两点之间画线的方法

  本文实例讲述了js实现两点之间画线的方法.分享给大家供大家参考.具体分析如下: 最近有点无聊,琢磨了很久,想到了一消磨时间的点子,也就是做js版的连连看. 两点之间画线也只是连连看最基本功能的一部分,所以我画的线也仅是折线,而且还只能向左折,后面将根据连连看中图片位置点来确定折线的方向. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37

Word怎么清除页眉中带有的下画线

  在Word中插入页眉,但总是会在下面有一条横线,使用常规方法不能删除.清除下画线的方法如下: 1.确认插入点位于页眉. 2.选择"格式""边框和底纹",打开"边框和底纹". 3.切换到"边框"选项,级那个设置中的选择"无". 4.在"应用于"中选择"段落",单击"确定"即可.