计算机图形学06:中点Bresenham画圆(并填充边界,例如:边界用红色,内部用绿色填充)

这篇具有很好参考价值的文章主要介绍了计算机图形学06:中点Bresenham画圆(并填充边界,例如:边界用红色,内部用绿色填充)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

中点bh画圆,计算机图形学,图形渲染,c++,OpenGL,算法,数据结构

作者:非妃是公主
专栏:《计算机图形学》
博客地址:https://blog.csdn.net/myf_666
个性签:顺境不惰,逆境不馁,以心制境,万事可成。——曾国藩
中点bh画圆,计算机图形学,图形渲染,c++,OpenGL,算法,数据结构

专栏推荐

专栏名称 专栏地址
软件工程 专栏——软件工程
计算机图形学 专栏——计算机图形学
操作系统 专栏——操作系统
软件测试 专栏——软件测试
机器学习 专栏——机器学习
数据库 专栏——数据库
算法 专栏——算法

专栏系列文章

文章名称 文章地址
直线生成算法(DDA算法) 计算机图形学01——DDA算法
中点BH算法绘制直线 计算机图形学02——中点BH算法
改进的中点BH算法 计算机图形学03——改进的中点BH算法
中点Bresenham画椭圆 计算机图形学04——中点BH绘制椭圆
中点BH算法绘制任意斜率直线 计算机图形学05——中点BH算法绘制任意斜率的直线
中点Bresenham画圆 计算机图形学06——中点BH算法画圆
有效边表法的多边形扫描转换 计算机图形学07——有效边表法绘制填充多边形
中点BH算法绘制抛物线 100 x = y 2 100x = y^2 100x=y2 计算机图形学08——中点BH绘制抛物线
二维观察之点的裁剪 计算机图形学09——二维观察之点裁剪
二维观察之线的裁剪 计算机图形学10——二维观察之线裁剪
二维观察之多边形的裁剪 计算机图形学11——二维观察之多边形裁剪
二维图形的几何变换 计算机图形学12——二维图形几何变换
三维图形的几何变换 计算机图形学13——三维图形几何变换
三维图形的投影变换 计算机图形学14——三维图形投影变换

计算机图形学(英语:computer graphics,缩写为CG)是研究计算机在硬件和软件的帮助下创建计算机图形的科学学科,是计算机科学的一个分支领域,主要关注数字合成与操作视觉的图形内容。虽然这个词通常被认为是指三维图形,事实上同时包括了二维图形以及影像处理。


一、算法原理

主要思路为:将圆分为8个部分,通过堆成就可以得到各个部分的坐标,这样我们只需要绘制圆的 1 8 \frac{1}{8} 81 ,就可以实现对整个圆的绘制,如下:

中点bh画圆,计算机图形学,图形渲染,c++,OpenGL,算法,数据结构

中点bh画圆,计算机图形学,图形渲染,c++,OpenGL,算法,数据结构

中点bh画圆,计算机图形学,图形渲染,c++,OpenGL,算法,数据结构

中点bh画圆,计算机图形学,图形渲染,c++,OpenGL,算法,数据结构

中点bh画圆,计算机图形学,图形渲染,c++,OpenGL,算法,数据结构

由于,d中存在一个1.25这个小数,不利于硬件进行计算,故将模型进行优化,如下:

中点bh画圆,计算机图形学,图形渲染,c++,OpenGL,算法,数据结构

整体算法步骤如下:

中点bh画圆,计算机图形学,图形渲染,c++,OpenGL,算法,数据结构


二、OpenGL代码实现

OpenGL代码实现如下:

// 中点Bh算法绘制圆
void   MidBhcircle(int  r) {
	int  x = 0, y = r, d = 1 - r;
	glBegin(GL_POINTS);
	while (x <= y) {
		glVertex2i(x, y);    glVertex2i(y, x);   // 八分画圆
		glVertex2i(-y, x);   glVertex2i(-x, y);
		glVertex2i(-x, -y);  glVertex2i(-y, -x);
		glVertex2i(y, -x);   glVertex2i(x, -y);

		if (d < 0)					// 根据d的值更新下一个点的坐标
			d += 2 * x + 3;
		else {						// d<0时要y--,即点在圆的内部
			d += 2 * (x - y) + 5;
			y--;
		}
		x++;						// x默认+1
	}
	glEnd();
}

三、圆的内部填充

主体思路:从原点向外扩充,利用一个队列作为数据结构,然后向外扩充(泛洪)。值得注意的是:

  • 由于像素点的像素值是存储在显存中的,不好获取。所以我们采用一个vector数组进行存储,记录当前像素是否已经访问过。
  • 判断该点是否在圆内,是利用了一个isInRound函数进行判断的。

具体代码如下:

// 判断点pnt是否在以半径r做出的圆内
bool isInRound(Point& pnt, int r) {
	double d = sqrt(pow(pnt.x, 2) + pow(pnt.y, 2));
	if (d < r)
		return true;
	else
		return false;
}
// 椭圆或圆的边界填充
void fillRound(int r) {
	vector<vector<int>> con(3 * r, vector<int>(3 * r, 0));
	Point pnt = Point(0, 0);
	queue<Point> que;
	que.push(pnt);
	con[r][r] = 1;							// 用于记录当前像素点是否已经填充
	glColor3f(0.0f, 1.0f, 0.0f);			// 设置颜色为绿色进行填充
	glBegin(GL_POINTS);
	while (!que.empty()) {					// 如果队列不为空,就继续填充
		Point tmp = que.front();			// 填充队列种的第一个元素
		que.pop();
		Point tmp1 = Point(tmp.x + 1, tmp.y);
		Point tmp2 = Point(tmp.x - 1, tmp.y);
		Point tmp3 = Point(tmp.x, tmp.y + 1);
		Point tmp4 = Point(tmp.x, tmp.y - 1);
		if (isInRound(tmp1, r) && con[tmp1.x + r][tmp1.y + r] == 0) {	// 如果在圆内,而且之前也没有访问过,那么加入到队列,并标记
			que.push(tmp1);
			con[tmp1.x + r][tmp1.y + r] = 1;
		}
		if (isInRound(tmp2, r) && con[tmp2.x + r][tmp2.y + r] == 0) {
			que.push(tmp2);
			con[tmp2.x + r][tmp2.y + r] = 1;
		}
		if (isInRound(tmp3, r) && con[tmp3.x + r][tmp3.y + r] == 0) {
			que.push(tmp3);
			con[tmp3.x + r][tmp3.y + r] = 1;
		}
		if (isInRound(tmp4, r) && con[tmp4.x + r][tmp4.y + r] == 0) {
			que.push(tmp4);
			con[tmp4.x + r][tmp4.y + r] = 1;
		}
		glVertex2i(tmp.x, tmp.y);		// 用泛洪方式进行画点
	}
	glEnd();
}

四、效果展示

中点BH算法画圆效果如下:

中点bh画圆,计算机图形学,图形渲染,c++,OpenGL,算法,数据结构

内部用绿色填充后,绘制效果如下:

中点bh画圆,计算机图形学,图形渲染,c++,OpenGL,算法,数据结构


the end……

中点Bresenham画圆(并填充边界,例如:边界用红色,内部用蓝色填充)的内容到这里就要结束啦~~到此既是缘分,欢迎您的点赞评论收藏关注我,不迷路,我们下期再见!!

😘😘😘 我是Cherries,一位计算机科班在校大学生,写博客用来记录自己平时的所思所想!
💞💞💞 内容繁杂,又才疏学浅,难免存在错误,欢迎各位大佬的批评指正!
👋👋👋 我们相互交流,共同进步!

:本文由非妃是公主发布于https://blog.csdn.net/myf_666,转载请务必标明原文链接:https://blog.csdn.net/myf_666/article/details/128166947文章来源地址https://www.toymoban.com/news/detail-820700.html

到了这里,关于计算机图形学06:中点Bresenham画圆(并填充边界,例如:边界用红色,内部用绿色填充)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【计算机图形学】扫面转换算法(DDA算法 & 中点画线算法 & Bresenham画线算法)

    模块1 扫描转换算法 一 实验目的 编写直线、弧线的光栅扫描转换算法,并对线宽与线形的算法加以探讨 用DDA算法、中点画线算法、Bresenham画线算法绘制直线(如果键盘输入数据,给出数据值;如果绘制图案,图案中应包含各种斜率;如果鼠标确定任意两点,给出操作说明)

    2024年04月12日
    浏览(26)
  • 计算机图形学 第4章 多边形填充

    了解扫描转换的基本概念。 熟练掌握多边形有效边表填充算法。 掌握多边形边缘填充算法。 熟练掌握区域四邻接点和八邻接点区域填充算法。 掌握区域扫描线种子填充算法。 无论使用哪种着色模式,都意味着要使用指定颜色为多边形 边界内 的每一个像素着色。 多边形的

    2024年02月02日
    浏览(35)
  • 【计算机图形学 】扫描线多边形填充算法 | OpenGL+鼠标交互

    传送门 实现多边形扫描线填充算法,并和鼠标进行交互。 具体原理略过,会贴上完整代码,可直接运行。 环境: vs2019,OpenGL的库(可以搜索如何用vs使用OpenGL的库,可以使用vs自带的插件或者其他方法,很方便) 要点: 1.NET和AET的创建,改动 2.改变鼠标点击和鼠标拖拽的响应

    2023年04月08日
    浏览(39)
  • 计算机图形学实验——利用MFC对话框实现多边形绘制与填充(扫描线填充算法)附源码

    内容概括: 利用基于对话框的MFC项目 实现鼠标点击绘制多边形 实现扫描线算法填充多边形 源码见Yushan-Ji/ComputerGraphics: ECNU2023秋 计算机图形学课程实验代码 (github.com) 通过鼠标交互输入多边形 对各种多边形进行填充,包括边界自交的情况 利用 OnLButtonDown 和 OnRButtonDown 函数,

    2024年02月04日
    浏览(45)
  • 八、计算机视觉-边界填充

    在Python中使用OpenCV进行边界填充(也称为zero padding)是一种常见的图像处理操作,通常用于在图像周围添加额外的像素以便进行卷积或其他操作。下面是使用OpenCV进行边界填充的基本原理和方法 边界填充的原理是在图像的周围添加一圈像素,这些像素的值通常设置为0,因此

    2024年02月19日
    浏览(25)
  • 计算机视觉:填充(padding)技术

    在前面的课程中,我们学习了使用3*3的过滤器去卷积一个5*5的图像,那么最终会得到一个3*3的输出。那是因为 3×3 过滤器在 5×5 矩阵中,只可能有 3×3 种可能的位置。 这背后的数学解释是,如果我们有一个n × n的图像,用f×f的过滤器做卷积,那么输出的维度就是 (n−f+1)×(

    2024年02月07日
    浏览(34)
  • 计算机导论06-人机交互

    人机交互及其发展 人机交互是指人与计算机之间,使用某种对话语言,以一定的交互方式,为完成确定任务的信息交换过程。 从计算机的诞生之日起, 人机交互技术的发展已经历了以下阶段: 早期的手工作业;(计算机专业人员直接用机器语言与硬件通讯) 作业控制语言

    2024年01月17日
    浏览(35)
  • 【计算机图形学】二维图形裁剪算法

    Cohen-Sutherland算法 Cohen-Sutherland是最早最流行的算法。 核心思想:通过 编码测试 来减少计算交点的次数。(编码算法) 1. 区域码: 线段端点以区域赋值以四位二进制码。 编码顺序:四位从右到左分别为:左边界、右边界、下边界、上边界。 编码值:落在相应位置为1,否则

    2024年02月02日
    浏览(39)
  • 初识计算机图形学

    笔记来源:【老奇】阴差阳错 撼动世界的游戏引擎 详见本人博客: 1.Transformation 2.梳理从MVP变换到光栅化的过程 MVP变换将空间中3D物体投影到2D屏幕 详见本人博客: 1.Rasterization(光栅化) 2.梳理从MVP变换到光栅化的过程 场景是一个个由三角面组成的模型 将模型投射到像素就

    2024年01月21日
    浏览(39)
  • 计算机图形学——大作业

    绘制一个简单的三维场景,可以是室内:卧室,办公室,教室,也可以是室外:运动场,公园等,加上光照效果,简单的纹理映射,透视投影;不能过于简单;可以加动画、鼠标和键盘交互。     上交材料: project和word文档(具体内容展示,思路和心得) 首先初始化窗口,

    2024年02月11日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包