图形学实验3——————简单种子填充算法

mfc扫描线种子填充算法----计算机图形学实验 mfc扫描线种子填充算法----计算机图形学实验 最近刚刚学了计算机图形学,自己动手做了几个实验,下面介绍扫描线种子填充算法实现画一个老虎,代码有很多不够精简的地方。 具体算法推荐一篇文章(侵删,我在其基础上稍加改动)添加链接描述 1.调用系统画线函数先画一个老虎轮廓: 部分代码: void CTiger1View::DrawTiger() { CDC *pDC=GetDC(); mpDC=... 阅读详情

容易溢出,我是用Release模式才运行成功的

#include <math.h>
#include <gl/glut.h>

struct Point {//点的位置
	GLint x;  //typedef int GLint 
	GLint y;
};

struct Color {//点的颜色信息
	GLfloat r;//typedef float GLfloat
	GLfloat g;
	GLfloat b;
};

void init() {//初始化
	glClearColor(1.0, 1.0, 1.0, 0.0);
	glColor3f(0.0, 0.0, 0.0);
	glPointSize(1.0);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluOrtho2D(0, 640, 0, 480);
}

Color getPixelColor(GLint x, GLint y) {//得到点(x,y)的颜色信息
	Color color;
	glReadPixels(x, y, 1, 1, GL_RGB, GL_FLOAT, &color);
	return color;
}

void setPixelColor(GLint x, GLint y, Color color) {//将点(x,y)颜色置为color
	glColor3f(color.r, color.g, color.b);
	glBegin(GL_POINTS);
	glVertex2i(x, y);
	glEnd();
	glFlush();
}

void floodFill(GLint x, GLint y, Color oldColor, Color newColor) {
	Color color;
	color = getPixelColor(x, y);

	if (color.r == oldColor.r && color.g == oldColor.g && color.b == oldColor.b)
	{
		setPixelColor(x, y, newColor);
		floodFill(x + 1, y, oldColor, newColor);
		floodFill(x, y + 1, oldColor, newColor);
		floodFill(x - 1, y, oldColor, newColor);
		floodFill(x, y - 1, oldColor, newColor);
	}
	return;
}

void draw_circle(Point pC, GLfloat radius) {//画一个圆
	GLfloat step = 1 / radius;
	GLfloat x, y;

	for (GLfloat theta = 0; theta <= 360; theta += step) {
		x = pC.x + (radius * cos(theta));
		y = pC.y + (radius * sin(theta));
		glVertex2i(x, y);
	}
}

void display(void) {
	Point pt = { 320, 240 };//圆心
	GLfloat radius = 50;    //半径

	glClear(GL_COLOR_BUFFER_BIT);
	glBegin(GL_POINTS);     //开始画圆
		draw_circle(pt, radius);
	glEnd();
	Color newColor = { 1.0f, 0.0f, 0.0f };//红色
	Color oldColor = { 1.0f, 1.0f, 1.0f };//黑色

	floodFill(320, 240, oldColor, newColor);//填充
	glFlush();
}

int main(int argc, char** argv)
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
	glutInitWindowSize(640, 480);
	glutInitWindowPosition(200, 200);
	glutCreateWindow("画圆!");
	init();
	glutDisplayFunc(display);
	glutMainLoop();
	return 0;
}

实验结果
在这里插入图片描述

计算机图形学实验二 多边形的填充算法 接着,将该像素点的四周像素点依次加入一个队列中,然后逐个取出队列中的像素点,并将其颜色替换为所需填充的颜色。该算法的时间复杂度与填充的像素数量有关,通常为 O(m),其中 m 是填充的像素数量。本次实验理解多边形的表示方法,理解四连接和八连接的概念,学会了多边形的种子填充算法,多边形填充有扫描线算法、边界填充算法、色彩种子填充算法四种填充算法。答:四连接种子填充算法是指从种子像素的上、下、左、右四个方向进行填充,而八连接种子填充算法则是在四个基本方向的基础上,增加四个斜向(45度)方向的填充。 阅读详情

相关推荐

算法系列之十二:多边形区域填充算法--扫描线种子填充算法

1.3扫描线种子填充算法        1.1和1.2节介绍的两种种子填充算法的优点是非常简单,缺点是使用了递归算法,这不但需要大量栈空间来存储相邻的点,而且效率不高。为了减少算法中的递归调用,节省栈空间的使用,人们提出了很多改进算法,其中一种就是扫描线种子填充算法。扫描线种子填充算法不再采用递归的方式处理“4-联通”和“8-联通”的相邻点,而是通过沿水平扫描线填充像素段,一段一段地来处理“4-联

oRbIt 的专栏 5万+

计算机图形学 实验5 区域填充——种子填充算法(MFC中)

实验目的: 理解多边形填充的目的 掌握多边形的各种填充算法 实验内容: 一、编写程序实现四连通种子填充算法 算法原理: 算法的输入:种子点坐标(x,y),要填充的颜色 以种子点为起点,查看它是否是边界(根据颜色) 或者是否已经被填充。 如果是,则返回,否则填充该像素,并用一个邻接的像素作为新的种子进行递归。 算法步骤: a) 种子像素压入栈中; b) 如果栈为空,则转e);否则转c); c) 弹出一个像素,并将该像素置成填充色;并判断该像素相邻的四连通像素是否为边界色或已经置成多边形的填充色,若不是,

Confident_ZYL的博客 1万+

Java编写图形学的种子填充算法

用C写的图形学填充算法已经很多了,看到不少帖子都是在问关于如何用Java编写图形学的填充算法,说来也巧,我刚好要做一个这个方面的实验,用的是扫描线种子填充算法,由于时间仓促,代码质量可能不算很高,希望大家见谅,并希望大家都来为我指点一下,小弟不胜感激~~好了,废话就不说了,我们先一起来看一下相关的知识~扫描线种子填充算法思想  首先填充种子所在的尚未填充的一区段,然后确定与这一区段相邻

TonyTseng2009的专栏 3859

种子填色(Seed Filling)算法

种子填色(Seed Filling)算法 区域填充即给出一个区域的边界,要求对边界范围内的所有像素单元赋予指定的颜色代码。 区域填充中最常用的是多边形填色。 多边形填色即给出一个多边形的边界,要求对多边形边界范围内所有像素单元赋予指定的颜色代码。 填色算法分为两大类: ⒈ 扫描线填色(Scan-Line Filling)算法。 ⒉ 种子填色(Seed Filling)算法。 这里主要和...

qq_41698119的博客 7869

计算机图形学实验(二)多边形填充

多边形填充 图形学实验中有着填充多边形的实验,在这里实现了一种相对简单的方法。 主要步骤: 从最下边往上边开始扫描,也就是y不断增加,求出与多边形的交点, 根据交点每两个点分为一组,并画出这两点之间的点,进行填充。(扫描线与每条线段会出现一个交点,两条线段的交点处按照两个点进行计算,实际上并没有画) 直到扫描到最上面的部分结束。 主要代码: // ScanLine.cpp: 定义控制台应用程序...

勿忘初心的博客 5281

图形学实验之多边形填充算法

一、建立工程   二、设计交互界面   三、算法学习与实现 1、逐点扫描算法           原理很简单,逐点判断每一个像素是否在多边形内部,如果在这填充;   代码如下: void CcgGJFillView::Draw_Algorithm_everyPoint(CDC* pDC,COLORREF rgb) {  CPoint testPoint ;  for (te

gaojie8075的专栏 2743

计算机图形学(四)—— 实验四:种子填充算法

实验四:种子填充算法 4.1实验目的 掌握种子填充算法(递归算法)、改进的种子填充算法、扫描线种子填充算法 4.2实验内容 C++中编写函数 模板库的使用stack 4.3算法思路 所有种子填充算法的核心其实就是一个递归算法,都是从指定的种子点开始,向各个方向上搜索,逐个像素进行处理,直到遇到边界,各种种子填充算法只是在处理 颜色和边界的方式上有所不同。 边界填充算法与注入填充算法的本质其实是一样的,都是递归和搜索,区别只在于对边界的确认,也就是递归的结束条件不一样。注入填充算法没有边界的概念,只是对联通区

chengzilhc的博客 1万+

计算机图形学实验四 《实现区域填充算法》

计算机图形学实验四 《实现区域填充算法》 首先要说的是他的实验报告写的很草率所以我也不确定他到底要求做啥他只说实现区域填充算法就行,那肯定咋简单咋来,所以我就自己写了一个没按照老师发的来,不过算法思维结果都是一样的我这个无论是时间复杂度还是空间复杂度还是实现难度上都比老师发的要优。 基本种子填充算法 种子填充算法本质就是BFS,DFS搜索(和本次实验无关:关于搜索我在B站也有录视频讲过链接,我最近也在深入研究搜索算法有兴趣的朋友可以一起交流),这个在之前的数据结构课是学了的就是广度优先和深度优先,不过老师发

Mibbp的博客 4773

填充的算法

文章目录系列文章目录填充的算法一、种子填充二、深度优先搜索&广度优先搜索小结 系列文章目录 序言 第一章 多文件结构 头文件&cpp文件 添加资源 第二章 核心功能 常用变量类型 响应鼠标相关 文本的绘制 多种图形的绘制 撤销的实现 填充的算法 移动的实现 双缓冲 生成可运行的文件包 第三章 UI相关 菜单栏 按钮等 总结 填充的算法 一、种子填充 种子填充算法的基本思想是:从多边形区域的一个内点开始,由内向外用给定的颜色画点直到边界为止。 其中又分为四连接算法和八连接算法

Olaffff的博客 1176

《计算机图形学》实验报告区域填充扫描线算法

一、实验目的和要求 熟悉光栅图形学中的区域填充扫描线算法; 利用区域填充算法绘制多边形区域,区域由离散点组成; 应用OpenGL进行区域填充。 二、实验内容 用区域填充直线扫描法填充绘制六边形: 初始化一个空的栈用于存放种子点,将种子点(x, y)入栈; 判断栈是否为空,如果栈为空则结束算法,否则取出栈顶元素作为当前扫描线的种子点(x, y),y是当前的扫描线; 从种子点(x,y)出发,沿当前扫描线向左、右两个方向填充,直到边界。分别标记区段的左、右端点坐标为xLeft和xRight; 分别检查与当前

Red_Master的博客 3795

MFC实现种子填充算法-图形学4-9

算法原理: 种子元素入栈,如果栈不为空,执行以下三步: (1)栈顶元素出栈 (2)按颜色绘制出栈元素 (3)按左,左上,上,右上,右,……八个方向顺序搜索与出栈像素相邻的像素,若该像素的颜色不是边界色,并且未被设置为填充色则入栈,否则丢弃。 实现: MFC新建单文档工程Test,在TestView.h中的类定义中public中添加代码 CPoint p[9];//定义多边形 CPoint see...

weixin_42217299的博客 4047

种子填充算法----计算机图形学

种子填充算法: 种子填充算法的基本思想是:从多边形区域的一个内点开始,由内向外用给定的颜色画点直到边界为止。 区域可以由内部点或边界来定义,一般都采用边界定义,即区域边界上所有像素被置为特定值,而区域内部所有的像素均不取这个值。 区域可以分为四连接或八连接两种: 四连接区域:区域内每一个像素可以通过四个方向(上、下、左、右)组合到达。 八连接区域:区域内每一个像素可以通过四个方向(上、...

但行好事,莫问前程 2万+

计算机图形学实验(绘制圆形种子填充)

利用种子填充算法实现圆形的填充 使用点阵字符显示法显示数字

c++实现种子填充算法与扫描线算法

前言 默认您已经配置好相关环境。 如若没有,可以自行搜索“EasyX”下载安装。 本教程主要从代码方面讲解算法的实现。 至于理论部分还请大家自行搜索其他文章。(该类文章非常多) 种子填充算法 演示视频 核心代码 void FloodFILL(int x, int y, int bodercolor, int newcolor) { int color = getpixel(x,y); if ...

Ericam_ 9609

计算机图形学画线、画圆、种子填充算法MFC的实现

实习作业,画线画圆种子填充算法在MFC工程中的实现,部分代码有引用

2025年普通人转向人工智能运维(AIOps)学习建议(附最新技术实践与资源)

AIOps不仅是技术的叠加,更是运维流程的重构。建议通过“学习-实践-反馈”循环,逐步从工具使用者成长为解决方案设计者。如需完整资源链接,可访问上述推荐的优快云博客及GitHub仓库。

资深全栈架构师,乐于在 优快云 分享技术见解,与大家携手共进,共攀技术巅峰! 3096

简单种子填充算法

在这里就不多啰嗦解释了,直接上代码(自我感觉写的简洁明了!!!) #include <GL/glut.h> #include <fstream> typedef float Color[3]; void Reshape(int w, int h) //窗口被移动或修改大小后的宽度和高度 { glViewport(0...

HPU_FRDHR的博客 3029

Python DEAP 库深度解析:从基础架构到高级应用

DEAP 是一个基于 Python 的开源框架,专门用于实现和运行各种进化算法,旨在帮助用户轻松地构建和调整进化算法,用于解决各种优化和搜索问题。本节中,介绍了 DEAP 相较于其它进化计算框架的优势,以及 DEAP 中重要的工具 creator 和 Toolbox。

盼小辉丶的博客 5084

【图形学】探秘图形学奥秘:区域填充的解密与实战

博文“【图形学】探秘图形学奥秘:区域填充的解密与实战”深入研究了图形学中的关键主题之一——区域填充,揭示了其奥秘与实际应用。文章通过深入解析区域填充的原理和算法,探讨了其在图形学领域中的重要性。作者通过实际案例和应用场景的演示,展示了区域填充在图像处理、计算机视觉等方面的实战应用。

朝花夕拾 7485

学习QT之应用程序打包发布

一、编译QT程序(release编译) 二、将release文件夹中的可执行文件复制到一个空的文件夹中 三、使用windeployqt打包工程 切换到可执行文件路径,执行windeployqt xxx.exe: 然后就会将程序所需要用到的资源以及库文件生成到可执行文件路径下: 此时应用程序就可以点击运行了。 四、使用Enigma Virtual Box封包(将文件夹内的文件集成为单可执...

贝勒里恩的博客 762

uniapp [全端兼容] - 详细实现集成接入萤石云摄像头监控示例代码,页面单个或多个九宫格监控画面同时监控播放推流(视频控制方向上下左右移动/调节音量声音/全屏/截屏录制/回放/对讲/切换清晰度)

uni-app,h5移动端网页,小程序,安卓,苹果ios,app,nvue,EZVIZ萤石,uniapp萤石云摄像头监控,uniApp项目集成萤石云详细示例代码,Uniapp中使用萤石云播放视频,使用萤石云播放视频,萤石云实现多窗口监控,展示多个监控画面同时播放,ezuikit.js,云台控制左右移动,莹石摄像头直播视频,萤石视频回放,摄像头黑屏不显示,加载慢报错出错,多个摄像头宫格布局,niapp萤石云视频监控对接,实现海康萤石直播预览、回放、云台控制功能,如何利用萤石实现直播推流回流,实时监控播放,监控

🏆 前端领域优质创作者 1万+
上一篇: 2017 EC-Final 部分题解——————HPU ICPC国庆训练2
下一篇: codeforces gym 102058——————HPU ICPC国庆训练1
陶鸿杰
博客等级 码龄9年 93粉丝 298原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值