matlab练习程序(Bresenham画线)

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

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

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

算法原理如下:

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

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

更细节的原理参考这里

随机画出的一些线:

matlab代码如下:

main.m

clear all;close all;clc;

h=256;
w=256;
img=zeros(h,w);

for i=1:100
    x1=round(rand()*(w-1))+1;
    y1=round(rand()*(h-1))+1;
    x2=round(rand()*(w-1))+1;
    y2=round(rand()*(h-1))+1;

    img=BresenhamDraw(img,x1,y1,x2,y2);

    figure(1);
    imshow(img,[])

end

BresenhamDraw.m

function img=BresenhamDraw(img,x1,y1,x2,y2)
     if x1~=x2
        k=(y2-y1)/(x2-x1);
        flag=0;         %斜率判断标记位
        if abs(k)>1     %如果斜率大于1,则把x和y方向置换
            flag=1;
            k=1/k;
            [y1 x1]=Swap(x1,y1);
            [y2 x2]=Swap(x2,y2);
        end

        %计算开始画线的像素
        mi=min(x1,x2);
        ma=max(x1,x2);
        if mi==x1
            s=y1;
        else
            s=y2;
        end

        d=0;
        for i=mi:ma
            if flag==0
                img(s,i)=1;
            else
                img(i,s)=1;
            end
            d=d+k;
            %自变量i每加1,根据d是否超过一个像素来确定因变量s增加或减少
            if d>=1
                d=d-1;
                s=s+1;
            elseif d<=-1
                d=d+1;
                s=s-1;
            end
        end
     end

end

Swap.m

function [y x]=Swap(x1,y1)
    x=y1;
    y=x1;
end
时间: 2024-12-28 12:28:37

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

图形学--(中点画线法+Bresenham画线算法)

编程环境:codeblocks+EGE库 用到的函数:putpixel(int x1,int y1,int color)  用某种颜色打亮一个坐标点. 这俩种算法都是用来在计算机上画一条直线的,那么我们为什么不直接用直线方程分别带点再打亮呢,这是因为,计算机中每个坐标点都是整数,而直线是由一个个像素点组合而成的,那么,直接将坐标点再进行四舍五入整数化就好了啊,的确,这是一种方法,但计算机中进行浮点数的四舍五入会使运算效率变差,因此真正画直线时是用到上边这俩种方法的. 1.中点画线法 只考虑当直线

Bresenham画线算法

[Bresenham画线算法] Bresenham是一种光栅化算法.不仅可以用于画线,也可以用用画圆及其它曲线. 参考:<计算机图形学>3.5.3 Bresenham画线算法 Bresenham画线算法

计算机图形学中的中点画线,中点画圆,Bresenham画线与画圆算法

#include<iostream>#include<graphics.h>  // 这样引用 EasyX 图形库#include<conio.h>#include<time.h>#include<math.h>#include<stdlib.h>using namespace std; //Bresenham画线void Bresenham_line(int x0,int y0,int x1,int y1){ int x,y,dx,

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

#include <cstdio> #include <cstring> #include <conio.h> #include <graphics.h> void line1(){ line(100, 100, 200, 400); line(100, 400, 200, 100); line(0, 200, 300, 300); line(0, 300, 300, 200); } void lineDDA(int x0, int y0, int x1,

Bresenham画线算法详解及其OpenGL编程实现

http://blog.csdn.net/xiajun07061225/article/details/7018719 Bresenham是由Bresenham提出的一种精确而有效地光栅线生成算法,该算法仅使用增量整数计算.另外,它还可以用于显示其它曲线. 我们以斜率大于0小于1的线段来进行考虑.以单位x间隔进行取样.每次绘制了当前像素点(xk,yk)之后,需要确定下一个要绘制的点是(xk+1,yk)还是(xk+1,yk+1),需要判断哪一个点像素点更接近线路径. 在取样位置,我们使用d1和d2

图形学_画线算法(DDA、Bresenham)

1. DDA算法实现直线绘制(需先安装easyx,百度下载即可) 1 #include "easyx.h" 2 #include "math.h" 3 #include "windows.h" 4 #include "stdio.h" 5 #include "stdlib.h" 6 #include "conio.h" 7 #include "graphics.h"

计算机图形学(二)输出图元_3_画线算法_3_Bresenham画线算法

Bresenham画线算法 本来在word中是有右下数的,一编辑在csdn中编辑就没有了.                         Bresenham画线算法是由Bresenham提出的一种精确而有效的光栅线生成算法,该算法仅仅使用增量整数计算.另外Bresenham算法还可用于显示圆和其他曲线.图3.8和图3.9给出了绘制线段的屏幕局部.垂直轴表示扫描线位置,水平轴标识像素列.在这个例子中,我们以单位x间隔取样,并且需要确定每次取样时两个可能的像素位置中的哪一个更接近于线路径.从图3.

两种画线算法(DDA&amp;Bersenham)

DDA(digital differential analyzer) 由直线的斜截式方程引入 对于正斜率的线段,如果斜率<=1,则以单位x间隔(δx=1)取样,并逐个计算每一个y值 Yk+1 = Yk + m   (m为由初始点确定的斜率) 对于斜率>1的线段 Xk+1 = Xk + 1/m   (m为由初始点确定的斜率) 起始端点在于右侧时 "+" -> "-" #include "stdlib.h" #include &qu

图形学复习4——光栅化(画线画圆扫描线反走样算法)

图形学复习 CH7 光栅化 前几章介绍了几何处理和裁剪变换,接下来的步骤就是光栅化 光栅化是将形式表示的几何图元转换为阵列表示的数据片元的过程,片元中每一个像素对应帧缓冲区中的每一个像素 7.1 线段生成算法 (1)DDA画线算法 设直线表达式为y=mx+b,输入直线两端点坐标(x0,y0)和(xend,yend),可以计算出m=yend?y0xend?x0和b=y0?m?x0 DAA是基于微分运算的线段生成算法,其主要计算式便是δy=mδx: 若|m|≤1则x方向的变化大于y方向的变化,以x方