实验三 区域填充算法的实现
贵州大学--实验三-多边形填充算法
贵州大学实验报告
学院:计算机科学与信息专业:软件工程班级:102班
边界上的象素填充所遵循的规则为:“左闭右开”,“下闭上开”(将左边界和下边界的点算为内部,而将右边界和上边界算为外部)
顶点:“上开下闭”。
几种特殊情况:
1.扫描线交于一顶点,共享的两条边分另处于扫描线的两边,这时交点只取一个。2.共享交点的两条边处于扫描线的上方,这时交点取二个。
3.共享交点的两条边处于扫描线的下方,这时交点取0个。
4.水平边在算法中不起任何作用,可不考虑。
活性边表(提高效率):
为了减少求交的计算量,要利用一条边与相继的两条扫描线的交点的连贯性。在处理一条扫描线时只对活性边(与它相交的多边形的边)进行求交运算。把交点按x增加方向存在一个链表(活性边表)中。活性边:与当前扫描线相交的边。
活性边表(AEL):按交点x的增量顺序存放在一个链表中,该链表称作活性边表(AEL)。
二、种子填充算法
种子填充首先假定区域由封闭轮廓线围成,且轮廓线内某点是已知的,然后开始搜索与种子点相邻且位于轮廓线内的点。如果这相邻点不在轮廓线内,则已达到轮廓线的边界;如果相邻点在轮廓线之内,则这相邻点成为新的种子点,继续搜索下去。只适用于光栅扫描设备。
区域分类(区域采用边界定义,即区域边界上与边界外的象素取相同值,区域内部的点取不同值)
1、四向连通区域:各象素在水平垂直四个方向是边通的。即从区域内任一点出发,可
水平/垂直移动到达区域内任一点。
实验结果运用扫描线算法进行多边形的填充时,截图显示如下:
运用扫描线种子算法进行多边形的填充时,截图显示如下:
实验三计算机图形学多边形填充算法
实验三计算机图形学多边形填充算法课程名称计算机图形学实验日期 2013-11-7 实验名称多边形填充算法编程成绩实验目的:
熟悉多边形填充算法,掌握MFC图形编程的基本方法和调试技巧。实验条件: 计算机;VS2008;OpenGL
实验内容:
1(使用MFC技术实现多边形有效边表填充算法,参考界面效果如下:
// ChildView.cpp : CChildView 类的实现
#include "stdafx.h"
#include "demo.h"
#include "ChildView.h"
#include <math.h>
#define Round(d) int(floor(d+0.5))//四舍五入宏定义
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CChildView
CChildView::CChildView()
{
}
CChildView::~CChildView()
{
}
BEGIN_MESSAGE_MAP(CChildView, CWnd)
ON_WM_PAINT()
ON_WM_CREATE()
ON_COMMAND(ID_DRAW_PIC, &CChildView::OnDrawPic)
END_MESSAGE_MAP()
// CChildView 消息处理程序
BOOL CChildView::PreCreateWindow(CREATESTRUCT& cs) {
if (!CWnd::PreCreateWindow(cs))
return FALSE;
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;
实验三 区域填充原理
实验三区域填充原理
实验目的
掌握二维区域填充的填充算法;
实验环境
计算机、Turbo C、C++等其他语言程序设计环境
实验学时
2学时,必做实验。
实验内容
1.二维封闭区域的种子填充算法和扫描线种子填充算法;2.熟悉多边形扫描线填充算法;
内点表示四连通种子填充算法(漫水法)参考代码:#include<graphics.h>
void floodfill4(int x,int y,int oldcolor,int newcolor)
{
if(getpixel(x,y)==oldcolor)
{
putpixel(x,y,newcolor);
delay(20000);
floodfill4(x,y+1,oldcolor,newcolor);
floodfill4(x,y-1,oldcolor,newcolor);
floodfill4(x-1,y,oldcolor,newcolor);
floodfill4(x+1,y,oldcolor,newcolor);
}
}
main()
{
int a,b,c,d,i,j;
int graphdriver=DETECT, graphmode=0;
initgraph(&graphdriver,&graphmode," ");
cleardevice();
setcolor(14);
rectangle(100,100,150,150);
for(i=101;i<150;i++)
for(j=101;j<150;j++)
{ putpixel(i,j,4);
delay(1000);
实验三指导书
实验三区域填充与直线的裁剪
1.实验目的:
1)实现种子填充法或扫描线算法中的一种。
2)任选一种算法实现直线的裁剪。
2.实验内容:
编写区域填充和直线裁剪的源程序,并能在计算机上编译运行,画出正确的图形。3.实验步骤:
1)对区域填充的几种算法进行理解;
2)编程实现绘制多边形;
3)对直线裁剪的几种算法进行理解;
4)编程实现直线的裁剪;
5)画出程序流程图;
6)编写程序的源程序;
7)编辑源程序并进行调试;
8)进行特殊模式的运行测试,并结合情况进行调整。
9)打印源程序或把源程序以文件的形式提交。
4.实验报告:
1)按格式书写实验报告;
2)提交源程序文件或打印件。
算法描述
区域填充
1) 多边形
由一系列首尾相连的直线段构成的图形称为多边形。如果在多边形内任意选取不相同的两点,其连线上的所有点均在该多边形内,这样的多边形称为凸多边形;否则,称为凹多边形。
2) 种子填充算法
种子填充算法又称为边界填充算法。其基本思想是:从多边形区域的一个内点开始,由内向外用给定的颜色画点直到边界为止。如果边界是以一种颜色指定的,则种子填充算法可逐个像素地处理直到遇到边界颜色为止。
种子填充算法常用四连通域和八连通域技术进行填充操作。
从区域内任意一点出发,通过上、下、左、右四个方向到达区域内的任意像素。用这种方法填充的区域就称为四连通域;这种填充方法称为四向连通算法。
从区域内任意一点出发,通过上、下、左、右、左上、左下、右上和右下八个方向到达区域内的任意像素。用这种方法填充的区域就称为八连通域;这种填充方法称为八向连通算法。
一般来说,八向连通算法可以填充四向连通区域,而四向连通算法有时不能填充八向连通区域。例如,八向连通填充算法能够正确填充如图2.4a所示的区域的内部,而四向连通填充算法只能完成如图2.4b的部分填充。
实验3 多边形扫描转
实验3 多边形的扫描转换与区域填充算法
一、实验目的
理解和掌握多边形的扫描转换算法。
二、实验内容
X--扫描线填充算法实现对多边形内部的填充
(1)算法步骤:
X——扫描线算法填充多边形的原理见下图。每一条扫描线被多边形分成几段,每一段要么在多边形内,要么在多边形外,在内的填充(用线型、点或颜色),在外的则舍弃。
图3-1 X----扫描线算法填充多边形
(2)算法步骤:
1)按多边形的各顶点y坐标大小排序,确定多边形所占有的最大扫描线数,
得到多边形顶点的最小和最大y值(y min和y max);
2)从y=y min到y=y max,每次用一条扫描线进行填充;
3)对一条扫描线填充的过程可分为四个步骤:
a.求交:一般情况交点是偶数,特殊情况见下面介绍的存在问题;
b.排序:若交点多于两个,则按x大小排序(小的在前),并建立焦点表;
c.交点配对:在扫描线上从单点到双点(即第一个与第二个,第三个与
第四个等等)按序构成交点对;
d.区间填色:在扫描线上对每一交点配对进行填充。
(3)存在问题:当扫描线与多边形顶点相交时,交点的取舍问题。
解决方法:当扫描线与多边形的顶点相交时,
•若共享顶点的两条边分别落在扫描线的两边,交点只算一个;
•若共享顶点的两条边在扫描线的同一边,这时交点作为零个或两个。
如下图3-2所示。
图3-2 与多边形顶点相交的交点的处理和与扫描线相交的多边形顶点的交点数
三、实验要求
验证并理解扫描线算法
四、实验环境
1、PC微机;
2、DOS操作系统或Windows 操作系统;
3、Turbo C 程序集成环境或Visual C++ 程序集成环境。
实验三 区域填充扫描线算法
计算机图形学实验报告
班级:计科14-3班学号:1406010325 姓名: 张磊日期:2017.4.11 成绩:__________ 1、实验题目及目的
2、实验内容及实验步骤
3、程序关键代码和注释
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) {
UNREFERENCED_PARAMETER(lParam);
switch (message)
{
case WM_INITDIALOG:
return (INT_PTR)TRUE;
case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
break;
}
return (INT_PTR)FALSE;
}
截图:
图1 未填充
图2 田字图形填充
图3 三角形填充
4、心得体会
计算机图形学——区域填充算法(基本光栅图形算法)
计算机图形学——区域填充算法(基本光栅图形算法)
⼀、区域填充概念
区域:指已经表⽰成点阵形式的填充图形,是象素的集合。
区域填充:将区域内的⼀点(常称【种⼦点】)赋予给定颜⾊,然后将这种颜⾊扩展到整个区域内的过程。
区域填充算法要求区域是连通的,因为只有在连通区域中,才可能将种⼦点的颜⾊扩展到区域内的其它点。
1、区域有两种表⽰形式
1)内点表⽰:枚举出区域内部的所有象素,内部所有象素着同⼀个颜⾊,边界像素着与内部象素不同的颜⾊。
2)边界表⽰:枚举出区域外部的所有象素,边界上的所有象素着同⼀个颜⾊,内部像素着与边界象素不同的颜⾊。
2
1)四向连通区域:从区域上⼀点出发可通过【上、下、左、右】四个⽅向移动的组合,在不越出区域的前提下,到达区域内的任意象素。
2)⼋向连通区域:从区域上⼀点出发可通过【上、下、左、右、左上、右上、左下、右下】⼋个⽅向移动的组合,在不越出区域的前提下,到达区域内的任意象素。
⼆、简单种⼦填充算法
给定区域G⼀种⼦点(x, y),⾸先判断该点是否是区域内的⼀点,如果是,则将该点填充为新的颜⾊,然后将该点周围的四个点(四连通)或⼋个点(⼋连通)作为新的种⼦点进⾏同样的处理,通过这种扩散完成对整个区域的填充。
这⾥给出⼀个四连通的种⼦填充算法(区域填充递归算法),使⽤【栈结构】来实现原理算法原理如下:种⼦像素⼊栈,当【栈⾮空】时重复如下三步:
这⾥给出⼋连通的种⼦填充算法的代码:
void flood_fill_8(int[] pixels, int x, int y, int old_color, int new_color)
计算机图形区域填充算法
西安工程大学实验报告
课程实验名称区第 1 页共 6 页
系别组别_____________ 实验报告日期年月日
姓名学号报告退发 ( 订正、重做 )
E_mail:_________________________________ 教师审批评分___________________
区域填充算法
一、实验目的和任务
1. 学习多边形填充的基于扫描线的区域填充算法
2. 编程实现区域填充算法
二、实验环境和设备
windows系统下 vs2012 c++
三、实验步骤和过程
在MFC框架中通过菜单与对话框实现多边形顶点参量的输入,选择各种填充算法中的两种进行展示,其中栅栏填充和边填充算法不能同时选择,多边形的表示根据所选择的算法,以内点表示或边界表示均可
四、实验故障与排除
五、总结
附录
#include <glut.h>
#include<Windows.h>
const int POINTNUM = 7; //多边形点数.
/******定义结构体用于活性边表AET和新边表NET***********************************/ typedef struct XET
{
float x;
float dx, ymax;
XET* next;
}AET, NET;
/******定义点结构体
point******************************************************/
struct point
{
float x;
float y;
}
polypoint[POINTNUM] = { 250, 50, 550, 150, 550, 400, 250, 250, 100, 350, 100, 100, 120, 30 };//多边形顶点
基本图形元素-区域填充算法的实现
实验四、基本图形元素-区域填充算法的实现
实验目的:
①理解区域的表示和类型,能正确区分四连通和八连通区域,了解区域填充的实现原理,
②利用Visual C++ 6实现区域填充的递归算法。理解扫描线多边形填充的实现原理。实验内容
③利用前面实验实现的画线函数,绘制封闭区域的边界
④利用种子填充算法,填充四连通区域和八连通区域,要考虑两类区域表示(边界表示和内点表示)
实验内容:
①仿照课程中关于区域填充的递归算法,利用Visual C++ 实现该算法,边界表示的区域需要先定义区域边界并使用画线函数绘制边界,内点表示的区域需要确定区域内部属性。
②编译、调试、测试程序。
③使用Visual C++ 6.0 编写程序验证算法,参考“MFC图形算法简单程序.rar”、“VC 经典教程.chm前8讲”,掌握菜单、对话框程序编制方法。
实验实现过程:
①复习课程中关于区域填充的相关原理;
②根据多边形区域的填充原理可以推广到圆域的填充,由于圆的特殊属性,即可根据任何欲填充的像素点与圆心的距离是否大于或小于半径来判断是否在圆内或圆外,具体实现程序如下;
利用中点画圆算法实现边界程序:
void CArea_FillData::MidpointCircle(int xc, int yc, int r, int color)
{//画八分之一的圆
int x,y,d;
x=0;y=r;d=1-r;
WholeCircle(xc,yc,x,y,color);
while(x
{
x++;
if(d<0)
d+=2*x+3;
else
{
d+=2*(x-y)+5;
实验三 二维图元的填充
实验三二维图元的填充
实验目的:
通过实验掌握下列知识:
1.熟悉OpenGL中对颜色的设置
2.边界填充算法的理解与实现;
3.泛滥填充算法的理解与实现;
4.扫描线填充算法的理解与实现;
内容及步骤:
一、OpenGL中颜色的设置
OpenGL支持两种颜色模式:一种是RGBA,一种是颜色索引模式。无论哪种颜色模式,计算机都必须为每一个像素保存一些数据。不同的是,RGBA模式中,数据直接就代表了颜色值;而颜色索引模式中,数据代表的是一个颜色表的索引,要得到真正的颜色,还必须到颜色表去查找。颜色索引模式主要用于早期性能差,只能显示有限颜色的显示设备上,现在由于显示设备的发展,普遍都采用RGBA模式,所以,我们只介绍RGBA模式。
RGBA模式中,每一个像素会保存以下数据:R值(红色分量)、G值(绿色分量)、B值(蓝色分量)和A值(alpha分量,就是透明度分量)。其中红、绿、蓝三种颜色相组合,就可以得到我们所需要的各种颜色,而alpha不直接影响颜色,它将留待以后介绍。
在RGBA模式下选择颜色是十分简单的事情,只需要一个函数。glColor*系列函数可以用于设置当前绘制颜色(前景色),其中三个参数的版本可以指定R、G、B的值,而A值采用默认;四个参数的版本可以分别指定R、G、B、A的值。例如:
void glColor3<b i f d ub us ui>(type r, type g, type b)
void glColor3<b i f d ub us ui>v(type * color)
8.3.3 区域填充及其Visual C++实现[共3页]
数字图像处理与机器视觉——Visual C++与Matlab 实现
– 296 – // 将结果返回给文档类
pDoc->m_Image = imgOutput;
读者可以通过光盘示例程序DIPDemo 中的菜单命令“形态学变换→边界跟踪”来观察处理效果。
8.3.3 区域填充及其Visual C++实现
区域填充可视为边界提取的反过程,它是在边界已知的情况下得到边界包围的整个区域的形态学技术。
1.理论基础
问题的描述如下:已知某一8连通边界和边界内部的某个点,要求从该点开始填充整个边界包围的区域,这一过程称为“种子”填充,填充的开始点被称为“种子”。
如图8.20所示,对于4连通的边界,其围成的内部区域是8连通的,而8连通的边界围
成的内部区域却是4连通的。
(a )
(b )
(c ) (d ) 图8.20 (a )4连通边界的8连通内部区域(b )用来填充4连通边界的3×3结构元素
(c )8连通边界的4连通内部区域(d )用来填充8连通边界的十字结构元素
为了填充4连通的边界应选择图8.20(b )中的3×3结构元素,但如果想在8连通边界内从种子点得到区域则需选用图8.20(d )的十字结构元素S 对初始时仅为种子点的图像B 进行膨胀,十字结构元素S 能够保证只要B 在边界A 的内部(不包括边界本身),每次膨胀都不会产生边界之外的点(新膨胀出来的点或者在边界内部,或者落在边界上),这样只需把每次膨胀的结果图像和边界的补图像A c 相交,就能把膨胀限制在边界内部。随着对B 的不断膨胀,B 的区域不断生长,但每次膨胀后与A c 的交又将B 限制在边界A 的内部,这样一直到最终B 充满整个A 的内部区域,停止生长。此时的B 与A 的并集即为最终的区域填
区域填充算法的实现
实验四区域填充算法的实现
一、实验目的和要求:
1、掌握区域填充算法根本知识
2、理解区域的表示和类型,能正确区分四连通和八连通的区域
3、了解区域填充的实现原理,利用〔及EasyX_2021版〕实现区域种子填充的
递归算法。
二、实验内容:
1、编程完成区域填色
2、利用画线函数,在屏幕上定义一个封闭区域。
3、利用以下两种种子填充算法,填充上述步骤中定义的区域
(1)边界表示的四连通区域种子填充的实现
(2)内点表示的四连通区域种子填充的实现
4、将上述算法作局部改动应用于八连通区域,构成八连通区域种子填充算法,
并编程实现。
三、实验结果分析
1、以上各种算法相应代码及运行结果如下:
程序代码:
#include<graphics.h>
#include<conio.h>
#include<time.h>
void FloodFill4(int x,int y,int oldcolor,int newcolor)
{
if(getpixel(x,y)==oldcolor)
{
putpixel(x,y,newcolor);
Sleep(1);
FloodFill4(x-1,y,oldcolor,newcolor);
FloodFill4(x,y+1,oldcolor,newcolor);
FloodFill4(x+1,y,oldcolor,newcolor);
FloodFill4(x,y-1,oldcolor,newcolor);
}
}
void main()
{
int a,b,c,d,i,j;
int graphdriver=DETECT;
计算机图形学区域填充算法的实现
计算机图形学区域填充算法的实现
实验四区域填充算法的实现
班级 08信计2班学号 20080502088 姓名许延恒分数
一、实验目的和要求:
1、理解区域的表示和类型。
2、能正确区分四连通和八连通的区域
3、了解区域填充的实验原理。
4、利用C++实现区域填充的递归算法。
二、实验内容:
1假设在多边形内有一像素已知,由此出发利用连通性找到区域内所有像素。
2 取(x,y)为种子点将整个区域填充为新的颜色。
3 进行递归填充。
三、实验结果分析
区域填充属性包括填充样式,填充颜色和填充图案的类型。C语言中定义了某种图形后,即可调用-floodfill函数,对指定区域进行填充
. 程序代码
#include
#include
#include
void floodfill4(int x,int y,int oldcolor,int newcolor)
{
if(getpixel(x,y)==oldcolor)
{
putpixel(x,y,newcolor);
Sleep(1);
floodfill4(x,y+1,oldcolor,newcolor);
floodfill4(x,y-1,oldcolor,newcolor);
floodfill4(x-1,y,oldcolor,newcolor);
floodfill4(x+1,y,oldcolor,newcolor);
}
}
main()
{
int a,b,c,d,i,j;
int graphdriver=DETECT;
int graphmode=0;
initgraph(&graphdriver,&graphmode,"");
3多边形的填充
实验三、多边形的填充
一 .实验要求和目的
1)认识多边形扫描转换,认识并掌握逐点判断算法,扫描线算法,边界标志算法等的实现及优缺点。
2)理解什么是四连通区域和八连通区域。理解并掌握一种多边形填充的原来及其实现。
二.实验原理:
扫描线种子填充算法:
原理:给定种子点),(yx时,首先填充种子点所在扫描线上的位于给定区域的一个区段,然后确定与这一区域相连通的上下扫描线上位于给定区域内的区段,并保存下来,直到填充结束。
三.实验环境
(1)硬件:PC机;
⑵软件:Windows7操作系统、Visual Studio2010。
四、相关代码
void CgraphicsView::drawFill()
{
mflags=4;
beginpoint=(0,0);
endpoint=(0,0);
RedrawWindow();
CDC* pDC=GetDC();
CPen newpen(PS_SOLID,1,RGB(0,0,0));
CPen *oldpen=pDC->SelectObject(&newpen);
spt[0]=CPoint(100,100);
spt[1]=CPoint(100,300);
spt[2]=CPoint(250,250);
spt[3]=CPoint(250,100);
spt[4]=CPoint(200,150);
spt[5]=CPoint(180,90);
spt[6]=CPoint(150,150);
spt[7]=CPoint(100,100);
pDC->Polyline(spt, 8);
pDC->SelectObject(oldpen);
多边形的区域填充
{
if(pmax<spt[i].y)
pmax=spt[i].y;
if(pmin>spt[i].y)
pmin=spt[i].y;
}
for( i=0;i<7;i++)//建立7条边表
{
edge[i].dx=(float)(spt[i+1].x-spt[i].x)/(spt[i+1].y-spt[i].y); //斜率倒数1/k
CDC* pDC=GetDC();
CPen newpen(PS_SOLID,1,RGB(0,255,0));
CPen *old=pDC->SelectObject(&newpen);
int j,k,s=0;
int p[6]; //每根扫描线交点
int pmin=spt[0].y,pmax=spt[0].y,CPoint;
种子填充算法原理:
1初始化:确定种子点元素(x,y)。
2判断种子点(x,y)是否满足非边界、非填充色的条件,若满足条件,以y作为当前扫描线沿当前扫描线向左、右两个方向填充,直到边界。
3确定新的种子点:检查与当前扫描线y上、下相邻的两条扫描线上的像素。若存在非边界、未填充的像素,则返回步骤2进行扫描填充。直至区域所有元素均为填充色,程序结束。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验三区域填充算法的实现
一、实验目的和要求:
1、掌握区域填充算法基本知识
2、理解区域的表示和类型,能正确区分四连通和八连通的区域
3、了解区域填充的实现原理,利用Microsoft Visual C++ 6.0或win-TC实现区
域种子填充的递归算法。
二、实验内容:
1、编程完成区域填色
2、利用画线函数,在屏幕上定义一个封闭区域。
3、利用以下两种种子填充算法,填充上述步骤中定义的区域
(1)边界表示的四连通区域种子填充的实现
(2)内点表示的四连通区域种子填充的实现
4、将上述算法作部分改动应用于八连通区域,构成八连通区域种子填充算法,
并编程实现。
三、实验结果分析
四连通图的实现:
程序代码:
#include
#include
#include
#include
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 { 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 #include #include #include #include #define MaxSize 100 typedef 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) {