您的位置:首页 > 编程语言 > MATLAB

光栅图形学之直线段扫描算法(中点画线法之matlab代码)

2010-03-29 22:37 513 查看
说明:本文章系作者学习资料整理,不完善的地方请大家指正,谢谢!

function midpointline(x0,x1,y0,y1)

% MIDPOINTLINE函数利用中点画线法进行直线段的扫描。
% MIDPOINTLINE函数根据给定的两个整数点坐标(X0,Y0)和
% (X1,Y1),确定在这两点之间应选取的整数坐标点。
% 输出的是一个画出了各整数点的图像。DY=Y1-Y0;DX=X1-X0;
% 直线方程Y=KX+B,可以化为F(X,Y)=DX*Y-DY*X-B*DX,我们根据%

点和直线的关系,y的系数必须大于0,可知当F(X,Y)=0,点在%

直线上;F(X,Y)>0,点在直线上方;F(X,Y)<0,点在直线下方
% ;我们令D0=F(X,Y),通过判断D0的正负,从而判断点和直线的

% 关系。若中点在直线上方,那么就选中点下方的整数点,否则

% 选上方的整数点。
% 对于直线段的扫描算法中点画线法可以分四种情况讨论,当直

% 线斜率0<k<=1时,沿着x轴,x每次增加步长1,y的值根据判断

% ,是否加1;当-1<k<=0沿着x轴,x每次增加步长1,y的值
% 根据判断,是否减1.当斜率k>1和k<=-1时,同理;
% D1和D2是在D0为正或负情况下的增量。
%我在次讨论的前提是x1>x0

dx = x1-x0 , dy = y1-y0;
x=x0 , y=y0;
axis([0 15 0 15 ]);
set(gca,'xtick',0:1:15);
set(gca,'ytick',0:1:15);
grid on;hold on;
plot(x,y,'o');
%第一种情况
if(dy/dx > 0& dy/dx <= 1)
d0=dx-2*dy,d1 = -2*dy,d2 = 2*(dx - dy);
while (x<x1)
if(d0 >=0)
x=x+1;d0 = d0+d1;
elseif(d0 < 0)
x=x+1;y=y+1;d0=d0+d2;
end
hold on;
plot(x,y,'o');
end
end

%第二种情况

if dy/dx >= -1&dy/dx <= 0

d0 = -dx - 2*dy, d1 = -2*(dx+dy), d2 = -2*dy;

while(x < x1)

if(d0 > 0)

x=x+1; y=y-1; d0 =d0+d1;

elseif(d0 <= 0)
x=x+1; d0 =d0+d2;
end
hold on;
plot(x,y,'o');
end
end
%第三种情况
if(dy/dx > 1)
d0 = 2*dx - dy,d1 = 2*(dx - dy), d2=2*dx;
while (y < y1)
if(d0 >0)

x=x+1;y=y+1;d0 =d0+d1;
elseif(d0 <= 0)
y=y+1; d0 =d0+d2;
end
hold on;
plot(x,y,'o');
end
end
%第四种情况
if (dy/dx < -1)
d0 = -2*dx - dy,d1 = -2*dx, d2 = -2*(dx+dy);
while (y > y1)
if(d0 > 0)
y=y-1;d0 =d0+d1;
elseif(d0 <= 0)
y=y-1; x=x+1; d0 =d0+d2;
end
hold on;
plot(x,y,'o');
end
end
小结:
(1)在matlab中不用声明数据类型,matlab默认的数据类型是双精度的double类型。
(2)在matlab中不存在++,+=等数学运算符,并且不存在大写字母。
(3)在matlab中if-end,while-end,for-end,switch-end等

控制流语句需要一一严格对应。
(4)在matlab中以%开头的行,称为注释行。
(5)在matlab中生成单元网格的命令可以用:
axis([0 15 0 15 ]); %建立直角坐标系,并设定最值
set(gca,'xtick',0:1:15); %设定x轴的水平间隔
set(gca,'ytick',0:1:15); %设定y轴的水平间隔
grid on; %将坐标轴单元格网化
在命令set中,参数gca表示取当前坐标轴,即由命令axis设定的。xtick表示以指定的间隔划分坐标轴
(6)hold on命令保证图像不重绘,即在已经画过的图像上继续画。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: