一、 实验内容
利用 Bresenham 画线算法和中点画圆算法画一个小房子。小房子包括直线和
圆。
二、 实验设计
1、画线函数设计
采用 Bresenham 画线算法,输入参数为起点坐标和终点坐标。注意,此算法
斜率 k 满足 0<=k<=1,且 x1=0&&k<=1)
for x=x1:x2
tem=[x,y];
line=[line;tem];% 动态矩阵追加方式之一,每次追加一行
if (p>=0)
y=y+1;
p=2*(dy-dx)+p;
else
end
p=p+2*dy;
end
end
end
2、画圆算法 M 文件如下
function circle = MidpointCircle(m,n,r )
x = m;
y = n+r;
d = 1.25 - r;
%setpixel(x,y,1);
%img=zeros(1000);
%img(x,y)=1;
circle=[];
tem=[x,y];
circle=[circle;tem];
while(x +n-m-y<0)
if( d < 0)
d=d+ 2 * x +3-2*m;
x=x+1;
else
end
d = d + 2 * ( x - y ) +5+2*(n-m);
x=x+1;
y=y-1;
%setpixel(x,y,1);
%img(x,y)=1;
tem=[x,y];
circle=[circle;tem];
%img(2*m-x,y)=1;%x=m
tem=[2*m-x,y];
circle=[circle;tem];
%img(m+n-y,m+n-x)=1;%y=-x+m+n
tem=[m+n-y,m+n-x];
circle=[circle;tem];
%img(m-n+y,m+n-x)=1;%x=m
tem=[m-n+y,m+n-x];
circle=[circle;tem];
%img(2*m-x,2*n-y)=1;%关于(m,n)对称
tem=[2*m-x,2*n-y];
circle=[circle;tem];
%img(x,2*n-y)=1;%x=m
tem=[x,2*n-y];
circle=[circle;tem];
%img(m-n+y,n-m+x)=1;%y=-x+m+n
tem=[m-n+y,n-m+x];
circle=[circle;tem];
%img(m+n-y,n-m+x)=1;%x=m
tem=[m+n-y,n-m+x];
circle=[circle;tem];
end
end
3、画半圆的 M 文件如下
function [ partCircle ] = partCircle( m,n,r )
x = m;
y = n+r;
d = 1.25 - r;
%setpixel(x,y,1);
%img=zeros(1000);
%img(x,y)=1;
partCircle=[];
tem=[x,y];
partCircle=[partCircle;tem];
while(x +n-m-y<0)
if( d < 0)
d=d+ 2 * x +3-2*m;
x=x+1;
else
end
d = d + 2 * ( x - y ) +5+2*(n-m);
x=x+1;
y=y-1;
%setpixel(x,y,1);
%img(x,y)=1;
tem=[x,y];
%partCircle=[partCircle;tem];
tem=[2*m-x,y];
partCircle=[partCircle;tem];
%img(m+n-y,m+n-x)=1;%y=-x+m+n
tem=[m+n-y,m+n-x];
partCircle=[partCircle;tem];
%img(m-n+y,m+n-x)=1;%x=m
tem=[m-n+y,m+n-x];
%partCircle=[partCircle;tem];
%img(2*m-x,2*n-y)=1;%关于(m,n)对称
tem=[2*m-x,2*n-y];
partCircle=[partCircle;tem];
%img(x,2*n-y)=1;%x=m
tem=[x,2*n-y];
%partCircle=[partCircle;tem];
%img(m-n+y,n-m+x)=1;%y=-x+m+n
tem=[m-n+y,n-m+x];
%partCircle=[partCircle;tem];
%img(m+n-y,n-m+x)=1;%x=m
tem=[m+n-y,n-m+x];
partCircle=[partCircle;tem];
end
4、画房子的 M 文件如下
img=ones(1000);
% line1=BresenhamLine1(100,500,500,100);
% for i=1:length(line1)
%
% end
line2=BresenhamLine(100,500,500,900);
for i=1:length(line2)
img(line1(i,1),line1(i,2))=0;
img(line2(i,1),line2(i,2))=0;
img(line2(i,1),1000-line2(i,2))=0;
end
circle1=MidpointCircle(300,500,70);
for i=1:length(circle1)
img(circle1(i,1),circle1(i,2))=0;
end
partcircle=partCircle(650,350,50);
for i=1:length(partcircle)
img(partcircle(i,1),partcircle(i,2))=0;
end
for i=110:890
img(490,i)=0;
end
for i=490:900
img(i,110)=0;
end
for i=490:900
img(i,890)=0;
end
for i=110:890
img(900,i)=0;
end
for i=700:900
img(i,700)=0;
end
for i=700:900
img(i,800)=0;
end
for i=700:800
img(700,i)=0;
end
for i=300:400
img(725,i)=0;
end
for i=650:725
img(i,300)=0;
end
for i=650:725
img(i,400)=0;
end
figure;imshow(img)
四、实验结果