首页 > 编程语言 >光栅化算法-中点画圆算法

光栅化算法-中点画圆算法

时间:2023-04-11 23:56:35浏览次数:37  
标签:frac 算法 画圆 dx dy 光栅

光栅化算法-中点画圆算法

中点画圆算法

对圆形光栅化时,只需考虑在极坐标下 \(\theta\in[\pi/4,\pi/2]\) 的点即可,其他的点可通过对称法绘制。

将圆形光栅化的算法类似于Bresenham算法。设当前绘制的点的坐标为 \(P_{k}(x_{k},y_{k})\) ,那么下一个点的坐标为 \(P_{k+1}(x_{k+1},y_{k+1})\) 。从 \(x\) 轴开始取样,那么 \(x_{k+1}=x_{k}+1\) ,而 \(y_{k+1}\) 的值可能为 \(y_{k}\) 或 \(y_{k}-1\) 。为确定具体绘制的点,需引入一个决策参数 \(p\) 。

设圆函数为 \(f(x,y)=x^2+y^2-r^2\) ,其中 \(r\) 表示圆的半径。取两个可能的点的中点 \((x_{k}+1,y_{k}-\frac{1}{2})\) ,将其带入圆函数,定义决策参数为:

\[p_{k}=f(x_{k}+1,y_{k}-\frac{1}{2})=(x_{k}+1)^2+(y_{k}-\frac{1}{2})^2-r^2 \]

将初始顶点 \(P_{1}(0, r)\) 代入决策参数方程可得初始决策参数 \(p_{1}=\frac{5}{4}-r\) 。再通过 \(p_{k+1}-p_{k}\) 的方式即可得到决策参数 \(p_{k}\) 的递推方程:

\[p_{1}=\frac{5}{4}-r \]

\[p_{k+1}=\left\{\begin{matrix}p_{k}+2x_{k+1}-2y_{k+1}+1,p_{k}\ge0\\p_{k}+2x_{k+1}+1,p_{k}<0\end{matrix}\right. \]

如果程序输入时的半径 \(r\) 恒为整数,则可将初始决策参数设置为 \(p_{1}=1-r\) 。由于递推方程中的计算均为整数计算,因此修改后不影响结果。

C++/OpenGL实现

下述代码为中点画圆算法绘制任意圆形的C++/OpenGL实现:

/**
 * 中点画圆算法
 */
void midPointCircle(GLint ox, GLint oy, GLint r) {
    int dx = 0, dy = r; // 当前绘制的点与圆心的横纵坐标差值
    int p = 1 - r; // 决策参数
    circlePlotPoints(ox, oy, dx, dy);
    while (dx < dy) {
        dx++;
        if (p >= 0) {
            dy--;
            p += ((dx - dy) << 1) + 1;
        } else {
            p += (dx << 1) + 1;
        }
        circlePlotPoints(ox, oy, dx, dy);
    }
}
/**
 * 画出所有对称的点
 */
void circlePlotPoints(GLint ox, GLint oy, GLint dx, GLint dy) {
    glVertex2i(ox + dx, oy + dy);
    glVertex2i(ox + dx, oy - dy);
    glVertex2i(ox + dy, oy + dx);
    glVertex2i(ox + dy, oy - dx);
    glVertex2i(ox - dx, oy + dy);
    glVertex2i(ox - dx, oy - dy);
    glVertex2i(ox - dy, oy + dx);
    glVertex2i(ox - dy, oy - dx);
}

标签:frac,算法,画圆,dx,dy,光栅
From: https://www.cnblogs.com/kkelin/p/17308320.html

相关文章

  • 复杂网络社区发现算法聚类分析全国电梯故障数据和可视化:诊断电梯“安全之殇”|附代码
    参考原文:http://tecdat.cn/?p=2186最近我们被客户要求撰写关于复杂网络社区发现算法的研究报告,包括一些图形和统计输出。物业工程肩负着维持项目各类设施设备的正常运作,保障全体业主的正常生活,令物业保值升值,是项目的心脏部门。拓端数据(tecdat)研究人员根据全国电梯故障上报汇总......
  • 算法导论-第3章-描述运行时间
    第3章描述运行时间本章研究算法的渐近(asymptotic)效率。我们关心的是,当输入规模足够大时,算法运行时间与随着输入规模的增大发生怎样的变化,即研究\(T(n)\)随着\(n\)的增大发生怎样的变化。3.1\(\Omicron\)符号,\(\Omega\)符号,\(\Theta\)符号\(\Omicron\)符号描述函数的渐近上界......
  • 基于PSO粒子群算法优化RBF网络的数据预测matlab仿真
    1.算法描述1985年,Powell提出了多变量插值的径向基函数(RBF)方法。径向基函数是一个取值仅仅依赖于离原点距离的实值函数,也可以是到任意一点c的距离,c点称为中心点。任意满足上述特性的函数,都可以叫做径向基函数。一般使用欧氏距离计算距离中心点的距离(欧式径向基函数)。最常用的径向......
  • 双线性插值算法及需要注意事项
    最近在编程时用到了双线性插值算法,对图像进行缩放。网上有很多这方面的资料,介绍的也算明白。但是,这些文章只介绍了算法,并没有具体说怎么实现以及怎么实现最好,举个例子,你可以按照网上文章的算法自己写一个双线性插值程序,用它对一张图片进行处理,然后再用matlab或者openCV的resize函数......
  • MATLAB代码:基于粒子群算法的储能优化配置
    MATLAB代码:基于粒子群算法的储能优化配置关键词:储能优化配置粒子群 储能充放电优化主要内容:建立了储能的成本模型,包含运行维护成本以及容量配置成本,然后以该成本函数最小为目标函数,经过粒子群算法求解出其最优运行计划,并通过其运行计划最终确定储能容量配置的大小,求解采用的......
  • MATLAB代码:基于改进粒子群算法的微网多目标优化调度
    MATLAB代码:基于改进粒子群算法的微网多目标优化调度关键词:微网多目标优化调度粒子群算法仿真平台:matlab主要内容:代码提出了一种综合考虑微电网系统运行成本和环境保护成本的并网模式下微电网多目标优化调度模型。同时采用改进的粒子群算法对优化模型进行求解,具体改进的......
  • 基于PSO粒子群算法优化RBF网络的数据预测matlab仿真
    1.算法描述      1985年,Powell提出了多变量插值的径向基函数(RBF)方法。径向基函数是一个取值仅仅依赖于离原点距离的实值函数,也可以是到任意一点c的距离,c点称为中心点。任意满足上述特性的函数,都可以叫做径向基函数。一般使用欧氏距离计算距离中心点的距离(欧式径向基函数)。......
  • 基于MPPT算法的PV光伏阵列电网模型simulink仿真
    1.算法描述       光伏阵列(PhotovoltaicArray)是多片光伏模组的连接,也是更多光伏电池的连接,光伏阵列是最大规模的光伏发电系统。太阳能电池透过光生伏特效应可以将太阳光能转化成直流电能,但一块光伏模组(光伏板)能够产生的电流不够一般住宅使用,所以将数块光伏模组连接在......
  • m基于GA遗传优化和OSPF协议的WSN最短路由算法matlab仿真,并输出节点的不同层域
    1.算法仿真效果matlab2022a仿真结果如下:    2.算法涉及理论知识概要2.1GA遗传优化        GA把问题的解表示成“染色体”,在算法中也即是以二进制编码的串。并且,在执行遗传算法之前,给出一群“染色体”,也即是假设解。然后,把这些假设解置于问题的“环境”中,并按......
  • 数字水印_最低有效位算法
    数字水印_最低有效位算法原文链接:https://blog.csdn.net/chengfenglee/article/details/123771536最低有效位(LeastSignificantBit.,LSB)指的是一个二进制数中的第0位(即最低位)最低有效位信息隐藏指的是,将一个需要隐藏的二值图像信息嵌入载体图像的最低有效位,即将载......