Bresenham画线算图形学中最基础的知识了,可惜我并没有选修过图形学,所有还是有必要熟悉一下。

上一篇用到的画线函数应该算是数值微分法,也是我最常用的一种方法,不过这种方法似乎并不是很好。

这里的画线方法比上一种方法好。

算法原理如下:

过各行各列象素中心构造一组虚拟网格线。按直线从起点到终点的顺序计算直线与各垂直网格线的交点,然后确定该列象素中与此交点最近的象素。

该算法的巧妙之处在于采用增量计算,使得对于每一列,只要检查一个误差项的符号,就可以确定该列的所求象素。

更细节的原理参考这里

随机画出的一些线:

matlab代码如下:

main.m

  1. clear all;close all;clc;
  2.  
  3. h=;
  4. w=;
  5. img=zeros(h,w);
  6.  
  7. for i=:
  8. x1=round(rand()*(w-))+;
  9. y1=round(rand()*(h-))+;
  10. x2=round(rand()*(w-))+;
  11. y2=round(rand()*(h-))+;
  12.  
  13. img=BresenhamDraw(img,x1,y1,x2,y2);
  14.  
  15. figure();
  16. imshow(img,[])
  17.  
  18. end

BresenhamDraw.m

  1. function img=BresenhamDraw(img,x1,y1,x2,y2)
  2. if x1~=x2
  3. k=(y2-y1)/(x2-x1);
  4. flag=; %斜率判断标记位
  5. if abs(k)> %如果斜率大于1,则把xy方向置换
  6. flag=;
  7. k=/k;
  8. [y1 x1]=Swap(x1,y1);
  9. [y2 x2]=Swap(x2,y2);
  10. end
  11.  
  12. %计算开始画线的像素
  13. mi=min(x1,x2);
  14. ma=max(x1,x2);
  15. if mi==x1
  16. s=y1;
  17. else
  18. s=y2;
  19. end
  20.  
  21. d=;
  22. for i=mi:ma
  23. if flag==
  24. img(s,i)=;
  25. else
  26. img(i,s)=;
  27. end
  28. d=d+k;
  29. %自变量i每加1,根据d是否超过一个像素来确定因变量s增加或减少
  30. if d>=
  31. d=d-;
  32. s=s+;
  33. elseif d<=-
  34. d=d+;
  35. s=s-;
  36. end
  37. end
  38. end
  39.  
  40. end

Swap.m

  1. function [y x]=Swap(x1,y1)
  2. x=y1;
  3. y=x1;
  4. end

matlab练习程序(Bresenham画线)的更多相关文章

  1. Bresenham画线算法

    [Bresenham画线算法] Bresenham是一种光栅化算法.不仅可以用于画线,也可以用用画圆及其它曲线. 通过lower与upper的差,可以知道哪一个点更接近线段: 参考:<计算机图形 ...

  2. 计算机图形学DDA画线法+中点画线法+Bresenham画线法

    #include <cstdio> #include <cstring> #include <conio.h> #include <graphics.h> ...

  3. VC++ Bresenham画线实例

    附带百度链接:http://wenku.baidu.com/link?url=GP4uDkoyulgNxQy5djBBi-JB5BCrMWW6svMDhSfmzi_Qi1s6DhwJiCPHdMI2o ...

  4. 两种画线算法(DDA&Bersenham)

    DDA(digital differential analyzer) 由直线的斜截式方程引入 对于正斜率的线段,如果斜率<=1,则以单位x间隔(δx=1)取样,并逐个计算每一个y值 Yk+1 = ...

  5. MATLAB plot画线的颜色设定

    plot中画线的颜色通常是八种: 标记符    颜色r          红g          绿b          蓝c          蓝绿m          紫红y          黄 ...

  6. MFC消息映射机制以及画线功能实现

    ---此仅供用于学习交流,切勿用于商业用途,转载请注明http://www.cnblogs.com/mxbs/p/6213404.html. 利用VS2010创建一个单文档标准MFC工程,工程名为Dr ...

  7. WPF画线问题,几千条以后就有明显的延迟了。

      我现在是这么画的,class A { private GeometryGroup _lines; private Path _path; public A() {    _path.Data = ...

  8. VC动态轨迹画线

    分类: 2.4 线程/图形学2010-04-30 22:14 1878人阅读 评论(0) 收藏 举报 文档null 这是一个绘制直线的简单绘图程序,能过实现动态轨迹画线,在拖动时产生临时线来表示可能画 ...

  9. 画线函数Glib_Line算法的研究

      在这里首先先简单把我对函数的功能的理解阐述一下,方便后面的分析:Glib_Line函数实现的功能是通过参数给定(x1,y1,x2,y2,color),来确定起点(x1,y1)和终点(x2,y2)两 ...

随机推荐

  1. HTTP记录

    -------------TCP握手协议------------- 在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接. [第一次握手]建立连接时,客户端发送syn包(syn ...

  2. python之freshman00

    编译型vs解释型 编译型优点:编译器一般会有预编译的过程对代码进行优化.因为编译只做一次,运行时不需要编译,所以编译型语言的程序执行效率高.可以脱离语言环境独立运行.缺点:编译之后如果需要修改就需要整 ...

  3. 自己写的一个ASP.NET服务器控件Repeater和GridView分页类

    不墨迹,直接上代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; usin ...

  4. ui-grid 中cellTemplate中click事件

    cellTemplate中使用的函数: 外部定义的函数:

  5. 洛谷 P4280 bzoj1786 [AHOI2008]逆序对(dp)

    题面 luogu bzoj 题目大意: 给你一个长度为\(n\)的序列,元素都在\(1-k\)之间,有些是\(-1\),让你把\(-1\)也变成\(1-k\)之间的数,使得逆序对最多,求逆序对最少是多 ...

  6. Python- sort()/sorted()

    Python list内置sort()方法用来排序,也可以用python内置的全局sorted()方法来对可迭代的序列排序生成新的序列. sorted(iterable,key=None,revers ...

  7. bzoj1079 着色方案 记忆化搜索(dp)

    题目传送门 题目大意: 有k种颜色,每个颜色ci可以涂个格子,要求相邻格子颜色不能一样,求方案数.ci<=5,k<=15. 思路: 题目里最重要的限制条件是相邻格子颜色不能相同,也就是当前 ...

  8. 115th LeetCode Weekly Contest Check Completeness of a Binary Tree

    Given a binary tree, determine if it is a complete binary tree. Definition of a complete binary tree ...

  9. vue $index,$key已经移除了

    之前可以这样: <ul id="example"> <li v-for="item in items"> {{$index}} {{$k ...

  10. linux对于zombie的处理

    @(Linux基础)[僵尸进程处理] 今天在服务器上推送项目的时候,突然发现很卡.就用top查看了一下,果然此事不简单啊. top - 10:39:16 up 20 days, 23:11, 2 us ...