光栅图形学之直线段扫描算法(中点画线法之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命令保证图像不重绘,即在已经画过的图像上继续画。
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命令保证图像不重绘,即在已经画过的图像上继续画。
相关文章推荐
- 光栅图形学之直线段扫描算法(中点画线法之代码)
- 光栅图形学之直线段扫描算法(中点画线法)
- 光栅图形学之直线段扫描算法(中点画线法之java代码)
- Matlab直线拟合的原理和代码
- 计算机图形学——光栅图形学直线算法简介
- Matlab中点到直线距离计算
- [图形学]光栅直线算法(转)
- 「图形学」直线扫描——Bresenham算法改进了中点Bresenham算法?
- HTML5 Canvas 提高班(一) —— 光栅图形学(1)中点画圆算法
- 图形学(2)光栅图形学的直线绘制(上)
- 计算机图形学 学习笔记(一):概述,直线扫描转换算法:DDA,中点画线算法,Bresenham算法
- 图形学(3)光栅图形学的直线绘制(下)
- HTML5 Canvas 提高班(二) —— 光栅图形学(2)Bresenham算法画直线
- 中点Bresenham算法光栅化画直线(个人总结精简版)代码超短!速度极快!
- 中点Bresenham算法光栅化画直线(个人总结精简版)代码超短!速度极快!
- 《图形学》实验四:中点Bresenham算法画直线
- [图形学]光栅直线算法
- [计算机图形学经典算法] 直线段和圆弧在屏幕上的绘制 (附matlab代码)
- 基于MATLAB中fft2函数的二维图像数据的频谱生成代码
- matlab 求点到任意直线的投影点坐标