中点画圆算法----计算机图形学

圆的对称特性:

 

一个八分圆上的点可以映射为其余七个八分圆的点

这里写图片描述

利用圆的对称性可以减少计算量,只需要计算出一个八分之一圆上需要画的点,就可以映射出整个圆

 

中点画圆算法:

(对于原点为(xc,yc)的圆,假定圆心在坐标原点(0,0)的像素位置,把计算出每个圆上像素点(x,y)加到屏幕位置上,即(xc+x,yc+y) )

 

现在来具体研究如何从点(0,R)到 (R/\sqrt{2} , R/\sqrt{2})顺时针地确定最佳逼近于该圆弧的像素序列。

假定横坐标为 xp 的像素中与该圆弧最近者已确定为 P=(xp,yp) ,那么,下一个像素只能是正右方的 E(xp+1,yp)或右下方的 SE(xp+1,yp-1)两者之一,如下图所示。

首先构造函数:F(x,y)=x^{2}+y^{2}-R^{2}

显然对于圆上的点,F(x, y)= 0;对于圆外的点,F(x, y)> 0 ; 对于圆内的点,F(x, y)< 0 .

假设 M 是 E 和 SE 的中点,即 M = (xp+1 , yp-0.5). 那么,当 F(M)< 0 时, M 在圆内,说明 E 距离圆弧更近,应取 E 作为下一个像素 ; 当 F(M)> 0 时,应取 SE 作为下一个像素。当 F(M)= 0 时,随便取 E 或 SE 。

 

构造判别式:

Di = F(M) =  F(xp+1, yp-0.5) =  (x_{p}+1)^{2} + (y_{p} - 0.5)^{2} - R^{2}

若 Di < 0 , 则应取 E 为下一个像素

D(i+1) =  F(Mse) =  F(xp+2, yp-1.5)=  (x_{p}+2)^{2} + (y_{p} - 1.5)^{2} - R^{2}

                                                                =   Di + 2*xp + 3

 

若 Di > 0 , 则应取 SE 为下一个像素

D(i+1) =  F(Me) =  F(xp+2, yp-0.5)=  (x_{p}+2)^{2} + (y_{p} - 0.5)^{2} - R^{2}

                                                                =   Di + (2*xp + 3) + (-2*yp + 2)

                                                                =   Di + 2*(xp - yp) + 5

 

起始位置(0,R)处初始决策参数  D0 为:

D0 =  F(0+1 , R-0.5)= 1.25 - R

 

注意:上述方法仅限于(0,R)到 (R/\sqrt{2} , R/\sqrt{2})区间,因为此区间圆弧切线斜率小于1。

如图,当点处于 (R/\sqrt{2} , R/\sqrt{2})到 (R,0)区间时,假如当前选定点为图中绿色点,则下一点应在点 A与点 B中进行选择,而不是点 A上方灰色点。这时,应由(R,0)开始,将 y 轴坐标递增 1 进行计算。

 

 

 

核心代码:

(具体实现时,考虑到浮点运算耗内存,使用 E = Di - 0.5 代替 Di , 则初始化运算 D0 = 1.25 - R 对应于 E = 1-R。判别式 Di < 0 对应于 E < 0 (由于E 始终是整数,所以 E < -0.25 等价于  E < 0)

from PySide2.QtCore import *
class Circle:def __init__(self, p, r):self.p = pself.r = rdef points_list_circle(self):points = []if self.r < 1:return pointse = 1 - self.rx = 0y = self.rps0 = []ps1 = []ps2 = []ps3 = []ps4 = []ps5 = []ps6 = []ps7 = []while x <= y:#print("x:"+str(x)+" y:"+str(y))ps0.append(QPoint(x, y))ps1.append(QPoint(y, x))ps2.append(QPoint(-y, x))ps3.append(QPoint(-x, y))ps4.append(QPoint(y, -x))ps5.append(QPoint(x, -y))ps6.append(QPoint(-x, -y))ps7.append(QPoint(-y, -x))if e <= 0:e = e + 2*x + 3else:e = e + 2*x - 2*y + 5y -= 1x += 1for p1 in ps0:p1.setX(p1.x()+self.p.x())p1.setY(p1.y()+self.p.y())points.append(p1)for p1 in ps1:p1.setX(p1.x() + self.p.x())p1.setY(p1.y() + self.p.y())points.append(p1)for p1 in ps2:p1.setX(p1.x() + self.p.x())p1.setY(p1.y() + self.p.y())points.append(p1)for p1 in ps3:p1.setX(p1.x() + self.p.x())p1.setY(p1.y() + self.p.y())points.append(p1)for p1 in ps4:p1.setX(p1.x() + self.p.x())p1.setY(p1.y() + self.p.y())points.append(p1)for p1 in ps5:p1.setX(p1.x() + self.p.x())p1.setY(p1.y() + self.p.y())points.append(p1)for p1 in ps6:p1.setX(p1.x() + self.p.x())p1.setY(p1.y() + self.p.y())points.append(p1)for p1 in ps7:p1.setX(p1.x() + self.p.x())p1.setY(p1.y() + self.p.y())points.append(p1)return points

 

加上UI界面实现效果:

 

PS: 如需参考完整代码,请移步:https://download.csdn.net/download/qq_42185999/11834678   进行下载

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

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

相关文章

Android 自定义View 画圆(奥运五环)

效果图 前言 你会画画吗&#xff1f;你会写代码吗&#xff1f;你会用代码画画吗&#xff1f; 正文 自定义View&#xff0c;实际开发过程中&#xff0c;因为涉及用户体验的时候&#xff0c;UI通常会弄一些骚操作出来&#xff0c;这个时候就有两个选择&#xff0c;你是用GIF…

PS小知识(三)——画圆滑线及虚线

一&#xff1a;画一个圆滑线 1、利用“套索工具”沿着地物画一个圈&#xff1b;或者利用“磁性套索工具”画圈&#xff08;这个的特点是可以大致按照不同的颜色自动追踪&#xff09;。 2、右击进行“描边” 3、进行下面的“平滑”操作 二&#xff1a;画一个圆滑且各段等长的…

html画布里面画圆,html5 canvas 画布画圆

什么是 Canvas? HTML5 的 canvas 元素使用 JavaScript 在网页上绘制图像。javascript 画布是一个矩形区域,您能够控制其每一像素。css canvas 拥有多种绘制路径、矩形、圆形、字符以及添加图像的方法。html 浏览器支持 Internet Explorer 9+, Firefox, Opera, Chrome 以及 Sa…

Bresenham 画圆算法原理

文章目录 前言Bresenham 画圆算法原理两个近似构造判别式圆与网格点的关系关系由来关系含义 p i p_i pi​ 递推画圆程序伪码 圆与网格点的关系图示 前言 首先简要介绍一下生成圆的方法&#xff1a; 直接利用圆的方程生成圆利用圆的对称性生成圆 方法一由于会涉及到浮点运算等…

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;用户、院长、职称申报、工资信息、绩效信息、奖惩信息、招聘、科系分类等模块。 本文着重阐述了高校人事管理系统的分析、…