区域填充算法运行代码
halcon填充空洞算子

halcon填充空洞算子
Halcon是一款强大的机器视觉软件,它提供了许多图像处理算法,其中之一就是填充空洞算子。
在图像处理中,空洞是指图像中的一些区域被其他物体包围,但是这些区域内部没有任何像素点。
这些空洞可能会影响图像的分析和处理,因此需要使用填充空洞算子来填充这些空洞。
填充空洞算子的原理是将空洞区域内的像素点填充为与其相邻的像素点的灰度值。
这样可以使得空洞区域与周围的物体区域融合在一起,从而更好地进行图像分析和处理。
在Halcon中,填充空洞算子可以通过以下代码实现:
fill_up(holes, filled);
其中,holes是包含空洞的二值图像,filled是填充后的二值图像。
fill_up算子会将holes中的空洞填充为与其相邻的像素点的灰度值,并将结果保存在filled中。
除了填充空洞算子,Halcon还提供了许多其他的图像处理算法,如边缘检测、形态学处理、图像分割等。
这些算法可以帮助用户更好地处理图像,从而提高图像分析的准确性和效率。
填充空洞算子是图像处理中非常重要的一个算法,它可以帮助我们填充图像中的空洞,从而更好地进行图像分析和处理。
在Halcon中,填充空洞算子非常容易实现,只需要一行代码即可完成。
如果您需
要进行图像处理,不妨尝试使用Halcon来实现您的需求。
实验三 区域填充算法的实现

实验三区域填充算法的实现一、实验目的和要求:1、掌握区域填充算法基本知识2、理解区域的表示和类型,能正确区分四连通和八连通的区域3、了解区域填充的实现原理,利用Microsoft Visual C++ 6.0或win-TC实现区域种子填充的递归算法。
二、实验内容:1、编程完成区域填色2、利用画线函数,在屏幕上定义一个封闭区域。
3、利用以下两种种子填充算法,填充上述步骤中定义的区域(1)边界表示的四连通区域种子填充的实现(2)内点表示的四连通区域种子填充的实现4、将上述算法作部分改动应用于八连通区域,构成八连通区域种子填充算法,并编程实现。
三、实验结果分析四连通图的实现:程序代码:#include<graphics.h>#include <conio.h>#include<math.h>#include<time.h>void BoundaryFill4(int x,int y,int Boundarycolor,int newcolor){if(getpixel(x,y) != newcolor && getpixel(x,y) !=Boundarycolor){putpixel(x,y,newcolor);Sleep(1);BoundaryFill4(x-1,y,Boundarycolor,newcolor);BoundaryFill4(x,y+1,Boundarycolor,newcolor);BoundaryFill4(x+1,y,Boundarycolor,newcolor);BoundaryFill4(x,y-1,Boundarycolor,newcolor);}}void polygon(int x0,int y0,int a,int n,float af){int x,y,i;double dtheta,theta;if(n<3)return;dtheta=6.28318/n;theta=af*0.0174533;moveto(x0,y0);x=x0;y=y0;for(i=1;i<n;i++){x=x+a*cos(theta);y=y+a*sin(theta);lineto(x,y);theta=theta+dtheta;}lineto(x0,y0);}void main(){int x=50,y=75;int a,b,c,d,i,j;int graphdriver=DETECT;int graphmode=0;initgraph(&graphdriver,&graphmode," ");cleardevice();setcolor(RGB(0,255,0));setfillstyle(WHITE);polygon(x,y,60,5,0.);a=100;b=100;c=RGB(0,255,0);d=RGB(255,0,255);BoundaryFill4(a,b,c,d);getch();closegraph();}实验结果八连通的实现程序代码:#include<graphics.h>#include<conio.h>#include<time.h>#include <malloc.h>#include <windows.h>#define MaxSize 100typedef struct{int x;int y;}Seed,ElemType;typedef struct{ElemType data[MaxSize];int top; //栈顶指针} SqStack;void InitStack(SqStack *&s){s=(SqStack *)malloc(sizeof(SqStack));s->top=-1;}int StackEmpty(SqStack *s){return(s->top==-1);}int Push(SqStack *&s,ElemType e){if (s->top==MaxSize-1)return 0;s->top++;s->data[s->top]=e;return 1;}int Pop(SqStack *&s,ElemType &e){if (s->top==-1)return 0;e=s->data[s->top];s->top--;return 1;}void floodfill8(int x,int y,int oldcolor,int newcolor) {if(getpixel(x,y)==oldcolor){putpixel(x,y,newcolor);Sleep(2);floodfill8(x,y+1,oldcolor,newcolor);floodfill8(x,y-1,oldcolor,newcolor);floodfill8(x-1,y,oldcolor,newcolor);floodfill8(x+1,y,oldcolor,newcolor);floodfill8(x+1,y+1,oldcolor,newcolor);floodfill8(x+1,y-1,oldcolor,newcolor);floodfill8(x-1,y+1,oldcolor,newcolor);floodfill8(x-1,y-1,oldcolor,newcolor);}}void main(){int a,b,c,d,i,j;int graphdriver=DETECT;int graphmode=0;initgraph(&graphdriver,&graphmode," "); cleardevice();setfillstyle(RGB(255,255,255));setcolor(GREEN);int points[]={320,200,270,290,370,290}; fillpoly(3,points);rectangle(500,420,100,100);a=RGB(255,255,255);b=RGB(255,0,0);floodfill8(320,240,a,b);c=RGB(0,0,0);d=RGB(0,0,255);floodfill8(320,180,c,d);getch();closegraph();}实验结果:2、结果分析:通过以上各算法运行结果分析与对比可知:1.四连通算法的缺点是有时不能通过狭窄区域,因而不能填满多边形。
通过VBA实现Excel数据填充的方法

通过VBA实现Excel数据填充的方法Excel是一款广泛使用的电子表格软件,可以用于数据分析、计算、图表绘制等各种任务。
而Visual Basic for Applications (VBA)是一种基于Visual Basic语言的宏编程语言,可以嵌入到Excel中,用于定义和控制Excel的各种功能。
在VBA中,我们可以通过编写宏来实现自动化操作,其中之一就是实现Excel数据填充的功能。
数据填充是Excel中非常常见的一个操作,它可以将某个单元格的值或者公式自动拖拽填充到其他相邻的单元格中,从而实现批量填充的效果。
使用VBA可以极大地提高数据填充的效率,减少人工操作的重复性。
在使用VBA实现Excel数据填充之前,我们首先需要了解一些基本的概念和操作。
首先,我们需要知道填充的起始单元格和目标单元格。
起始单元格是包含要填充内容的单元格,而目标单元格是将起始单元格的内容自动填充到的位置。
其次,我们需要知道填充的方式。
Excel提供了不同的填充方式:顺序填充、按列填充、按行填充等。
在VBA中,我们可以通过选择不同的填充方式来实现灵活的填充操作。
接下来,我们需要知道填充的范围。
填充的范围是指要填充的连续单元格的区域,可以是一列、一行,也可以是一个矩形区域。
最后,我们需要掌握如何使用VBA语言来编写宏代码来实现Excel数据填充的功能。
以下是一个通过VBA实现Excel数据填充的示例代码:```vbaSub FillData()Dim startRange As RangeDim fillRange As Range' 设置起始单元格和目标单元格Set startRange = Range("A2")Set fillRange = Range("B2:F2")' 设置填充方式为按行填充fillRange.FillDown' 设置填充方式为按列填充fillRange.FillRight' 设置填充方式为顺序填充fillRange.AutoFill Destination:=fillRange.Resize(3, 3), Type:=xlFillDefaultEnd Sub```在上面的示例代码中,首先我们使用`Range`方法来设置起始单元格和目标单元格。
区域填充代码-MATLAB

三、区域填充%Fill_Test.m文件,这是主文件clear all;clc;num=GetFigure();ET=Create_ET(num);%输出桶size(ET);for i=1:length(ET)T=ET(i).AET;if ~isempty(T)ET(i).ystart;length(T);for k=1:length(T)T(k);endendendPoint=Fill(ET);figure();scatter(Point(:,1),Point(:,2),'.','r');%GetFigure.m文件,获取图形数据文件,数据源为程序自带的*.xls文件function Figure=GetFigure()%从指定文件中读取图形数据矩阵%图形数据矩阵的各列含义如下:%点编号点坐标x 点坐标y 线段起点编号线段终点编号%[FileName,PathName,FilterIndex]=uigetfile('*.xls','select an office file'); [num,text,head]=xlsread(strcat(PathName,FileName));Figure=num;end%Create_ET.m文件,创建边表文件function ET=Create_ET(num)%num共五列数据,每一列的数据含义如下:%点编号点坐标x 点坐标y 线段起点编号线段终点编号%采用矩阵存储相同深度的有效边,ET(i).AET即指向该矩阵%构造桶,先确定桶深Ymin=min(num(:,3));Ymax=max(num(:,3));Ymin=Ymin(1);Ymax=Ymax(1);%构造了空桶ET,同ystart字段为起点的y值,next为此层桶内的有效边矩阵for i=1:Ymax-Ymin+1% ET(i).x=-1;% ET(i).ystart=i+Ymin-1;% ET(i).k1=-100;% ET(i).AET=[];ET(i)=struct('x',-1,'ystart',i+Ymin-1,'k1',-100,'AET',[]);end%构造有效边AETfor i=1:length(num(:,4))%取出第i条线段的端点p=[num(num(i,4),[2,3]);num(num(i,5),[2,3])];% break;%做两个端点的差if p(1,2)>p(2,2)t=p(1,:);p(1,:)=p(2,:);p(2,:)=t;end%开始计算斜率倒数d=p(2,:)-p(1,:);if d(2)==0k1=Inf;elsek1=d(1)/d(2);end%斜率为0的边不输入桶中if k1==Infcontinue;end%构造有效边,%x字段为边起始点横坐标,ymax为终点纵坐标,k1为斜率的倒数,next为具有相同起点纵坐标的下一条有效边% AET.x=p(1,1);% AET.ymax=p(2,2);% AET.k1=k1;AET=struct('x',p(1,1),'ymax',p(2,2),'k1',k1);%定位有效边深度Tindex=p(1,2)-Ymin+1;T=ET(Tindex).AET;j=1;%j表示新节点的插入位置if isempty(T)%若当前矩阵为空,则指定结构体矩阵的各个字段T(1).x=AET.x;T(1).ymax=AET.ymax;T(1).k1=AET.k1;elsewhile j<=length(T)if T(j).x<AET.x||T(j).x==AET.x&&T(j).k1<AET.k1j=j+1;elsebreak;endend%将后序点后移for k=length(T):-1:jT(k+1)=T(k);end%插入节点T(j)=AET;end%更新当前桶层的结构体矩阵ET(Tindex).AET=T;T=ET(1).AET;end%处理点扫描数为1的情况for i=1:length(ET);T=ET(i).AET;if ~isempty(T)for k=1:length(T)if ~isempty(ET(T(k).ymax-Ymin+1).AET)T(k).ymax=T(k).ymax-1;endendendET(i).AET=T;endend%Fill.m文件,填充区域文件function Point=Fill(ET)%ET为边表%Point为填充的像素点%T是当前有效边的头节点,T.next指向首元节点%用矩阵AET存储当前AET表AET=[];Point=[];for i=1:length(ET)if ~isempty(ET(i).AET)%开始合并T1=ET(i).AET;T2=AET;T3=[];%临时矩阵m=1;n=1;if i==61Temp=ET(i).AET;size(Temp);for q=1:length(Temp)Temp(q);endendwhile m<=length(T1)&&n<=length(T2)if T1(m).x<T2(n).x||T1(m).x==T2(n).x&&T1(m).k1<=T2(n).k1Elem=T1(m);m=m+1;elseElem=T2(n);n=n+1;endT3=[T3;Elem];end%连接T1剩余部分for p=m:length(T1)T3=[T3;T1(p)];end%连接T2剩余部分for p=n:length(T2)T3=[T3;T2(p)];endAET=T3;%合并完成end%%if ~isempty(AET)sign=false;%开始填充for p=1:length(AET)sign=~sign;if signx=[ceil(AET(p).x) floor(AET(p+1).x)];for k=x(1):x(2)Point=[Point;[k ET(i).ystart]];endendend%删除ET(i).ystart=AET(j).ymax的边T3=[];for p=1:length(AET)if ~(AET(p).ymax<=ET(i).ystart)T3=[T3;AET(p)];endend%重新计算xfor p=1:length(T3)T3(p).x=T3(p).x+T3(p).k1;endAET=T3;endendPoint=Point;end%FigureData.xls文件,数据源文件点编号点坐标x 点坐标y 线段起点编号线段终点编号1 30 10 1 22 60 50 2 33 80 10 3 44 120 90 4 55 70 80 5 66 30 120 6 77 10 70 7 1。
计算机图形学图形区域填充效果

// Fill.cpp : implementation file
#include "stdafx.h"
#include "FloodFill.h"
#include "Fill.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
(1)种子填充算法原理
在多边形内部找到一个已知的象素点作为种子点,由此开始,利用区域的连通性找到多边形内部的 其它所有象素点进行填充。
(i)四向连通区域
①四向连通区域概念:从区域上任一点出发,在不超出区域边界的前提下,可通过4个方向:上、下、左、右的移动组合到达区域中的任意象素点,称此区域为四向连通区域。
{
//有需要填充的区域
if(spanNeedFill==FALSE)
{
spanNeedFill = TRUE;
}
x++;
}
if(spanNeedFill)
{
CPoint rightp(x-1,y);
stack.Push(x-1);
stack.Push(y);
spanNeedFill = FALSE;
virtual ~CStack();
};
#endif // !defined(AFX_STACK_H__D198F788_4ED1_4C09_98E5_433BAB24D864__INCLUDED_)
CStack.cpp参考代码:
// Stack.cpp: implementation of the CStack class.
#if !defined(AFX_STACK_H__D198F788_4ED1_4C09_98E5_433BAB24D864__INCLUDED_) #define AFX_STACK_H__D198F788_4ED1_4C09_98E5_433BAB24D864__INCLUDED_
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;}```四、总结通过扫描线填充算法,我们可以实现对多边形区域的填充,从而提升图形的表现效果。
形态学处理——区域填充

代码
clear all; close all; clc;
img=imread('tianchong.png'); img=img>128; img=mat2gray(img); imshow(img);
[m n]=size(img); [x y]=ginput(); x=round(x); y=round(y);
小编你好我看你那个第一个程序的冒泡排序有一点瑕疵那个你的程序是扫描了10遍每遍都比较了9次我觉得有一点复杂正宗的应该是扫描9次比较987654321次我稍微改了一下把ra
形态学处理 ——区域填充
区域填充
在图中,A 表示一个包含子集的集合,其子集的元素均是区域的 8 连通边界点。目的是从边界内的一个点开始,用 1 填充整个区域。 我们采用:所有非边界(背景)点标记为 0,则以将 1 赋给 p 点开始。 下列过程将整个区域用 1 填充:
tmp=ones(m,n); queue_head=1; %队列头 queue_tail=1; %队列尾 neighbour=[-1 -1;-1 0;-1 1;0 -1;0 1;1 -1;1 0;1 1]; %和当前像素坐标相加得到八个邻域坐标 %neighbour=[-1 0;1 0;0 1;0 -1]; %四邻域用的 q{queue_tail}=[y x]; queue_tail=queue_tail+1; [ser1 ser2]=size(neighbour);
区域填充算法

区域填充算法⼀、区域填充概念区域:指已经表⽰成点阵形式的填充图形,是象素的集合。
区域填充:将区域内的⼀点(常称种⼦点)赋予给定颜⾊,然后将这种颜⾊扩展到整个区域内的过程。
区域填充算法要求区域是连通的,因为只有在连通区域中,才可能将种⼦点的颜⾊扩展到区域内的其它点。
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、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Pointps = Q[i];
Pointpe = Q[(i + 1) % Q.Count];
Pointpss = Q[(i - 1 + Q.Count) % Q.Count];
Pointpee = Q[(i + 2) % Q.Count];
if(pe.Y != ps.Y)//不处理平行线
{
e =newEDGE();
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;
else
e.ymax = pe.Y;
{
}
privatevoid四联通填充ToolStripMenuItem_Click(objectsender,EventArgse)
{
tempp.X = tempP[3].X + XiangSu;//选取第4个点内侧(随机猜测)
tempp.Y = tempP[3].Y + XiangSu;
checkBox.Enabled =false;//让绘制过程中不能改变选择
///点的前一个相邻点,pee是终点的后一个相邻点,pss和pee用于辅助判断ps和pe两个
///点是否是左顶点或右顶点,然后根据判断结果对此边的ymax进行-1修正,算法实现非
///常简单,注意与扫描线平行的边是不处理的,因为水平边直接在HorizonEdgeFill()
///函数中填充了。
///</summary>
///</summary>
///<param name="NET"></param>
///<param name="ymin"></param>
///<param name="ymax"></param>
privatevoidProcessScanLineFill(List<EDGE>[] NET,intymin,intymax)
RemoveNonActiveEdgeFromAet(refAET, y);//删除非活动边
UpdateAndResortAet(refAET);//更新活动边表中每项的xi值,并根据xi重新排序
}
}
///<summary>
///负责将扫描线对应的所有新边插入到aet中,插入操作到保证AET
///还是有序表,插入排序的思想
temp.Add(pe.Y - ymin);
}
}
}
for(inti = 0; i < temp.Count; i++)
{
My_Sort(refNET[temp[i]]);
}
}
privatevoidMy_Sort(refList<EDGE> list)
{
EDGEd =newEDGE();
for(inti = 0; i < list.Count-1; i++)
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;
else
e.ymax = ps.Y;
NET[pe.Y - ymin].Add(e);//加入对应的NET里
privatevoidInitScanLineNewEdgeTable(List<EDGE>[] NET,List<Point> Q,intymin,intymax)
{
List<int> temp =newList<int>();
EDGEe;
for(inti = 0; i < Q.Count; i++)
///<summary>
///水平边直接画线填充
///</summary>
///<param name="Q"></param>
privatevoidHorizonEdgeFill(List<Point> Q)
{
}
///<summary>
///扫描线填充处理过程
///开始对每条扫描线进行处理,对每条扫描线的处理有四个操作
///<param name="e"></param>
privatevoidscanLineFillingToolStripMenuItem_Click(objectsender,EventArgse)
{
slf.ScanLinePolygonFill(P,g,XiangSu);
}
privatevoidlabo_check();//也要检查一遍,不然会出现错误
FloodSeedFill(tempp);
checkBox.Enabled =true;//恢复
}
///<summary>
///初始化新边表
///算法通过遍历所有的顶点获得边的信息,然后根据与此边有关的前后两个顶点的情况
///确定此边的ymax是否需要-1修正。ps和pe分别是当前处理边的起点和终点,pss是起
{
List<EDGE> AET=newList<EDGE>();//扫描线
for(inty = ymin; y < ymax; y+=XiangSu)
{
#region显示运算信息
InsertNetListToAet(NET[y-ymin],refAET);
#endregion
FillAetScanLine(refAET, y);
区域填充算法运行代码
———————————————————————————————— 作者:
———————————————————————————————— 日期:
ﻩ
///<summary>
///扫描线填充算法填充触发事件
///</summary>
///<param name="sender"></param>
{
for(intj = 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>
///<param name="list"></param>