matlab练习程序(Bresenham画线)
Bresenham画线算图形学中最基础的知识了,可惜我并没有选修过图形学,所有还是有必要熟悉一下。
上一篇用到的画线函数应该算是数值微分法,也是我最常用的一种方法,不过这种方法似乎并不是很好。
这里的画线方法比上一种方法好。
算法原理如下:
过各行各列象素中心构造一组虚拟网格线。按直线从起点到终点的顺序计算直线与各垂直网格线的交点,然后确定该列象素中与此交点最近的象素。
该算法的巧妙之处在于采用增量计算,使得对于每一列,只要检查一个误差项的符号,就可以确定该列的所求象素。
更细节的原理参考这里。
随机画出的一些线:

matlab代码如下:
main.m
clear all;close all;clc; h=;
w=;
img=zeros(h,w); for i=:
x1=round(rand()*(w-))+;
y1=round(rand()*(h-))+;
x2=round(rand()*(w-))+;
y2=round(rand()*(h-))+; img=BresenhamDraw(img,x1,y1,x2,y2); figure();
imshow(img,[]) end
BresenhamDraw.m
function img=BresenhamDraw(img,x1,y1,x2,y2)
if x1~=x2
k=(y2-y1)/(x2-x1);
flag=; %斜率判断标记位
if abs(k)> %如果斜率大于1,则把x和y方向置换
flag=;
k=/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=;
for i=mi:ma
if flag==
img(s,i)=;
else
img(i,s)=;
end
d=d+k;
%自变量i每加1,根据d是否超过一个像素来确定因变量s增加或减少
if d>=
d=d-;
s=s+;
elseif d<=-
d=d+;
s=s-;
end
end
end end
Swap.m
function [y x]=Swap(x1,y1)
x=y1;
y=x1;
end
matlab练习程序(Bresenham画线)的更多相关文章
- Bresenham画线算法
[Bresenham画线算法] Bresenham是一种光栅化算法.不仅可以用于画线,也可以用用画圆及其它曲线. 通过lower与upper的差,可以知道哪一个点更接近线段: 参考:<计算机图形 ...
- 计算机图形学DDA画线法+中点画线法+Bresenham画线法
#include <cstdio> #include <cstring> #include <conio.h> #include <graphics.h> ...
- VC++ Bresenham画线实例
附带百度链接:http://wenku.baidu.com/link?url=GP4uDkoyulgNxQy5djBBi-JB5BCrMWW6svMDhSfmzi_Qi1s6DhwJiCPHdMI2o ...
- 两种画线算法(DDA&Bersenham)
DDA(digital differential analyzer) 由直线的斜截式方程引入 对于正斜率的线段,如果斜率<=1,则以单位x间隔(δx=1)取样,并逐个计算每一个y值 Yk+1 = ...
- MATLAB plot画线的颜色设定
plot中画线的颜色通常是八种: 标记符 颜色r 红g 绿b 蓝c 蓝绿m 紫红y 黄 ...
- MFC消息映射机制以及画线功能实现
---此仅供用于学习交流,切勿用于商业用途,转载请注明http://www.cnblogs.com/mxbs/p/6213404.html. 利用VS2010创建一个单文档标准MFC工程,工程名为Dr ...
- WPF画线问题,几千条以后就有明显的延迟了。
我现在是这么画的,class A { private GeometryGroup _lines; private Path _path; public A() { _path.Data = ...
- VC动态轨迹画线
分类: 2.4 线程/图形学2010-04-30 22:14 1878人阅读 评论(0) 收藏 举报 文档null 这是一个绘制直线的简单绘图程序,能过实现动态轨迹画线,在拖动时产生临时线来表示可能画 ...
- 画线函数Glib_Line算法的研究
在这里首先先简单把我对函数的功能的理解阐述一下,方便后面的分析:Glib_Line函数实现的功能是通过参数给定(x1,y1,x2,y2,color),来确定起点(x1,y1)和终点(x2,y2)两 ...
随机推荐
- alter table添加表约束
翻阅了一下网上关于alter table添加表约束的资料,学习下,然后供自己以后使用. 仅仅供自己使用... 总结alter table ### add constraint ## 使用方法 添加表约 ...
- 03-树3 Tree Traversals Again (25 分)
An inorder binary tree traversal can be implemented in a non-recursive way with a stack. For example ...
- [转] 使用 JavaScript 创建并下载文件
[From] https://gaohaoyang.github.io/2016/11/22/js-create-file-and-download/ 本文将介绍如何使用 JavaScript 创建文 ...
- 分享个高精度IP定位
https://www.opengps.cn/Data/IP/LocHighAcc.aspx
- redis cluster 集群拓展
redis cluster 集群拓展 准备工作 举例:添加2个节点(1主7006节点,1从7007节点) 在/home/redis-cluster下生成conf和data目标,并生成配置信息 `; d ...
- PIE SDK算法的自定义扩展
1.算法功能简介 算法的自定义扩展允许用户自主开发新的算法.自定义的算法必须实现PIE.SystemAlgo.BaseSystemAlgo基础类,这样才能被PIE的算法管理器调用起来. 2.算法功能实 ...
- Vue添加新的响应式属性
vm.userProfile = Object.assign({}, vm.userProfile, { age: , favoriteColor: 'Vue Green' })
- mysql记录数据库中重复的字段的数据
SELECT SUM(co)FROM ( SELECT telephone, count(telephone) AS co ...
- Java基础20-构造代码块
特点: 对象一建立就运行了,而且优先于构造函数执行 作用:给对象初始化的 构造代码块和构造方法的区别: 构造方法是对应的对象进行初始化 构造代码块是给所有的对象进行统一的初始化 public clas ...
- (转)CentOS/Linux 解决 SSH 连接慢
CentOS/Linux 解决 SSH 连接慢 原文:http://blog.csdn.net/doiido/article/details/43793391 现在连接linux服务器一般都是使用SS ...