• 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
  • 相关阅读:
    济南空中课堂视频下载辅助脚本
    npm 修改仓库源
    Java后端实现登陆的方式
    java 新词汇
    数据库系统,设计、实现与管理(基础篇)阅读笔记
    java 面试01
    js rem 适配多端
    了解Java
    linux 查看内存使用情况
    linux 日志查看
  • 原文地址:https://www.cnblogs.com/tiandsp/p/3960271.html
Copyright © 2020-2023  润新知