区域填充算法运行代码

合集下载

VBA代码实例之自动填充公式

VBA代码实例之自动填充公式

VBA代码实例之自动填充公式VBA是Visual Basic for Applications的缩写,是一种用于在Microsoft Office应用程序中编写宏的编程语言。

在Excel中,可以使用VBA来自动化日常任务,包括自动填充公式。

在Excel中,填充公式是一种常见的操作,它可以帮助我们在一列或一行中快速填充相同的公式。

如果我们手动填充公式,需要拖动鼠标或使用填充句柄,这在大数据集中可能非常耗时。

使用VBA,我们可以轻松地自动化这个过程。

下面是一个VBA代码的示例,用于自动填充公式。

假设我们希望在B 列中填充一个简单的加法公式,公式为=A1+B1、我们希望从第2行开始填充,直到最后一行。

在模块中,我们可以编写VBA代码。

下面是一个示例代码:Sub FillFormulaDim lastRow As LongDim i As Long'获取最后一行的行号lastRow = Cells(Rows.Count, "A").End(xlUp).Row'从第2行开始填充公式For i = 2 To lastRowCells(i, "B").Formula = "=A" & i & "+B" & iNext iEnd Sub在这个代码中,我们使用了两个变量:lastRow和i。

lastRow变量用于存储最后一行的行号,而i变量用于循环。

首先,我们使用Cells函数和Rows.Count属性来获取最后一行的行号。

这里使用了"A"列来获取行号,你可以根据你的需求更改它。

End(xlUp)方法用于找到第一个非空单元格,我们将其行号存储在lastRow变量中。

然后,我们使用For循环从第2行开始到最后一行。

在每次循环中,我们使用Cells函数和Formula属性来设置B列的公式。

c语言多边形区域填充算法

c语言多边形区域填充算法

c语言多边形区域填充算法C语言多边形区域填充算法一、介绍多边形区域填充算法是计算机图形学中的一项重要技术,用于将给定的多边形区域进行填充,使其呈现出丰富的颜色或纹理,增强图形的效果和表现力。

本文将介绍一种常用的C语言多边形区域填充算法——扫描线填充算法。

二、扫描线填充算法原理扫描线填充算法是一种基于扫描线的填充方法,其基本思想是将多边形区域按照水平扫描线的顺序,从上到下逐行扫描,通过判断扫描线与多边形边界的交点个数来确定是否进入多边形区域。

具体步骤如下:1. 首先,确定多边形的边界,将其存储为一个边表。

边表中的每个边都包含起点和终点的坐标。

2. 创建一个活性边表(AET),用于存储当前扫描线与多边形边界的交点。

初始时,AET为空。

3. 从上到下逐行扫描多边形区域,对每一条扫描线,从边表中找出与该扫描线相交的边,并将其加入AET中。

4. 对于AET中的每一对交点,按照从左到右的顺序两两配对,形成水平线段,将其填充为指定的颜色或纹理。

5. 在扫描线的下一行,更新AET中的交点的坐标,然后重复步骤4,直到扫描到多边形区域的底部。

三、代码实现下面是一个简单的C语言实现扫描线填充算法的示例代码:```#include <stdio.h>#include <stdlib.h>#include <stdbool.h>typedef struct {int x;int y;} Point;typedef struct {int yMax;float x;float dx;int next;} Edge;void fillPolygon(int n, Point* points, int color) {// 获取多边形的边界int yMin = points[0].y;int yMax = points[0].y;for (int i = 1; i < n; i++) {if (points[i].y < yMin) {yMin = points[i].y;}if (points[i].y > yMax) {yMax = points[i].y;}}// 创建边表Edge* edges = (Edge*)malloc(sizeof(Edge) * n);int k = n - 1;for (int i = 0; i < n; i++) {if (points[i].y < points[k].y) {edges[i].yMax = points[k].y;edges[i].x = points[i].x;edges[i].dx = (float)(points[k].x - points[i].x) / (points[k].y - points[i].y);edges[i].next = k;} else {edges[i].yMax = points[i].y;edges[i].x = points[k].x;edges[i].dx = (float)(points[i].x - points[k].x) / (points[i].y - points[k].y);edges[i].next = i;}k = i;}// 扫描线填充for (int y = yMin; y < yMax; y++) {int xMin = INT_MAX;int xMax = INT_MIN;for (int i = 0; i < n; i++) {if (y >= edges[i].yMax) {continue;}edges[i].x += edges[i].dx;if (edges[i].x < xMin) {xMin = edges[i].x;}if (edges[i].x > xMax) {xMax = edges[i].x;}int j = edges[i].next;while (j != i) {edges[j].x += edges[j].dx; if (edges[j].x < xMin) {xMin = edges[j].x;}if (edges[j].x > xMax) {xMax = edges[j].x;}j = edges[j].next;}}for (int x = xMin; x < xMax; x++) { drawPixel(x, y, color);}}free(edges);}int main() {// 定义多边形的顶点坐标Point points[] = {{100, 100},{200, 200},{300, 150},{250, 100}};// 填充多边形区域为红色fillPolygon(4, points, RED);return 0;}```四、总结通过扫描线填充算法,我们可以实现对多边形区域的填充,从而提升图形的表现效果。

区域填充算法

区域填充算法

区域填充算法⼀、区域填充概念区域:指已经表⽰成点阵形式的填充图形,是象素的集合。

区域填充:将区域内的⼀点(常称种⼦点)赋予给定颜⾊,然后将这种颜⾊扩展到整个区域内的过程。

区域填充算法要求区域是连通的,因为只有在连通区域中,才可能将种⼦点的颜⾊扩展到区域内的其它点。

1、区域有两种表⽰形式1. 内点表⽰:枚举出区域内部的所有象素内部所有象素着同⼀个颜⾊边界像素着与内部象素不同的颜⾊。

2. 边界表⽰:枚举出区域外部的所有象素边界上的所有象素着同⼀个颜⾊内部像素着与边界象素不同的颜⾊。

2、区域连通1. 四向连通区域:从区域上⼀点出发可通过上、下、左、右四个⽅向移动的组合,在不越出区域的前提下,到达区域内的任意象素。

2. ⼋向连通区域:从区域上⼀点出发可通过上、下、左、右、左上、右上、左下、右下⼋个⽅向移动的组合,在不越出区域的前提下,到达区域内的任意象素。

3. 四连通与⼋连通区域的区别连通性:四连通可以看作⼋连通的⾃⼰,但是对边界有要求⼆、简单种⼦填充算法1、基本思想给定区域G⼀种⼦点(x, y),⾸先判断该点是否是区域内的⼀点,如果是,则将该点填充为新的颜⾊,然后将该点周围的四个点(四连通)或⼋个点(⼋连通)作为新的种⼦点进⾏同样的处理,通过这种扩散完成对整个区域的填充。

这⾥给出⼀个四连通的种⼦填充算法(区域填充递归算法),使⽤【栈结构】来实现原理算法原理如下:种⼦像素⼊栈,当【栈⾮空】时重复如下三步:2、算法代码这⾥给出⼋连通的种⼦填充算法的代码:void flood_fill_8(int[] pixels, int x, int y, int old_color, int new_color) { if (x < w && x > 0 && y < h && y > 0) {// 如果是旧的颜⾊⽽且还没有给他填充过if (pixels[y * w + x] == old_color) {// 填充为新的颜⾊pixels[y * w + x]== new_color);// 递归flood_fill_8(pixels, x, y + 1, old_color, new_color);flood_fill_8(pixels, x, y - 1, old_color, new_color);flood_fill_8(pixels, x - 1, y, old_color, new_color);flood_fill_8(pixels, x + 1, y, old_color, new_color);flood_fill_8(pixels, x + 1, y + 1, old_color, new_color);flood_fill_8(pixels, x + 1, y - 1, old_color, new_color);flood_fill_8(pixels, x - 1, y + 1, old_color, new_color);flood_fill_8(pixels, x - 1, y - 1, old_color, new_color);}}}3、OpenCV实现import cv2def seed_fill(img):ret, img = cv2.threshold(img, 128, 255, cv2.THRESH_BINARY_INV) label = 100stack_list = []h, w = img.shapefor i in range(1, h-1, 1):for j in range(1, w-1, 1):if (img[i][j] == 255):img[i][j] = labelstack_list.append((i, j))while len(stack_list) != 0:cur_i = stack_list[-1][0]cur_j = stack_list[-1][1]img[cur_i][cur_j] = labelstack_list.remove(stack_list[-1])# 四邻域,可改为⼋邻域if (img[cur_i-1][cur_j] == 255):stack_list.append((cur_i-1, cur_j))if (img[cur_i][cur_j-1] == 255):stack_list.append((cur_i, cur_j-1))if (img[cur_i+1][cur_j] == 255):stack_list.append((cur_i+1, cur_j))if (img[cur_i][cur_j+1] == 255):stack_list.append((cur_i, cur_j+1))cv2.imwrite('./result.jpg', img)cv2.imshow('img', img)cv2.waitKey()if __name__ == '__main__':img = cv2.imread('./test.jpeg', 0)seed_fill(img)4、简单种⼦填充算法的优点和缺点优点:1. 该算法也可以填充有孔区域缺点:1. 有些像素会多次⼊栈,降低算法效率,栈结构占空间2. 递归执⾏,算法简单,但效率不⾼,区域内每⼀像素都要进/出栈,费时费内存3. 改进算法,减少递归次数,提⾼效率三、扫描线种⼦填充算法⽬标:减少递归层次适⽤于边界表⽰的4连通区间1、基本思想在任意不间断区间中只取⼀个种⼦像素(不间断区间指在⼀条扫描线上⼀组相邻元素),填充当前扫描线上的该段区间;然后确定与这⼀区段相邻的上下两条扫描线上位于区域内的区段,并依次把它们保存起来,反复进⾏这个过程,直到所保存的各个区段都填充完毕。

区域填充算法的实现

区域填充算法的实现

区域填充算法的实现实现区域填充算法的一种常见方法是使用递归。

以下是一个使用递归实现的区域填充算法的伪代码:1. 定义函数fillPixel(x, y, targetColor, fillColor):-如果像素点(x,y)的颜色与目标颜色相同,将其颜色修改为填充颜色。

-否则,返回。

2. 定义函数regionFill(x, y, targetColor, fillColor):-如果像素点(x,y)的颜色与目标颜色相同,返回。

- 否则,调用fillPixel(x, y, targetColor, fillColor)。

- 递归调用regionFill(x-1, y, targetColor, fillColor)。

- 递归调用regionFill(x+1, y, targetColor, fillColor)。

- 递归调用regionFill(x, y-1, targetColor, fillColor)。

- 递归调用regionFill(x, y+1, targetColor, fillColor)。

3. 调用regionFill(seedX, seedY, targetColor, fillColor)。

在上述算法中,fillPixel函数用于将特定颜色填充到像素点(x, y)。

regionFill函数使用递归的方式遍历相邻的像素点,并对目标颜色的像素点调用fillPixel函数。

seedX和seedY表示种子像素点的坐标,targetColor表示目标颜色,fillColor表示填充颜色。

实现区域填充算法时还需要考虑以下几个问题:1.像素点的表示:图像可以由二维数组表示,其中每个元素表示一个像素点的颜色。

2.填充颜色选择:填充颜色可以由RGB值表示,或者在预定义的颜色集合中选择。

3.边界处理:对于位于图像边界上的种子像素点,需要特殊处理以防止数组越界错误。

4.递归终止条件:填充算法使用递归,需要定义递归终止的条件,以防止无限递归。

VBA实现Excel的数据填充与序列生成

VBA实现Excel的数据填充与序列生成

VBA实现Excel的数据填充与序列生成在Excel中,VBA(Visual Basic for Applications)是一种强大的编程语言,可以实现自动化任务和数据处理。

本文将介绍如何使用VBA实现Excel的数据填充与序列生成,帮助您提高工作效率。

首先,让我们来看一个简单的需求:在Excel表格中,有一个起始数字和一个结束数字,需要在某一列中生成这两个数字之间的连续序列。

要实现这个需求,首先打开Excel,按下"Alt+F11"打开VBA编辑器,然后插入一个新的模块。

在模块中,我们可以编写VBA代码来实现这个任务。

我们可以利用一个For循环来实现数据填充和序列生成。

以下是一个示例代码:```vbaSub FillData()Dim startNum As IntegerDim endNum As IntegerDim i As IntegerstartNum = InputBox("请输入起始数字:")endNum = InputBox("请输入结束数字:")For i = startNum To endNumCells(i - startNum + 1, 1).Value = iNext iMsgBox "数据填充与序列生成完成!"End Sub```在这段代码中,我们首先定义了两个变量`startNum`和`endNum`,用于存储输入的起始数字和结束数字。

然后通过`InputBox`函数分别弹出输入框,用户输入起始数字和结束数字。

接下来,使用一个For循环,从起始数字开始,依次将数字填充到目标列中,直到达到结束数字。

通过`Cells`方法,我们可以将数字写入目标列中的相应单元格。

要运行这个VBA代码,可以按下"F5"或者点击"运行"菜单中的"运行子过程"。

excel填充随机范围内数据的方法

excel填充随机范围内数据的方法

excel填充随机范围内数据的方法
在Excel中,填充随机范围内的数据可以帮助我们模拟实际的数据情况,进行数据分析和决策。

下面介绍几种方法:
1. 使用Excel内置函数
Excel提供了一些内置函数,可以填充随机数。

例如,RAND()函数可以生成0到1之间的随机数,我们可以通过乘以一个数再加上一个数的方式,来控制随机数的范围和数据类型。

例如,要填充1到100之间的整数,可以使用=INT(RAND()*100)+1公式。

2. 使用数据分析工具
Excel的数据分析工具中,有一个随机数生成器,可以用来填充随机范围内的数据。

具体操作步骤为:在“数据”选项卡中,点击“数据分析”按钮,在弹出的对话框中选择“随机数生成器”,然后按照提示填写参数,即可生成随机数。

3. 使用VBA宏
如果需要大量填充随机数据,可以使用VBA编写宏来实现。

例如,下面的代码可以生成10行10列的整数随机数:
Sub GenerateRandomNumber()
Dim i As Long, j As Long
For i = 1 To 10
For j = 1 To 10
Cells(i, j) = Int(Rnd * 100) + 1
Next j
Next i
End Sub
以上是Excel填充随机范围内数据的几种方法,根据实际需要选择适合自己的方法即可。

cv2.filled算法原理

cv2.filled算法原理

CV2.fill算法原理1. CV2库简介CV2是一个开源计算机视觉和图像处理库,主要用于处理和分析图像、视频和二维数据。

在CV2中,fill算法是一种常用的填充算法,用于填充封闭区域。

本文将针对CV2.fill算法原理展开深度讨论。

2. CV2.fill算法简介CV2.fill算法是一种基于图像处理的填充算法,它主要用于填充封闭区域。

在图像处理和计算机视觉中,填充算法是一种常见的操作,它可以帮助我们实现对图像中的特定区域进行填充操作,从而实现图像的处理和分析。

CV2.fill算法主要通过对图像的像素进行操作来实现填充的效果。

3. CV2.fill算法原理CV2.fill算法的原理主要包括以下几个方面:- 区域识别:CV2.fill算法首先对指定的封闭区域进行识别和确认,确定需要进行填充操作的具体区域范围。

- 像素填充:CV2.fill算法通过对指定区域内的像素进行填充操作,实现对指定区域的颜色、灰度等数值的调整和填充。

- 边界处理:CV2.fill算法还需要考虑封闭区域的边界情况,对于边界像素的填充需要进行特殊处理,以确保填充效果的完整和准确。

4. CV2.fill算法的应用CV2.fill算法在图像处理和计算机视觉领域有着广泛的应用,它可以帮助我们实现图像的分割、填充和修复等操作。

在实际应用中,CV2.fill算法可以用于图像的自动分割、图像的去噪、图像的修复等方面。

通过对CV2.fill算法的灵活应用,可以实现对图像的精细处理和分析。

5. 个人观点和总结从我的个人观点来看,CV2.fill算法是一种非常有效的填充算法,它在图像处理和计算机视觉方面有着重要的应用。

通过对CV2.fill算法的深入理解和掌握,我们可以更好地实现对图像的处理和分析,从而提高图像处理的效率和质量。

CV2.fill算法是图像处理和计算机视觉领域不可或缺的重要算法之一。

CV2.fill算法是一种基于图像处理的填充算法,它通过对指定区域的像素进行填充操作,实现对封闭区域的颜色、灰度等数值的调整和填充。

区域生长算法代码

区域生长算法代码

区域生长算法代码//函数名称:FillDibEx//函数功能:区域生长//入口参数:SrcIm g : TGrayImg - 原图象// Seed : TPoint - 起始种子坐标// DestIm g : TGrayImg - 目的图象//返回参数:Boolean - 成功返回True,否则返回False//================================================= ==================//function FillDibEx(SrcImg : TGrayImg; Seed : TPoint; var DestIm g : TGrayImg) : Boolean;vari, j : Integer;Seeds : array of TPoint; //种子堆栈StackPoint : Integer; //堆栈指针iCurrentPixelx, iCurrentPixely : Integer; //当前象素位置pixel : Byte;begin//初始化种子trySetLength(Seeds, SrcIm g.Width * SrcImg.Height);exceptResult := False;Exit;end;Seeds[1].Y := Seed.Y;Seeds[1].X := Seed.X;StackPoint := 1;While (StackPoint <> 0) dobegin//取出种子iCurrentPixelx := Seeds[StackPoint].X;iCurrentPixely := Seeds[StackPoint].Y;//退栈Dec(StackPoint);pixel := SrcImg.Img[iCurrentPixely, iCurrentPixelx];//不是二值图象if (pixel <> 255) and (pixel <> 0) and (pixel <> 128) thenbeginResult := False;Exit;end;//将当前的点涂黑SrcIm g.Img[iCurrentPixely, iCurrentPixelx] := 128;//判断左边的点,如果为白,则压入堆栈//注意防止越界if iCurrentPixelx > 0 thenbeginpixel := SrcIm g.Img[iCurrentPixely, iCurrentPixelx - 1];if pixel = 255 thenbeginInc(StackPoint);Seeds[StackPoint].Y := iCurrentPixely;Seeds[StackPoint].X := iCurrentPixelx - 1;end;if (pixel <> 0) and (pixel <> 128) and (pixel <> 255) then beginResult := False;Exit;end;end;//判断下面的点,如果为白,压入堆栈//注意防止越界if (iCurrentPixely < SrcImg.Height - 1) thenbeginpixel := SrcIm g.Img[iCurrentPixely + 1, iCurrentPixelx];if pixel = 255 thenbeginInc(StackPoint);Seeds[StackPoint].Y := iCurrentPixely + 1;Seeds[StackPoint].X := iCurrentPixelx;end;if (pixel <> 0) and (pixel <> 128) and (pixel <> 255) then beginResult := False;Exit;end;end;//判断右边的点,如果为白,则压入堆栈//注意防止越界if iCurrentPixelx < SrcImg.Width - 1 thenbeginpixel := SrcIm g.Img[iCurrentPixely, iCurrentPixelx + 1];if pixel = 255 thenbeginInc(StackPoint);Seeds[StackPoint].Y := iCurrentPixely;Seeds[StackPoint].X := iCurrentPixelx + 1;end;if (pixel <> 0) and (pixel <> 128) and (pixel <> 255) then beginResult := False;Exit;end;end;//判断上面的点,如果为白,压入堆栈//注意防止越界if (iCurrentPixely > 0) thenbeginpixel := SrcIm g.Img[iCurrentPixely - 1, iCurrentPixelx];if pixel = 255 thenbeginInc(StackPoint);Seeds[StackPoint].Y := iCurrentPixely - 1;Seeds[StackPoint].X := iCurrentPixelx;end;if (pixel <> 0) and (pixel <> 128) a nd (pixel <> 255) then beginResult := False;Exit;end;end;end;//保存填充区域,恢复原始图象if not SetImgArray(SrcImg.Width, SrcIm g.Height, DestImg) then beginResult := False;Exit;end;for i := 0 to SrcIm g.Height - 1 dofor j := 0 to SrcImg.Width - 1 dobeginDestIm g.Img[i, j] := SrcImg.Img[i, j];if SrcImg.Img[i, j] = 128 thenbegin// SrcIm g.Img[i,j] := 255;DestImg.Img[i,j] := 0;end;end;Result := True;end;。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

///<summary>///扫描线填充算法填充触发事件///</summary>///<param name="sender"></param>///<param name="e"></param>private void scanLineFillingToolStripMenuItem_Click(object sender, EventArgs e) {slf.ScanLinePolygonFill(P,g,XiangSu);}private void label2_Click(object sender, EventArgs e){}private void四联通填充ToolStripMenuItem_Click(object sender, EventArgs e){tempp.X = tempP[3].X + XiangSu;//选取第4个点内侧(随机猜测)tempp.Y = tempP[3].Y + XiangSu;checkBox.Enabled = false;//让绘制过程中不能改变选择do_check();//也要检查一遍,不然会出现错误FloodSeedFill(tempp);checkBox.Enabled = true;//恢复}///<summary>///初始化新边表///算法通过遍历所有的顶点获得边的信息,然后根据与此边有关的前后两个顶点的情况///确定此边的ymax是否需要-1修正。

ps和pe分别是当前处理边的起点和终点,pss是起///点的前一个相邻点,pee是终点的后一个相邻点,pss和pee用于辅助判断ps和pe两个///点是否是左顶点或右顶点,然后根据判断结果对此边的ymax进行-1修正,算法实现非///常简单,注意与扫描线平行的边是不处理的,因为水平边直接在HorizonEdgeFill()///函数中填充了。

///</summary>private void InitScanLineNewEdgeTable(List<EDGE>[] NET, List<Point> Q, int ymin, int ymax){List<int> temp = new List<int>();EDGE e;for (int i = 0; i < Q.Count; i++){Point ps = Q[i];Point pe = Q[(i + 1) % Q.Count];Point pss = Q[(i - 1 + Q.Count) % Q.Count];Point pee = Q[(i + 2) % Q.Count];if (pe.Y != ps.Y)//不处理平行线{e = new EDGE();e.dx = (double)(pe.X - ps.X) / (double)(pe.Y - ps.Y) * XiangSu;if (pe.Y > ps.Y){e.xi = ps.X;if (pee.Y >= pe.Y)e.ymax = pe.Y - XiangSu;elsee.ymax = pe.Y;NET[ps.Y - ymin].Add(e);//加入对应的NET里temp.Add(ps.Y - ymin);}else{e.xi = pe.X;if (pss.Y >= ps.Y)e.ymax = ps.Y - XiangSu;elsee.ymax = ps.Y;NET[pe.Y - ymin].Add(e);//加入对应的NET里temp.Add(pe.Y - ymin);}}}for (int i = 0; i < temp.Count; i++){My_Sort(ref NET[temp[i]]);}}private void My_Sort(ref List<EDGE> list){EDGE d = new EDGE();for (int i = 0; i < list.Count-1; i++){for(int j = i + 1; j < list.Count; j++)//瞎!for (int j = i+1; i < list.Count; i++){if (list[j] < list[i]){d = list[j];list[j] = list[i];list[i] = d;}}}}///<summary>///水平边直接画线填充///</summary>///<param name="Q"></param>private void HorizonEdgeFill(List<Point> Q){}///<summary>///扫描线填充处理过程///开始对每条扫描线进行处理,对每条扫描线的处理有四个操作///</summary>///<param name="NET"></param>///<param name="ymin"></param>///<param name="ymax"></param>private void ProcessScanLineFill(List<EDGE>[] NET, int ymin, int ymax){List<EDGE> AET=new List<EDGE>();//扫描线for (int y = ymin; y < ymax; y+=XiangSu){#region显示运算信息InsertNetListToAet(NET[y-ymin], ref AET);#endregionFillAetScanLine(ref AET, y);RemoveNonActiveEdgeFromAet(ref AET, y);//删除非活动边UpdateAndResortAet(ref AET);//更新活动边表中每项的xi值,并根据xi重新排序}}///<summary>///负责将扫描线对应的所有新边插入到aet中,插入操作到保证AET///还是有序表,插入排序的思想///</summary>///<param name="list"></param>///<param name="AET"></param>private void InsertNetListToAet(List<EDGE> list, ref List<EDGE> AET){if (list.Count == 0) return;if (AET.Count == 0){AET = list;return;}//刚开始这里写成if()AET=list;return;一直出错!下次一定要规范!!!List<EDGE> temp = new List<EDGE>();int i = 0, j = 0;while (i < list.Count && j < AET.Count){if (list[i] == AET[j]){i++;temp.Add(AET[j]);j++;continue;}if (list[i] < AET[j]){temp.Add(list[i]);i++;continue;}if (list[i] > AET[j]){temp.Add(AET[j]);j++;continue;}}while (i < list.Count){temp.Add(list[i]);i++;}while (j < AET.Count){temp.Add(AET[j]);j++;}AET = temp;//for (int i = 0; i < list.Count; i++)//{// AET.Add(list[i]);//}//My_Sort(ref AET);}///<summary>/// FillAetScanLine()函数执行具体的填充动作,///它将aet中的边交点成对取出组成填充区间,///然后根据“左闭右开”的原则对每个区间填充///</summary>///<param name="AET"></param>///<param name="y"></param>private void FillAetScanLine(ref List<EDGE> AET, int y){if (AET.Count < 2) return;y = y / XiangSu * XiangSu;for (int i = 0; i < AET.Count; i += 2){int from = ((int)AET[i].xi + XiangSu) / XiangSu * XiangSu;int to = ((int)(AET[i + 1].xi + XiangSu / 2)) / XiangSu * XiangSu;while (from < to){Rectangle rect = new Rectangle(from - XiangSu / 2, y - XiangSu / 2, XiangSu, XiangSu);g.FillEllipse(blue, rect);from += XiangSu;}}}///<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);//更新xiMy_Sort(ref AET);}private void UpdateAetEdgeInfo(EDGE e){e.xi += e.dx;}}}。

相关文档
最新文档