您的位置:首页 > 理论基础

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

2014-11-23 23:26 701 查看
上一节链接:/article/5083889.html

前言:

  在上一节中我们已经大致介绍了该软件的是什么、可以干什么以及界面的大致样子。此外还详细地介绍了Bresenham直线扫描算法的核心思想及实现,并在最终在2-1小节引出工程中对于该算法具体的实现。本节将着手讲解多边形填充算法。

/// <summary>
/// 负责将对下一条扫描线来说已经不是“活动边”的边从aet中删除,
/// 删除的条件就是当前扫描线y与边的ymax相等,如果有多条边满
/// 足这个条件,则一并全部删除
/// </summary>
/// <param name="AET"></param>
/// <param name="y"></param>
private int line = 0;
private void RemoveNonActiveEdgeFromAet(ref List<EDGE> AET, int y)
{
line = y;
AET.RemoveAll(IsEdgeOutOfActive);
}
private bool IsEdgeOutOfActive(EDGE obj)
{
return line == obj.ymax;
}

/// <summary>
/// 更新边表中每项的xi值,就是根据扫描线的连贯性用dx对其进行修正,
/// 并且根据xi从小到大的原则对更新后的aet表重新排序
/// </summary>
/// <param name="AET"></param>
private void UpdateAndResortAet(ref List<EDGE> AET)
{
AET.ForEach(UpdateAetEdgeInfo);//更新xi
My_Sort(ref AET);
}
private void UpdateAetEdgeInfo(EDGE e)
{
e.xi += e.dx;
}


更新和删除的函数(这里面用了C#里List类的一个很好玩的方法,竟然能自定义删除想删的元素,而代码就这么短!)
三、最终效果

 如下图最终实现了画点成线,连线成图,并用种子填充和扫描划线两种方法实现了对多边形的填充,有很好的展示效果,希望对想了解这几个算法的朋友有用!(亲-:)看完赞一下哦,让更多的分享)



相关链接

上一节链接: /article/5083889.html

上述工程C#源码:http://pan.baidu.com/s/1kTrAI5h

Bresenham算法讲解pdf:http://pan.baidu.com/s/1sjM6Cax

连点成线课件pdf:http://pan.baidu.com/s/1GV9i2

图形填充课件pdf:http://pan.baidu.com/s/1kTJvfOr

参考博客(good):/article/1393034.html

C#List.Sort的用法:http://msdn.microsoft.com/zh-cn/library/b0zbh7b6.aspx

 C#参数传递百度文库:链接太长啦♪(^∇^*)

C#参数传递博客:http://www.cnblogs.com/qq731109249/archive/2012/11/01/2750401.html

C#List.RemoveAll方法:http://technet.microsoft.com/zh-cn/library/wdka673a(it-it,VS.85).aspx

最后还是打击盗版LZ链接:http://www.cnblogs.com/zjutlitao/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: