fillpolygon算法

news/2024/7/17 9:32:29 标签: 数据结构与算法
填充算法很多,比如扫描线填充,种子填充等
http://www.codeproject.com/KB/GDI/QuickFill.aspx
http://blog.sina.com.cn/s/blog_55a8a96d0100084k.html
 扫描线来源于光栅显示器的显示原理:对于屏幕上所有待显示像素的信息,将这些信息按从上 到下、自左至右的方式显示。因此,扫描线多边形区域填充算法的基本原理是,待填充区域按y方向(x方向亦可)扫描线顺序扫描生成。具体实现时,首先按扫描 线顺序,计算扫描线与多边形的相交区间;再用指定的颜色填充这些区间内的像素,即完成这一条扫描线的填充工作。区间的端点可以通过计算扫描线与多边形边界 的交点获得。
  为了提高效率,在处理每一条扫描线时,仅对与它相交的多边形的边进行求交运算。我们把当前扫描线相交的边称为活性边(active edge),并把它们按扫描线交点x坐标递增的顺序存放在一个链表中,称此链表为活性边表(AET)。
  为了提高速度,假定当前扫描线与多边形某一条边的交点的x坐标为xi,则下一条扫描线与该点的交点不需要重新计算,而是通过增加一个增量⊿x来获得。对于直线ax+by+c=0,⊿x=-b/a为常数。
  另外使用增量法计算时,还需要知道一条边何时不再与下一条扫描线相交,以便及时把它从活性边表中删除出去。因此,活性边表结点的数据结构应保存如下内 容:第1项保存当前扫描线与边的交点坐标x值;第2项保存从当前扫描线到下一条扫描线间x的增量⊿x;第3项保存该边所交的最高扫描线好ymax。
  为了方便活性边表的建立与更新,可为每一条扫描线建立一个边表(ET),存放在该扫描线第一次出现的边。也就是说,若某边的较低端点为ymin,则该边就放在扫描线ymin的边表中。
算法过程如下:
void FillPolygon(多边形 polygon,int color)
{
     for (各条扫描线,标示为i)
     {
          初始化边表头指针ET[i];
          把ymin=i的边放入ET[i];
     }
     y=最低扫描线号;
     初始化活性边表AET为空;
     for (各条扫描线i)
     {
          把边表ET[i]中的边结点用插入排序法插入AET表,使之按x坐标递增顺序排列;
          遍历AET表,把配对交点区间上的像素(x,y)填色;
          遍历AET表,把ymax=i的结点从AET表中删除,并把ymax>i结点的x值递增⊿x;
          若允许多边形的边自相交,则用冒泡排序法对AET表重新排序;
     }
}
  扫描线与多边形顶点相交时,必须正确的进行交点个数计算,否则,在进行填充时会出现错 误。扫描线与多边形相交的边分处扫描线的两侧,则计一个交点;扫描线与多边形相交的边分处扫描线同侧,且yi<y(i- 1),yi<y(i+1),则计2个交点,若yi>y(i-1),yi>y(i+1),则计0个交点;扫描线与多边形边界重合,则计1 个交点。

转载于:https://www.cnblogs.com/cutepig/archive/2009/08/25/1553309.html


http://www.niftyadmin.cn/n/674420.html

相关文章

HPL.dat 配置说明

原文链接&#xff1a;http://muchong.com/t-2238311-1-pid-3 并行平台构建与管理[8]&#xff1a;并行测试 GotoBLAShpl测试之L.dat各行意义及其设置 HPL.dat文件见附件 下面说说每行的意思和设置方法 1、2行&#xff0c;这个是说明性语句&#xff0c;不用更改。 3、4行&…

无符号数和有符号数(一) -- 原码表示法和补码表示法

无符号数&#xff1a; 即没有符号的数。 在c语言中就是 unsigned 类型的。 无符号数在计算机中的存储较为简单&#xff0c; 因为没有符号位&#xff0c; 直接将数字化成二进制然后存储在对应的存储器或者寄存器中。 这时寄存器或者存储器的位数就可以表示数值的范围&#xff0…

wmframework v2.0 手册(三)系统开发流程

WMframework提供了固定&#xff0c;规范的一体化代码编写过程&#xff0c;最终目的即为清晰的系统开发流程、减少开发人员代码编写时间并大大降低其工作量、方便项目组全局实现代码的风格的规范统一等 简要描述 1、确认页面元素 参照用户需求及相关功能设计文档&#xff0c;确认…

getaddrinfo用法

参考的文章&#xff1a; https://www.cnblogs.com/LubinLew/p/POSIX-DataStructure.html#struct_addrinfo https://baike.baidu.com/item/getaddrinfo/9021771?fraladdin 在做的一个项目&#xff0c;用到getaddrinfo函数&#xff0c;从linux 移植到windows上&#xff0c;做…

LinQ to SQL系统的层次架构设计

参考资料 【1】http://www.codeproject.com/KB/aspnet/SaltAndPepper.aspx?displayPrint 【2】Manning LINQ in action 【3】ScottGu, LINQ to SQL, 2007 前言 有了LINQ之后&#xff0c;我发现开发ASP.NET网站的时候&#xff0c;编写数据库操作也成为了一件有意思的事情。为了…

10只开基半年业绩翻倍 下半年将换位

除了指数型基金大放异彩外&#xff0c;截至6月19日公布的基金净值看&#xff0c;共有10只开放式股票型基金的业绩不到半年实现翻番。华夏大盘精选基金今年以来的涨幅更是位居所有开放式基金业绩之首&#xff0c;达14..45&#xff05;。 翻倍基金大多名不见经传 按照年初以来净值…

Javascript里使用Dom操作Xml笔记之常用函数[转]

一&#xff0e;本笔记使用的Xml文件 <?xml version"1.0"?> <book level"1"> <Name>c</Name> <rice>20</Price> <info> <k>1</k> </info> <info> <k>2</k…

.net reflector 6.6安装注册

1.官网下载安装包含.net reflector的集合包&#xff0c;单独下载的版本无法注册 .NET Developer Bundle&#xff08;当前版本1.6.1.3&#xff09; 2.下载danny su 的 RedGate Licensing http://rapidshare.com/files/396596167/RedGate.Licensing.exe 3.安装原版&#xff0c;选…