易懂的Bresenham算法计算圆上各点坐标

2023-11-23 10:20

本文主要是介绍易懂的Bresenham算法计算圆上各点坐标,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Bresenham简介:

在我们内部开发使用的一个工具中,我们需要几乎从 0 开始实现一个高效的二维图像渲染引擎。比较幸运的是,我们只需要画直线、圆以及矩形,其中比较复杂的是画直线和圆。画直线和圆已经有非常多的成熟的算法了,我们用的是Bresenham的算法。

计算机是如何画直线的?简单来说,如下图所示,真实的直线是连续的,但我们的计算机显示的精度有限,不可能真正显示连续的直线,于是我们用一系列离散化后的点(像素)来近似表现这条直线。

如下图:

 而Bresenham直线算法是用来描绘由两点所决定的直线的算法,它会算出一条线段在 n 维光栅上最接近的点。这个算法只会用到较为快速的整数加法、减法和位元移位,常用于绘制电脑画面中的直线。是计算机图形学中最先发展出来的算法。

å¨è¿éæå¥å¾çæè¿°

对于圆来说,我们可以利用其对称性,求出八分之一圆上所有点的坐标,那么其余七部分所有坐标便全都求了出来,以至于为什么是八分,其原因就是:八分之一部分可以保证切线斜率绝对值在[0,1]之间,这才是使用Bresenham算法的基础。而实现Bresenham的根本之道便是求出迭代决策公式 —— 距离相减求误差,判断误差正负选增量方向;

 

具体推导过程:

由于篇幅原因,转载一下别人的推导公式:https://blog.csdn.net/mayh554024289/article/details/44781531(实话:时间关系,编者懒。。。公式不想推。)

最后得到的便是下面的算法步骤中的第4步判别式;

算法步骤:

1、输入圆的半径r;

2、计算初始值d=1.25-r,x=0,y=r;

3、根据对称性计算出八分圆中另外的七个对称点;

4、判断d的符号,若d>0,则将d+=2x+3,否则将d+=2(x-y)+5,并且将y--;最后再将x++;

5、当x<y时,重复3、4步骤,否则结束;

 

#include<cstdio>
#include<cmath>
int main() {int r;printf("请输入半径:\n");scanf("%d",&r);int a,b;printf("请输入圆心坐标");scanf("%d%d",&a,&b);int d=1-r;int x=0;int y=r;for(; x<y; ++x) {printf("第一象限上:(%d,%d)\n",x+a,y+b);printf("第一象限下:(%d,%d)\n",y+a,x+b);printf("第二象限上:(%d,%d)\n",y+a,-x+b);printf("第二象限下:(%d,%d)\n",x+a,-y+b);printf("第三象限下:(%d,%d)\n",-x+a,-y+b);printf("第三象限上:(%d,%d)\n",-y+a,-x+b);printf("第四象限下:(%d,%d)\n",-y+a,x+b);printf("第四象限上:(%d,%d)\n",-x+a,y+b);printf("\n");if(d<=0)d+=2*x+3;else {y--;d+=2*(x-y)+5;}}return 0;
}

 

这篇关于易懂的Bresenham算法计算圆上各点坐标的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/417247

相关文章

Python并行处理实战之如何使用ProcessPoolExecutor加速计算

《Python并行处理实战之如何使用ProcessPoolExecutor加速计算》Python提供了多种并行处理的方式,其中concurrent.futures模块的ProcessPoolExecu... 目录简介完整代码示例代码解释1. 导入必要的模块2. 定义处理函数3. 主函数4. 生成数字列表5.

Java计算经纬度距离的示例代码

《Java计算经纬度距离的示例代码》在Java中计算两个经纬度之间的距离,可以使用多种方法(代码示例均返回米为单位),文中整理了常用的5种方法,感兴趣的小伙伴可以了解一下... 目录1. Haversine公式(中等精度,推荐通用场景)2. 球面余弦定理(简单但精度较低)3. Vincenty公式(高精度,

使用雪花算法产生id导致前端精度缺失问题解决方案

《使用雪花算法产生id导致前端精度缺失问题解决方案》雪花算法由Twitter提出,设计目的是生成唯一的、递增的ID,下面:本文主要介绍使用雪花算法产生id导致前端精度缺失问题的解决方案,文中通过代... 目录一、问题根源二、解决方案1. 全局配置Jackson序列化规则2. 实体类必须使用Long封装类3.

Springboot实现推荐系统的协同过滤算法

《Springboot实现推荐系统的协同过滤算法》协同过滤算法是一种在推荐系统中广泛使用的算法,用于预测用户对物品(如商品、电影、音乐等)的偏好,从而实现个性化推荐,下面给大家介绍Springboot... 目录前言基本原理 算法分类 计算方法应用场景 代码实现 前言协同过滤算法(Collaborativ

windows和Linux使用命令行计算文件的MD5值

《windows和Linux使用命令行计算文件的MD5值》在Windows和Linux系统中,您可以使用命令行(终端或命令提示符)来计算文件的MD5值,文章介绍了在Windows和Linux/macO... 目录在Windows上:在linux或MACOS上:总结在Windows上:可以使用certuti

使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)

《使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)》PPT是一种高效的信息展示工具,广泛应用于教育、商务和设计等多个领域,PPT文档中常常包含丰富的图片内容,这些图片不仅提升了... 目录一、引言二、环境与工具三、python 提取PPT背景图片3.1 提取幻灯片背景图片3.2 提取

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时