Bresenham 画圆算法原理

文章目录

    • 前言
    • Bresenham 画圆算法原理
      • 两个近似
      • 构造判别式
      • 圆与网格点的关系
        • 关系由来
        • 关系含义
      • p i p_i pi 递推
      • 画圆
      • 程序伪码
    • 圆与网格点的关系图示

前言

首先简要介绍一下生成圆的方法:

  1. 直接利用圆的方程生成圆
  2. 利用圆的对称性生成圆

方法一由于会涉及到浮点运算等因素,不采取该方案。
ps. 这部分想要知道为什么可以参考 计算机图形学 圆及椭圆的扫描转换_百度文库 前面一点。
方法二的原理如下图,利用圆的对称性,我们只需要对一个八分圆进行扫描转换。
在这里插入图片描述

在这里我们不妨选择第一象限上斜率绝对值小于1的那八分圆进行扫描转换,以及假设圆心为 (0, 0) 。也就是下图。
友情提示:圆在某点的斜率是该点处切线斜率。圆心不在 (0, 0) 处的点可以通过平移得到。
在这里插入图片描述

Bresenham 画圆算法原理

如下图,在 0≤x≤y 的 1/8 圆周上,像素坐标 x 值单调增加,y 值单调减少。
设第 i 步已确定 ( x i , y i ) (x_i, y_i) xi,yi是要画圆上的像素点,看第 i+1 步像素点 ( x i + 1 , y i + 1 ) (x_{i+1}, y_{i+1}) xi+1,yi+1应如何确定。下一个像素点只能是 H ( x i + 1 , y i ) H(x_i+1, y_i) Hxi+1,yi或者 D ( x i + 1 , y i − 1 ) D(x_i+1,y_i-1) Dxi+1,yi1中的一个 。
8分圆的某段

具体选哪个就得看 d H 和 d D d_H 和 d_D dHdD 二者的比较了:

  1. d H d_H dH 更小,下一个像素点就选 H ( x i + 1 , y i ) H(x_i+1, y_i) Hxi+1,yi
  2. d D d_D dD 更小,下一个像素点就选 D ( x i + 1 , y i − 1 ) D(x_i+1,y_i-1) Dxi+1,yi1
  3. 一样大,选哪个都行。

比较方法就是做差: d H − d D d_H - d_D dHdD,然后将结果与0进行比较。

那么问题是 d H 和 d D d_H 和 d_D dHdD 二者的值是怎么求得呢?这里就涉及到一个近似:

两个近似

在这里插入图片描述

在这里插入图片描述

近似方法:
将 CH 近似为 d H d_H dH
将 DB 近似为 d D d_D dD

由大图显而易见可以知道 CH 和 DB 的值:
C H = O H − O C = ( x i + 1 ) 2 + y i 2 − R = d H CH = OH - OC = \sqrt{(x_i+1)^2 + y_i^2} - R = d_H CH=OHOC=(xi+1)2+yi2 R=dH
D H = O B − O D = R − ( x i + 1 ) 2 + ( y i − 1 ) 2 = d D DH = OB - OD = R - \sqrt{(x_i+1)^2 + (y_i-1)^2} = d_D DH=OBOD=R(xi+1)2+(yi1)2 =dD

这里由于涉及到了根号运算,因此又做了一个近似:
d H = ( x i + 1 ) 2 + y i 2 − R 2 d_H = (x_i+1)^2 + y_i^2 - R^2 dH=(xi+1)2+yi2R2
d D = R 2 − ( x i + 1 ) 2 − ( y i − 1 ) 2 d_D = R^2 - (x_i+1)^2 - (y_i-1)^2 dD=R2(xi+1)2(yi1)2

构造判别式

我们不妨构造如下判别式
p i = d H − d D p_i = d_H - d_D pi=dHdD
= ( x i + 1 ) 2 + y i 2 − R 2 − ( R 2 − ( x i + 1 ) 2 + ( y i − 1 ) 2 ) \space\space\space\space= (x_i+1)^2 + y_i^2 - R^2 - (R^2 - (x_i+1)^2 + (y_i-1)^2)     =(xi+1)2+yi2R2(R2(xi+1)2+(yi1)2)
= 2 ( x i + 1 ) 2 + 2 y i 2 − 2 y i − 2 R 2 + 1 \space\space\space\space= 2(x_i+1)^2 + 2y_i^2-2y_i\textcolor{red}{-2R^2+1}     =2(xi+1)2+2yi22yi2R2+1

圆与网格点的关系

关系由来

在这里插入图片描述

圆与网格点有且仅有上述5种关系,情况分别如上:
在这里插入图片描述
其中的BCEF均为该网格上的中点。

首先,我们得再次强调的一点是,在 0≤x≤y 的 1/8 圆周上的每点的斜率绝对值都小于1。即它们与 x 轴负方向的倾角都不能超过图中的 FE 线段。

由于,我们现在点亮的点是 P ( x i , y i ) P(x_i, y_i) P(xi,yi) ,所以圆与 x=1 的交点应该在 BF 之间。由于此段圆弧的斜率均小于1,因此圆与 x=2 的交点应该在 CE 之间,由此上上图中的 5 条圆弧都有了解释:
圆弧1:圆与 x=1 的交点在 BP 间,且该圆斜率变化很小(半径很大)
圆弧4,5:我个人认为是在接近 y=x 这条直线处的网格可以产生这种情况

关系含义

在这里插入图片描述
构造判别式: p i = d H − d D p_i = d_H-d_D pi=dHdD

  1. 精确圆弧是③,则 d H > 0 和 d D > 0 d_H >0和d_D>0 dH>0dD>0
    若 p i < 0 , 即 d H < d D 应 选 H 点 若p_i<0,即d_H <d_D应选H点 pi<0dH<dDH
    若 p i ≥ 0 , 即 d H ≥ d D 应 选 D 点 若p_i≥0,即d_H ≥d_D应选D点 pi0dHdDD
  2. 若精确圆弧是①或②,显然H是应选择点,而此时 d H ≤ 0 , d D > 0 d_H ≤0,d_D>0 dH0dD>0,必有 p i < 0 p_i<0 pi<0
  3. 若精确圆弧是④或⑤,显然D是应选择点,而此时 d H > 0 , d D ≤ 0 d_H >0,d_D≤0 dH>0dD0,必有 p i > 0 p_i>0 pi>0

得出结论: p i p_i pi 做判别量, p i < 0 p_i<0 pi<0 时,选H点为下一个像素点, p i ≥ 0 p_i≥0 pi0 时,选D点为下一个像素点。

p i p_i pi 递推

因为 p i p_i pi 代表此次选择哪个点的判别式,如果我们知道下一次选点的判别式和其关系就可以节省很多思考。所以我们要从 p i p_i pi 计算 p i + 1 p_{i+1} pi+1
ps. 对 p i + 1 p_{i+1} pi+1 数学意义的解释:此次点亮的点我们称做 ( x i , y i ) (x_i, y_i) (xi,yi),下一次点亮的点我们就称做 ( x i + 1 , y i + 1 ) (x_{i+1}, y_{i+1}) (xi+1,yi+1) x i + 1 x_{i+1} xi+1 的值和 x i x_i xi 是有递推关系的( x i + 1 = x i + 1 x_{i+1}=x_i+1 xi+1=xi+1 ,见关系由来下的图)。而此次我们将判断点亮哪个点的判别式记作 p i p_i pi,类似的,下次判断点亮哪个点的判别式我们就记作 p i + 1 p_{i+1} pi+1
p i = d H − d D p_i = d_H - d_D pi=dHdD
= ( x i + 1 ) 2 + y i 2 − R 2 − ( R 2 − ( x i + 1 ) 2 + ( y i − 1 ) 2 ) \space\space\space\space= (x_i+1)^2 + y_i^2 - R^2 - (R^2 - (x_i+1)^2 + (y_i-1)^2)     =(xi+1)2+yi2R2(R2(xi+1)2+(yi1)2)
= 2 ( x i + 1 ) 2 + 2 y i 2 − 2 y i − 2 R 2 + 1 \space\space\space\space= 2(x_i+1)^2 + 2y_i^2-2y_i\textcolor{red}{-2R^2+1}     =2(xi+1)2+2yi22yi2R2+1

p i + 1 = 2 ( x i + 1 + 1 ) 2 + 2 y i + 1 2 − 2 y i + 1 − 2 R 2 + 1 p_{i+1}=2(x_{i+1}+1)^2 + 2y_{i+1}^2-2y_{i+1}\textcolor{red}{-2R^2+1} pi+1=2(xi+1+1)2+2yi+122yi+12R2+1
p i + 1 − p i = 4 x i + 6 + 2 ( y i + 1 2 − y i 2 − y i + 1 + y i ) p_{i+1}-p_i=4x_i+6+2(y_{i+1}^2-y_i^2-y_{i+1}+y_i) pi+1pi=4xi+6+2(yi+12yi2yi+1+yi)

  1. p i ≥ 0 p_i≥0 pi0 时,应选D点,此时 D 点的 y 坐标和 P 的 y 坐标的关系是 y i + 1 = y i − 1 y_{i+1} = y_i - 1 yi+1=yi1,带入上式有:
    p i + 1 = p i + 4 ( x i − y i ) + 10 p_{i+1}=p_i+4(x_i-y_i)+10 pi+1=pi+4(xiyi)+10
  2. p i < 0 p_i<0 pi<0 时,应选H点,此时 H 点的 y 坐标和 P 的 y 坐标的关系是 y i + 1 = y i y_{i+1} = y_i yi+1=yi,带入上式有:
    p i + 1 = p i + 4 x i + 6 p_{i+1}=p_i+4x_i+6 pi+1=pi+4xi+6

画圆

画圆的起始点是(0, R),即 x 1 = 0 , y 1 = R x_1=0, y_1=R x1=0,y1=R,带入前式。即令 i=1 ,就得到:
p i = 3 − 2 R p_i=3-2R pi=32R
剩下的递推就行。

程序伪码

void BresenhamCircle(int R){     int x,y,p;x=0;  y=R;p=3-2*R;for(;x<=y;x++){       SetPixel(x,y);if(p>=0){p+=4*(x-y)+10;y--;}else {p+=4*x+6;}}
}

在这里插入图片描述
根据对称性,只需修改语句 SetPixel(x,y),画八个对称的点,就可以画出全部圆周。若加一个平移,就可以画出圆心在任意位置的圆周

圆与网格点的关系图示

情况一: x 2 + y 2 = 10000 x^2+y^2=10000 x2+y2=10000
其中 1 4 2 + 9 9 2 = 9997 14^2+99^2=9997 142+992=9997

在这里插入图片描述

情况五: x 2 + y 2 = 10000 x^2+y^2=10000 x2+y2=10000,那条横线是 y=77.5
其中 6 5 2 + 7 6 2 = 10001 65^2+76^2=10001 652+762=10001

在这里插入图片描述

时间有限,姑且只画这俩。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/253302.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

C++ deque类成员函数介绍

目录 &#x1f914;deque模板介绍&#xff1a; &#x1f914;deque特点&#xff1a; &#x1f914;deque内存结构图解&#xff1a; &#x1f914;deque各操作地址指向&#xff1a; &#x1f914; deque的成员函数&#xff1a; deque构造函数&#xff1a; &#x1f50d;代…

ajax异步请求刷新layui表格

ajax异步请求刷新Layui表格数据 今天遇到一个小问题&#xff0c;向后端传一个bean插入到数据库后&#xff0c;在前端页面同步显示。刚开始直接用from表单把数据传给后台进行插入操作&#xff0c;但是这样前端不能及时接收到后端完成插入操作的信息&#xff08;其实是我不知道怎…

form 表单提交时用ajax异步请求导致ajax请求结果无法接收问题

1、背景描述&#xff0c;有个公司内部用的小系统&#xff0c;不想大动干戈用太多前端框架&#xff0c;就用HTML5写了个登陆页面&#xff0c;刚开始想着用form表单提交登陆账户信息。后来因为前后端分离&#xff0c;并且统一用ajax调用后台服务交互数据&#xff0c;因此在form表…

AJAX异步请求(Asynchronous Javascript And Xml)

文章目录 1、传统请求及缺点&#xff08;1&#xff09;传统的请求&#xff08;2&#xff09;传统请求存在的问题 2、AJAX概述3、XMLHttpRequest对象4、AJAX GET请求5、AJAX GET请求缓存问题6、AJAX POST请求&#xff08;1&#xff09;案例一&#xff1a;使用AJAX POST请求实现用…

AJAX 异步请求处理

AJAX Asynchronous JavaScript and XML&#xff08;异步的 JavaScript 和 XML&#xff09;。 AJAX 不是新的编程语言&#xff0c;而是一种使用现有标准的新方法。 AJAX 最大的优点是在不重新加载整个页面的情况下&#xff0c;可以与服务器交换数据并更新部分网页内容。 AJA…

如何判断一个请求是否是Ajax异步请求

前言 今天在看项目过程中&#xff0c;发现了一段代码。是用来判断一个请求是否是ajax请求&#xff0c;出于好奇&#xff0c;我研究了一番。 代码预览 /*** 是否是Ajax异步请求* * param request*/public static boolean isAjaxRequest(HttpServletRequest request){String ac…

jquery实现ajax异步请求

前端代码&#xff1a; <html> <head> <meta charset"UTF-8"> <title>异步请求</title> <script type"text/javascript" src"jquery-3.3.1.js"></script> <script type"text/javascript"…

基于深度学习的高精度山羊检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度山羊检测识别系统可用于日常生活中或野外来检测与定位山羊目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的山羊目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标检测模型…

HTML发送异步请求,使用原生JS发送ajax异步请求

Ajax Ajax: Asynchronous javaScript and xml (异步的JavaScript和xml技术)。当我们向服务器发起请求的时候,服务器不会像浏览器响应整个页面,而是只有局部刷新。它是一个异步请求。 请求: 同步请求:只有当一次请求完全结束以后才能够发起另一次请求。 异步请求:不需要其他请…

AJAX 异步请求详细教程

文章目录 AJAX 异步请求简介Jquery 版 Ajax$.ajax() -- Jquery提供的 ajax 函数注册验证用户名是否可用$.get() 与 $.post()Ajax 返回数据类型 JSONjson 简介JSON 对象JSON 数组对象数组混合格式小结 JSON 应用JSON 对象的使用JSON 数组的使用响应的 json 数组数组对象混合格式…

ajax异步请求及案例

ajax异步请求及案例 1、ajax的介绍 前端页面想和后端页面进行数据交互就可以使用ajax。让 javascript 发送异步的 http 请求&#xff0c;与后台服务器通信进行数据的获取&#xff0c;实现局部刷新。在html页面使用ajax需要在web服务器环境下运行, 一般向自己的web服务器发送a…

AJAX 异步请求数据

AJAX 的全称是Asynchronous JavaScript and XML&#xff0c;其中&#xff0c;Asynchronous 是异步的意思&#xff0c;它有别于传统web开发中采用的同步的方式。 JQuery AJAX 应用详见&#xff1a;jQuery ajax AJAX 使用 JavaScript 在 web 浏览器与 web 服务器之间来发送和接…

异步请求-AJAX

什么是同步交互 首先用户向HTTP服务器提交一个处理请求。接着服务器端接收到请求后&#xff0c;按照预先编写好的程序中的业务逻辑进行处理&#xff0c;比如和数据库服务器进行数据信息交换。最后&#xff0c;服务器对请求进行响应&#xff0c;将结果返回给客户端&#xff0c;返…

Ajax

#Ajax 概念&#xff1a; Asynchronous Javascript And XML”&#xff08;异步 JavaScript 和 XML&#xff09;&#xff0c;是指一种创建交互式网页应用的网页开发技术。 1. 异步和同步&#xff1a;客户端和服务器端相互通信的基础上 * 客户端必须等待服务器端的响应。在等待的期…

elementUI中<el-select>下拉框选项过多的页面优化方案——多列选择

效果展示(多列可以配置) 一、icon下拉框的多列选择&#xff1a; 二、常规、通用下拉框的多列选择&#xff1a; 【注】第二种常规、通用下拉框的多列选择&#xff0c;是在第一种的前端代码上删除几行代码就行&#xff08;把icon显示标签删去&#xff09;&#xff0c;所以下面着重…

python+django高校人事管理系统vue

本高校人事管理系统以Django作为框架&#xff0c;Python语言&#xff0c;B/S模式以及MySql作为后台运行的数据库。本系统主要包括以下功能模块&#xff1a;用户、院长、职称申报、工资信息、绩效信息、奖惩信息、招聘、科系分类等模块。 本文着重阐述了高校人事管理系统的分析、…

chatgpt赋能python:Python中提取纯数字的方法

Python中提取纯数字的方法 在数据清洗和数据分析中&#xff0c;经常需要将文本中的数字提取出来&#xff0c;用于后续的计算或统计分析。Python作为一种流行的数据处理语言&#xff0c;提供了多种方法来完成这个任务。 方法一&#xff1a;使用正则表达式 正则表达式是一种强…

spdk记录

spdk记录 hello_bdev命令行参数 往期文章&#xff1a; spdk环境搭建 hello_bdev 代码路径&#xff1a;examples/bdev/hello_world/hello_bdev.c 可执行文件路径&#xff1a;build/examples/hello_bdev 刚开始直接执行hello_bdev显示找不到Malloc0 ./build/examples/hello_b…

FinChat.io,金融领域的chatgpt

投资股票是一个充满挑战的过程,随着市场的起起伏伏,要抓住每一个机会,同时规避各种风险,这需要投资者具有敏锐的洞察力和快速的决策能力。不过现在有好消息,一款人工智能聊天机器人 FinChat.io 诞生了!它能帮助投资者分析市场,挖掘有潜力的股票,并提供买卖的实时建议 --------…

码农翻身——JDBC的诞生

随着 Oracle, Sybase, SQL Server ,DB2, Mysql 等人陆陆续续住进数据库村&#xff0c; 这里呈现出一片兴旺发达的景象&#xff0c; 无数的程序在村里忙忙碌碌&#xff0c; 读写数据库&#xff0c; 实际上一个村落已经容不下这么多人了&#xff0c; 数据库村变成了数据镇。 这…