一:直线的中点算法:
算法函数:DDA2.m
注意:在粘贴代码到matlab的时候,需要点击“保存”,将函数保存为.m文件(到matlab函数库),这样才能直接调用函数。
算法输入为直线的初始点坐标、结束点坐标和点的颜色
function DDA2(x1,y1,x2,y2,color) %DDA算法
dx=(x2-x1);
dy=(y2-y1);
step=max(abs(dx),abs(dy));
deltax=dx/step;
deltay=dy/step;
x=x1;
y=y1;
hold on
% 初始化一个电影矩阵
M = moviein(step);
for i=1:step
scatter(round(x),round(y),'.',color) %绘出当前点
x=x+deltax; %更新x
y=y+deltay; %更新y
axis equal;%将横轴纵轴的定标系数设成相同值
% 调用getframe函数生成每个帧
M(i) = getframe;
end
plot([x1,x2],[y1,y2]) %直接绘制原线以对比
ax1 = gca;
ax1.XAxisLocation = 'origin'; %将X坐标轴放在图形的中间
ax1.YAxisLocation = 'origin'; %将Y坐标轴放在图形的中间
grid minor %添加网格
hold off
代码段解释:因为我们老师要求:实验使用动画的形式展示算法的原理,所以在代码中使用了电影矩阵实现,核心代码还是算法的实现,如果需要不含动画的代码,可以参考:
DDA.m
function DDA(x1,y1,x2,y2,color) %DDA算法
dx=(x2-x1);
dy=(y2-y1);
step=max(abs(dx),abs(dy));
deltax=dx/step;
deltay=dy/step;
x=x1;
y=y1;
hold on
for m=1:step
scatter(round(x),round(y),'.',color) %绘出当前点
a(round(x),round(y))=2;
x=x+deltax; %更新x
y=y+deltay; %更新y
end
comet([x1,x2],[y1,y2],0.5) %直接绘制原线以对比
ax1 = gca;
ax1.XAxisLocation = 'origin';
ax1.YAxisLocation = 'origin';
grid minor %添加网格
hold off
end
直线的中点算法主函数:
(可以直接将下面的主函数代码粘贴到命令行窗口。直接运行)
(也可以保存为.m文件,这样每次运行的时候就不用再打一次代码了)我保存为了DDA2_main.m
clc
clear;
DDA2(0,0,100,75,'r') %勾三股四弦五
DDA2(0,0,100,100,'k')%直线是正方形的对角线
DDA2(-10,-9,90,100,'b')%直线起始位置不在源点
注:如果使用的是不含动画的函数DDA,需要将主函数中的DDA2改成DDA
代码实现结果:
二:直线的bresenham算法:
算法函数:
(与DDA.m算法同理,需要将函数保存至matlab函数库中)
function Bresenham(x1,y1,x2,y2,color) %Bresnham算法
dx=x2-x1;
dy=y2-y1;
k=dy/dx;
e=-0.5;
x=x1;
y=y1;
hold on
scatter(x,y,'.',color)
% 初始化一个电影矩阵
step=dx;
M = moviein(step);
for i=1:dx
scatter(x,y,'.',color)
x=x+1;
e=e+k;
if e>=0
y=y+1;
e=e-1;
end
axis equal;%将横轴纵轴的定标系数设成相同值
% 调用getframe函数生成每个帧
M(i) = getframe;
end
plot([x1,x2],[y1,y2]) %绘制原线以对比
ax1 = gca;
ax1.XAxisLocation = 'origin'; %将X坐标轴放在图形的中间
ax1.YAxisLocation = 'origin'; %将Y坐标轴放在图形的中间
grid on %添加网格
hold off
grid minor
主函数:
clc
clear;
Bresenham(0,0,100,75,'r') %勾三股四弦五
Bresenham(0,0,100,100,'k')%直线是正方形的对角线
Bresenham(-9,-10,100,80,'b')%直线起始位置不在源点
注意:因为bresenham,需要分成两种情况也就是斜率小于1和斜率大于1,但是上述的函数只实现了斜率小于1的情况(这个也是我实验验收的时候,我才发现的,但是因为我设置的直线的起始点和结束点特殊,所以老师没有发现,嘻嘻,我也懒得改了,如果要改的话也很简单,使用相同的算法思想,只是将x和y互换位置就OK)
结果展示:
三:改良的bresnham算法
算法函数:
function InterBresenham(x1,y1,x2,y2,color) %改良Bresnham算法
dx=x2-x1;
dy=y2-y1;
e=-dx;
x=x1;
y=y1;
hold on
scatter(x,y,'.',color)
for i=0:dx
x=x+1;
e=e+2*dy;
if e>=0
y=y+1;
e=e-2*dx;
end
scatter(x,y,'.',color)
end
plot([x1,x2],[y1,y2]) %绘制原线以对比
grid minor
hold off
主函数:
clc
clear;
InterBresenham(0,0,100,75,'r') %勾三股四弦五
InterBresenham(0,0,100,100,'k')%直线是正方形的对角线
InterBresenham(-9,-10,100,80,'b')%直线起始位置不在源点