首页 > 编程语言 >直线光栅化-Bresenham算法

直线光栅化-Bresenham算法

时间:2023-04-10 20:56:46浏览次数:31  
标签:deltaX deltaY Bresenham 算法 Delta y1 x1 光栅

直线光栅化-Bresenham算法

Bresenham算法

对于两个顶点 \(P_{1}(x_{1},y_{1})\) 和 \(P_{2}(x_{2},y_{2})\) 满足 \(\Delta x =x_{2}-x_{1}>0\) 且 \(\Delta y=y_{2}-y_{1}>0\) 。设两点确定的直线方程的斜率为 \(k=\frac{\Delta y}{\Delta x}\) 。当 \(0<k<1\) 时,从 \(x\) 轴开始取样,决策参数递推方程为:

\[p_{1}=2\Delta y-\Delta x \]

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

当 \(p_{k}\ge0\) 时 \(y_{k+1}=y_{k}+1\) ,当 \(p_{k}<0\) 时 \(y_{k+1}=y_{k}\) 。

当 \(k>1\) 时,则交换 \(x\) 和 \(y\) 变量,则变换后的直线方程斜率 \(k'=\frac{1}{k}\in(0,1)\),此时归结为上述情况。

对于一般的直线光栅化算法,只需根据坐标系象限的对称性修改上述参数即可。

C++/OpenGL实现

下述代码为Bresenham算法绘制任意直线的C++/OpenGL代码实现:

void drawLineBresenham(GLint x1, GLint y1, GLint x2, GLint y2) {
    int deltaX = x2 - x1, deltaY = y2 - y1;
    double k = 1.0 * deltaY / deltaX;
    deltaX = abs(deltaX), deltaY = abs(deltaY);
    if (k < -1 || 1 < k) { // 斜率小于-1或大于1则交换x和y变量
        int tt = abs(deltaX); deltaX = abs(deltaY); deltaY = tt;
    }
    int p = (deltaY << 1) - deltaX; // 决策参数
    int dp1 = (deltaY << 1) - (deltaX << 1), dp2 = (deltaY << 1); // 缓存递推时常量
    int dx = (x1 < x2) ? 1 : -1, dy = (y1 < y2) ? 1 : -1; // 绘制方向
    int count = deltaX; // 绘制次数
    glVertex2i(x1, y1);
    if (-1 < k && k < 1) {
        for (int i = 1; i < count; i++) {
            x1 += dx; y1 += (p >= 0) ? dy : 0; // 计算下一个坐标
            glVertex2i(x1, y1);
            p += (p >= 0) ? dp1 : dp2; // 计算下一个决策参数
        }
    } else {
        for (int i = 1; i < count; i++) {
            x1 += (p >= 0) ? dx : 0; y1 += dy; // 计算下一个坐标
            glVertex2i(x1, y1);
            p += (p >= 0) ? dp1 : dp2; // 计算下一个决策参数
        }
    }
}

标签:deltaX,deltaY,Bresenham,算法,Delta,y1,x1,光栅
From: https://www.cnblogs.com/kkelin/p/17304257.html

相关文章

  • 基于深度学习网络的5G通信链路信道估计算法matlab仿真
    1.算法描述        深度学习(英语:deeplearning),是一个多层神经网络是一种机器学习方法。在深度学习出现之前,由于诸如局部最优解和梯度消失之类的技术问题,没有对具有四层或更多层的深度神经网络进行充分的训练,并且其性能也不佳。但是,近年来,Hinton等人通过研究多层神经网络,......
  • KMP算法(串的模式匹配算法)(未完待续......)
    KMP算法的实现1.基本原理  在暴力破解算法(BF算法)中,模式串需要一个一个来跟主串进行对比,若有一个不相同,则主串前进一位,继续从头开始进行比较,这样比较的最坏时间复杂度为O(mn),例:‘aaaaaaaaab’和‘aaab’,需要比较到最后一个才能成功,效率太过低下。  KMP算法的原理是,找到模式串......
  • 基于FastICA算法的混合信号解混合信号恢复仿真
    1.算法描述       独立成分分析(IndependentComponentAnalysis,ICA)是近年来提出的非常有效的数据分析工具,它主要用来从混合数据中提取出原始的独立信号。它作为信号分离的一种有效方法而受到广泛的关注。近几年出现了一种快速ICA算法(FastICA),该算法是基于定点递推算法......
  • R语言关联规则挖掘apriori算法挖掘评估汽车性能数据
    全文链接:http://tecdat.cn/?p=32092原文出处:拓端数据部落公众号我们一般把一件事情发生,对另一件事情也会产生影响的关系叫做关联。而关联分析就是在大量数据中发现项集之间有趣的关联和相关联系(形如“由于某些事件的发生而引起另外一些事件的发生”)。我们的生活中有许多关联,一......
  • opencv-python 4.16. 基于GrabCut算法的交互式前景提取
    理论GrabCut算法由英国剑桥微软研究院的CarstenRother,VladimirKolmogorov和AndrewBlake设计。在他们的论文:"GrabCut":interactiveforegroundextractionusingiteratedgraphcuts中提出了一种基于最小用户交互的前景提取算法,其结果为GrabCut。从用户的角度来看,它是如何工......
  • 关于滑动窗口算法的应用场景
    算法原理滑动窗口算法是一种基于双指针(又称滑动窗口)的算法,是一种常用的数据处理算法,通常用于解决数组或字符串中的子数组或子串问题。滑动窗口算法的基本思想是使用两个指针left和right来定义一个窗口,窗口内包含满足特定条件的元素子序列,然后不断移动指针left和right来滑动窗口,......
  • 【贪心算法】NO134 加油站
    134.加油站在一条环路上有n个加油站,其中第i个加油站有汽油gas[i]升。你有一辆油箱容量无限的的汽车,从第i个加油站开往第i+1个加油站需要消耗汽油cost[i]升。你从其中的一个加油站出发,开始时油箱为空。给定两个整数数组gas和cost,如果你可以绕环路行驶一周,则返......
  • 2023-04-09 有向图及相关算法
    有向图及相关算法1有向图的实现有向图的的应用场景社交网络中的关注互联网连接程序模块的引用任务调度学习计划食物链论文引用无向图是特殊的有向图,即每条边都是双向的改进Graph和WeightedGraph类使之支持有向图Graph类的改动WeightedGraph类的改动2有向图算......
  • 优先级队列PriorityQueue在算法问题中的使用
    文章目录优先级队列介绍与优先级队列有关的习题[179.最大数][918.环形子数组的最大和][1094.拼车][264.丑数II]前k个出现频率最高的数字用优先级队列合并k个有序链表滑动窗口的最大值其他:对二维数组自定义排序优先级队列介绍优先队列一般基于二叉堆实现,二叉堆:堆的根节点的优......
  • 算法类问题
    木棒三角形(枚举)#include<iostream>#include<stdlib.h>usingnamespacestd;intmain()//木棒三角形有n根木棍挑出其中三根构成直角三角形输出面积最大的三角形面积输入n再输入每根三角形长度,n<100{ intn;//输入n根木棍再分别输入每根木棍的长度限制了n数量小于100 i......