正确的BresenHam算法。请各位讲解一下优化算法!

2023-11-29 03:18

本文主要是介绍正确的BresenHam算法。请各位讲解一下优化算法!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

     正确的画直线算法:
     不过,第二个使用整数的变形算法搞不大明白

/*Bresenham算法

    Bresenham算法是计算机图形学领域使用最广泛的直线扫描转换算法。仍然假定直线斜率在0~1之间,该方法类似于中点法,由一个误差项符号决定下一个象素点。

    算法原理如下:过各行各列象素中心构造一组虚拟网格线。按直线从起点到终点的顺序计算直线与各垂直网格线的交点,然后确定该列象素中与此交点最近的象素。该算法的巧妙之处在于采用增量计算,使得对于每一列,只要检查一个误差项的符号,就可以确定该列的所求象素。

    如图2.1.4所示,设直线方程为yi+1=yi+k(xi+1-xi)+k。假设列坐标象素已经确定为xi,其行坐标为yi。那么下一个象素的列坐标为xi+1,而行坐标要么为yi,要么递增1为yi+1。是否增1取决于误差项d的值。误差项d的初值d0=0,x坐标每增加1,d的值相应递增直线的斜率值k,即d=d+k。一旦  d≥1,就把它减去1,这样保证d在0、1之间。当d≥0.5时,直线与垂线x=xi+1交点最接近于当前象素(xi,yi)的右上方象素(xi+1,yi+1);而当d<0.5时,更接近于右方象素(xi+1,yi)。为方便计算,令e=d-0.5,e的初值为-0.5,增量为k。当e≥0时,取当前象素(xi,yi)的右上方象素(xi+1,yi+1);而当e<0时,取(xi,yi)右方象素(xi+1,yi)。

 

图2.1.4 Bresenham算法所用误差项的几何含义

 */


 //Bresenham画线算法程序:

void Bresenhamline (int x0,int y0,int x1, int y1,int color)

{ int x, y, dx, dy;

  float k, e;

  dx = x1-x0;dy = y1- y0;k=dy/dx;//dx,dy是直线总的增量。k是实数的斜率
 
  e=-0.5; x=x0;y=y0;//x,y为起点。e是调整数,以使问题成为〉=0,还是<0的问题。
/*
为方便计算,令e0=-0.5,e i+1=di+1-0.5,增量为k。当ei+1≥0时,取当前像素(xi,yi)
的右上方像素(xi+1, yi+1);而当e i+1<0时,更接近于右方像素(xi+1,yi)。
*/
//这里,我们利用了k=dy/dx这个斜率,而不是利用上面的逐个比较的方法。
//实数yi的值>=0.5,则用y(整数)+1的像素,<0.5则y轴仍用上一个像素的y坐标。
//一旦,用y+1,则我们的yi这个y轴的实数增量就会多出1这个增量。所以,一旦y++,就要yi--。
//这里,为了使我们不是判断是否>=0.5,而是改为判断是否>=0,我们需要对所有的yi-0.5。
//这实际上只需yi-0.5一次即可。因为yi是连续的增量----+k。
//这里我们用float e表示yi,并且赋e=-0.5,以后e=e+k,这样实际上就实现了给e-0.5的目的。
  for (i=0;i<dx;i++)//循环dx次,即绘制dx个像素。
  { drawpixel (x, y, color);

    x=x+1;e=e+k;

    if (e>=0)

    { y++; e=e-1;}

  }

}

 /*举例:用Bresenham方法扫描转换连接两点P0(0,0)和P1(5,2)的直线段。

 i x y e
0
 --  0 0 -0.5
    1     -0.1
      
   1 0 -0.1

   2 1 -0.7

   3 1 -0.3

   4 2 -0.9                                    图2.1.5 Bresenham算法

   5 2 -0.5

 

    上述Bresenham算法在计算直线斜率与误差项时用到小数与除法。可以改用整数以避免除法。
    由于算法中只用到误差项的符号,因此可作如下替换:2*e*dx。 

 改进的Bresenham画线算法程序:
*/
void InterBresenhamline (int x0,int y0,int x1, int y1,int color)

{
int x, y, dx, dy;

 int k, e;
dx = x1-x0;dy = y1- y0;e=-dx;

  x=x0;
  y=y0;

  for (i=0; i<dx; i++)

  {drawpixel (x, y, color);

   x++; e=e+2*dy;//大概是用2倍的y的绝对增量减去x的绝对增量这样的方法来计算的。
   //具体怎样也搞不清楚!!!!!

   if (e>=0) { y++; e=e-2*dx;}

   }

}

 

这篇关于正确的BresenHam算法。请各位讲解一下优化算法!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Python Transformers库(NLP处理库)案例代码讲解

《PythonTransformers库(NLP处理库)案例代码讲解》本文介绍transformers库的全面讲解,包含基础知识、高级用法、案例代码及学习路径,内容经过组织,适合不同阶段的学习者,对... 目录一、基础知识1. Transformers 库简介2. 安装与环境配置3. 快速上手示例二、核心模

MySQL索引的优化之LIKE模糊查询功能实现

《MySQL索引的优化之LIKE模糊查询功能实现》:本文主要介绍MySQL索引的优化之LIKE模糊查询功能实现,本文通过示例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一、前缀匹配优化二、后缀匹配优化三、中间匹配优化四、覆盖索引优化五、减少查询范围六、避免通配符开头七、使用外部搜索引擎八、分

openCV中KNN算法的实现

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

C++ vector的常见用法超详细讲解

《C++vector的常见用法超详细讲解》:本文主要介绍C++vector的常见用法,包括C++中vector容器的定义、初始化方法、访问元素、常用函数及其时间复杂度,通过代码介绍的非常详细,... 目录1、vector的定义2、vector常用初始化方法1、使编程用花括号直接赋值2、使用圆括号赋值3、ve

Python通过模块化开发优化代码的技巧分享

《Python通过模块化开发优化代码的技巧分享》模块化开发就是把代码拆成一个个“零件”,该封装封装,该拆分拆分,下面小编就来和大家简单聊聊python如何用模块化开发进行代码优化吧... 目录什么是模块化开发如何拆分代码改进版:拆分成模块让模块更强大:使用 __init__.py你一定会遇到的问题模www.

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

springboot+dubbo实现时间轮算法

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

SpringBoot首笔交易慢问题排查与优化方案

《SpringBoot首笔交易慢问题排查与优化方案》在我们的微服务项目中,遇到这样的问题:应用启动后,第一笔交易响应耗时高达4、5秒,而后续请求均能在毫秒级完成,这不仅触发监控告警,也极大影响了用户体... 目录问题背景排查步骤1. 日志分析2. 性能工具定位优化方案:提前预热各种资源1. Flowable

Python基础文件操作方法超详细讲解(详解版)

《Python基础文件操作方法超详细讲解(详解版)》文件就是操作系统为用户或应用程序提供的一个读写硬盘的虚拟单位,文件的核心操作就是读和写,:本文主要介绍Python基础文件操作方法超详细讲解的相... 目录一、文件操作1. 文件打开与关闭1.1 打开文件1.2 关闭文件2. 访问模式及说明二、文件读写1.

SpringBoot3实现Gzip压缩优化的技术指南

《SpringBoot3实现Gzip压缩优化的技术指南》随着Web应用的用户量和数据量增加,网络带宽和页面加载速度逐渐成为瓶颈,为了减少数据传输量,提高用户体验,我们可以使用Gzip压缩HTTP响应,... 目录1、简述2、配置2.1 添加依赖2.2 配置 Gzip 压缩3、服务端应用4、前端应用4.1 N