• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

matlab练习程序(Bresenham画线)

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Delphi用SocketIP/UDP局域网广播发布时间:2022-07-18
下一篇:
Delphi的绘图功能[1]-TCanvas的类成员发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap