matlab练习程序(Bresenham画线)

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

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

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

算法原理如下:

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

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

更细节的原理参考这里

随机画出的一些线:

matlab练习程序(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

 

你可能感兴趣的:(matlab)