[计算机图形学] 基于C#窗口的Bresenham直线扫描算法、种子填充法、扫描线填充法模拟软件设计(一)

简介:


 

 

 

一、首先说明: 

  • 这是啥? —— 这是利用C#FORM写的一个用来演示计算机图形学中 ①Bresenham直线扫描算法(即:连点成线);②种子填充法(即:填充多边形);③扫描线填充法
  • 有啥用? ——  无论是连点成线还是区域填充在高级编程中基本上都提供很高效的库函数来调用。这里拿出这些算法一方面有利于大家理解那些封装的函数底层是实现;另一方面是方便嵌入式TFT屏幕底层驱动开发时借鉴的。
  • 是啥样? ——  如下面的操作,不言而喻。

     

二、进入正题:

 2-1、直线的扫描转换

    图形的扫描转换实质就是在光栅等数字设备上确定一个最佳逼近于图形的像素集的过程。 

   

    对于直线扫描转换其实就是确定最佳逼近于该直线的一组像素,然后按照扫描线的顺序对这些像素进行写操作。三种比较常用的算法是:①数值微分法(DDA);②中点画线法;③Bresenham算法。这里主要讲第三个算法,因为这个效率高且易于硬件实现。

    Bresenham算法:由于显示直线的象素点只能取整数值坐标,可以假设直线上第i个象素点坐标为(xi,yi) ,它是直线上点(xi,yi)的最佳近似,并且xi=xi(假设m<1),如下图所示。那么,直线上下一个象素点的可能位置是(xi+1,yi) 或(xi+1,yi+1)。

    

    而实际的点为红色的点,可以计算可能点与实际点的偏差的差,即:d1-d2=2m(xi+1)-2yi+ 2b-1。这样根据这个差就能判断下一点的坐标,然后一直向前推进就能求出所有的点。此外由于考虑硬件对浮点数处理的速度要比对整数处理的速度慢许多的情况,在该算法里会对该式子做一些变换(其实就是放大使其变为整数,同时保证下一点求法正确)。由于网上资料很多,这里就不细讲了~

    Bresenham算法伪代码:[条件:0<=m<=1且x1<x2]

    ①输入线段的两个端点坐标和画线颜色:x1,y1,x2,y2,color;
②设置象素坐标初值:x=x1,y=y1;
③设置初始误差判别值:p=2·Δy-Δx;
④分别计算:Δx=x2-x1、Δy=y2-y1;
⑤循环实现直线的生成:

复制代码
 1 for(x=x1;x<=x2;x++)
 2 { 
 3     putpixel(x,y,color);
 4     if(p>=0)
 5     { 
 6         y=y+1;
 7         p=p+2*(Δy-Δx);
 8     }
 9     else
10     { 
11         p=p+2*Δy;
12     }
13 }
复制代码

  显然,上述算法是带有一定限制条件的,下面我们将其推广到所有斜率的情况,实现各种线的绘制。容易证明:当线段处于①、④、⑧、⑤区域时,以|Δx|和|Δy|代替前面公式中的Δx和Δy;当线段处于②、③、⑥、⑦区域时,把|Δx|和|Δy|对换。下面是工程中用于连点成线的基于Bresenham算法的函数:

  

复制代码
 1 /// <summary>
 2 /// Bresenham画线算法,给出两个点a,b
 3 /// </summary>
 4 /// PS:这里XiangSu是光栅的最小距离,因为我是在高分辨率的窗口中模拟低分辨率效果,
 5 /// 所以用这个XiangSu来控制模拟的光栅最小单元格的边的大小,实际运用中XiangSu=1
 6 /// <param name="a"></param>
 7 /// <param name="b"></param>
 8 void Bresenhamline(Point a, Point b)
 9 {
10     int x, y, dx, dy, s1, s2, p, temp, interchange, i;
11     x = a.X;
12     y = a.Y;
13     dx = Math.Abs(b.X - a.X);
14     dy = Math.Abs(b.Y - a.Y);
15     if (b.X > a.X)
16         s1 = XiangSu;
17     else
18         s1 = -XiangSu;
19     if (b.Y > a.Y)
20         s2 = XiangSu;
21     else
22         s2 = -XiangSu;
23     if (dy > dx)
24     {
25         temp = dx;
26         dx = dy;
27         dy = temp;
28         interchange = 1;
29     }
30     else
31         interchange = 0;
32     p = 2 * dy - dx;
33     for (i = 1; i <= dx; i += XiangSu)
34     {
35         tempp.X = x;
36         tempp.Y = y;
37         tempP.Add(tempp);
38         Vram[x + y * 600] = true;//把该片内存置为边界标记
39         if (p >= 0)
40         {
41             if (interchange == 0)
42                 y = y + s2;
43             else
44                 x = x + s1;
45             p = p - 2 * dx;
46         }
47         if (interchange == 0)
48             x = x + s1;
49         else
50             y = y + s2;
51         p = p + 2 * dy;
52     }
53 }
复制代码

 

由于版面受限,请链接到第二节,更加精彩,哈哈:http://www.cnblogs.com/zjutlitao/p/4117223.html

两篇链接:

[计算机图形学] 基于C#窗口的Bresenham直线扫描算法、种子填充法、扫描线填充法模拟软件设计(一)

[计算机图形学] 基于C#窗口的Bresenham直线扫描算法、种子填充法、扫描线填充法模拟软件设计(二) 

 



本文转自beautifulzzzz博客园博客,原文链接:http://www.cnblogs.com/zjutlitao/p/4116783.html,如需转载请自行联系原作者

相关文章
|
21天前
|
机器学习/深度学习 算法 测试技术
如何应对缺失值带来的分布变化?探索填充缺失值的最佳插补算法
该文探讨了缺失值插补的不同方法,比较了它们恢复数据真实分布的效果。文章指出,处理插补尤其在小样本或复杂数据时是个挑战,需要选择能适应数据分布变化的方法。文中介绍了完全随机缺失(MCAR)、随机缺失(MAR)和非随机缺失(MNAR)三种机制,并以一个简单的例子展示了数据分布变化。文章通过比较均值插补、回归插补和高斯插补,强调了高斯插补在重现数据分布方面更优。评估插补方法时,不应仅依赖于RMSE,而应关注分布预测,使用如能量距离这样的指标。此外,即使在随机缺失情况下,数据分布也可能因模式变化而变化,需要考虑适应这些变化的插补方法。
30 2
|
22天前
|
存储 算法 数据挖掘
python5种算法模拟螺旋、分层填充、递归、迭代、分治实现螺旋矩阵ll【力扣题59】
python5种算法模拟螺旋、分层填充、递归、迭代、分治实现螺旋矩阵ll【力扣题59】
|
24天前
|
算法 计算机视觉
图像处理之基于泛红算法的二值图像内部区域填充
图像处理之基于泛红算法的二值图像内部区域填充
22 0
|
25天前
|
算法 Java 计算机视觉
图像处理之泛洪填充算法(Flood Fill Algorithm)
图像处理之泛洪填充算法(Flood Fill Algorithm)
26 6
|
25天前
|
算法 计算机视觉
图像处理之霍夫变换(直线检测算法)
图像处理之霍夫变换(直线检测算法)
21 0
多边形扫描转换-扫描线算法
多边形扫描转换-扫描线算法
|
2月前
|
存储 算法 图形学
【计算机图形学】实验二 用扫描线算法实现多边形填充
【计算机图形学】实验二 用扫描线算法实现多边形填充
58 2
|
2月前
|
算法 图形学
【计算机图形学】实验一 DDA算法、Bresenham算法
【计算机图形学】实验一 DDA算法、Bresenham算法
61 3
|
2月前
|
算法 数据可视化
圆填充( CIRCLE PACKING)算法圆堆图圆形空间填充算法可视化
圆填充( CIRCLE PACKING)算法圆堆图圆形空间填充算法可视化
|
2月前
|
算法 数据可视化 vr&ar
【图形学】探秘图形学奥秘:DDA与Bresenham算法的解密与实战
【图形学】探秘图形学奥秘:DDA与Bresenham算法的解密与实战
68 0