line_circle.m
%%本程序用于使用圆形aperture进行划线
function d=linc(addrbef,addrnow,r,d,dip)
x0=addrbef(1);
y0=addrbef(2);
x1=addrnow(1);
y1=addrnow(2);
detax=x1-x0+1;
detay=y1-y0+1;
[angle,distens]=cart2pol(detax,detay);
angle=angle+pi/2;
a=zeros(5,2);
n=4;
a(1,1)=x0+r*cos(angle);
a(1,2)=y0+r*sin(angle);
a(2,1)=x1+r*cos(angle);
a(2,2)=y1+r*sin(angle);
a(4,1)=x0-r*cos(angle);
a(4,2)=y0-r*sin(angle);
a(3,1)=x1-r*cos(angle);
a(3,2)=y1-r*sin(angle);
a(5,1)=x0+r*cos(angle);
a(5,2)=y0+r*sin(angle);
a=round(a);
[max1,maxid1]=max(a(:,1));
[max2,maxid2]=min(a(:,1));
lengh=max1-max2+1;
ecord=zeros(n,lengh)-1;
for i=1:n
lengh1=abs(a(i+1,1)-a(i,1))+1;
ecord(i,linspace(a(i,1),a(i+1,1),lengh1)-max2+1)=round(linspace(a(i,2),a(i+1,2),lengh1));
end
for i=1:lengh
k=0;
for j=1:n
if ecord(j,i)==-1
k=k+1;
else
if k==0
else
ecord(j-k,i)=ecord(j,i);
ecord(j,i)=-1;
end
end
end
end
if dip==1
for i=1:lengh
k=1;
for j=1:n-1
if (ecord(j,i)>0)&&(ecord(j+1,i)>0)
if (k==1)
if ecord(j,i)~=ecord(j+1,i)
k=-k;
lengh1=abs(ecord(j+1,i)-ecord(j,i))+1;
d(round(linspace(ecord(j,i),ecord(j+1,i),lengh1)),max2+i-1)=1;
else
end
else
k=-k;
end
end
end
end
else
for i=1:lengh
k=1;
for j=1:n-1
if (ecord(j,i)>0)&&(ecord(j+1,i)>0)
if (k==1)
if ecord(j,i)~=ecord(j+1,i)
k=-k;
lengh1=abs(ecord(j+1,i)-ecord(j,i))+1;
d(round(linspace(ecord(j,i),ecord(j+1,i),lengh1)),max2+i-1)=0;
else
end
else
k=-k;
end
end
end
end
end
arc.m
clear
clc
x0=300;
y0=200;
r1=100;
d=20;
r2=r1+d;
lengh1=r1*2-1;
lengh2=r2*2-1;
ecord=zeros(4,lengh2);
max2=x0-r2+1;
for i=1:lengh2
ecord(1,i)=round(y0+(r2^2-(i-r2)^2)^0.5);
ecord(4,i)=round(y0-(r2^2-(i-r2)^2)^0.5);
end
for i=1:lengh1
ecord(2,d+i)=round(y0+(r1^2-(i-r1)^2)^0.5);
ecord(3,d+i)=round(y0-(r1^2-(i-r1)^2)^0.5);
end
for i=1:lengh2
k=0;
for j=1:4
if ecord(j,i)==0
k=k+1;
else
if k==0
else
ecord(j-k,i)=ecord(j,i);
ecord(j,i)=0;
end
end
end
end
for i=1:lengh2
k=1;
for j=1:3
if (ecord(j,i)~=0)&&(ecord(j+1,i)~=0)
if (k==1)
if ecord(j,i)~=ecord(j+1,i)
k=-k;
lengh1=abs(ecord(j+1,i)-ecord(j,i))+1;
d(round(linspace(ecord(j,i),ecord(j+1,i),lengh1)),max2+i-1)=1;
else
end
else
k=-k;
end
end
end
end
%%image(ecord)
arc.avs
clear
clc
x1=200;
y1=200;
x2=400;
y2=200;
I=100;
J=200;
x0=round(x1+I);
y0=round(y1+J);
r=round(I^2+J^2)^0.5;
dr=20;
r1=round(r-dr/2);
r2=round(r1+dr);
[angle1,r]=cart2pol(x1-x0,y1-y0);
[angle2,r]=cart2pol(x2-x0,y2-y0);
k=-1;%% k代表旋转方向,若k为1,代表顺时针,否则否之。
edge=zeros(4,1);
if angle1<0
angle1=angle1+2*pi;
end
if angle2<0
angle2=angle2+2*pi;
end
if angle1>angle2
k=k*(-1);
temp=angle1;
angle1=angle2;
angle2=temp;
clear temp
end
i=1;
%% k=1表示顺时针动作
if k==1
if angle2<=pi
edge(i)=angle1;
edge(i+1)=angle2;
else
if angle1<=pi;
edge(i)=angle1;
edge(i+1)=pi;
edge(i+2)=angel2;
else
edge(i)=angle1;
edge(i+1)=angle2;
end
end
else
if angle2<=pi;
edge(1)=angle1;
edge(2)=0;
edge(3)=pi;
edge(4)=angle2;
else
if angle1<pi
edge(1)=angle1;
edge(2)=0;
enge3=angle2;
else
edge(i)=angle1;
edge(i+1)=pi;
edge(i+2)=0;
edge(i+3)=angle2;
end
end
end
%% 以上程序确定了圆环的各条边线的起止点;
temp(:,1)=x0+r1*cos(edge);
temp(:,2)=x0+r2*cos(edge);
[max1,maid1]=max(temp);
[min1,miid1]=min(temp);
max1=max(max1);
max1=round(max1(1));
min1=round(min1);
min1=min(min1);
lenghmax=max1-min1;
temp3=linspace(round(x0+cos(angle1)*r1),round(x0+cos(angle1)*r2),abs(round(cos(angle1)*r1-cos(angle1)*r2)))
temp4=linspace(round(x0+cos(angle2)*r1),round(x0+cos(angle2)*r2),abs(round(cos(angle2)*r1-cos(angle2)*r2)))
temp1=linspace(round(y0+sin(angle1)*r1),round(y0+sin(angle1)*r2),abs(round(cos(angle1)*r1-cos(angle1)*r2)));
temp2=linspace(round(y0+sin(angle2)*r1),round(y0+sin(angle2)*r2),abs(round(cos(angle2)*r1-cos(angle2)*r2)));
ecord=zeros(10,lenghmax+1);%%边界值
if k==1
if angle2<=pi
for i=round(x0+r2*cos(angle1):x0+r2*cos(angle2))
ecord(1,i-min1+1)=round(y0+(r2^2-(i-x0)^2)^0.5);
end
ecord(2,temp3)=temp1;
ecord(2,temp4)=temp2;
for i=round(x0+r1*cos(angle1):x0+r1*cos(angle2))
ecord(4,i-min1+1)=round(y0+(r1^2-(i-x0)^2)^0.5);
end
else
if angle1<=pi;
for i=round(x0+r2*cos(pi):x0+r2*cos(angle1))
ecord(1,i-min1+1)=round(y0+(r2^2-(i-x0)^2)^0.5);
end
for i=round(x0+r2*cos(pi):x0+r2*cos(angle2))
ecord(9,i-min1+1)=round(y0-(r2^2-(i-x0)^2)^0.5);
end
for i=round(x0+r1*cos(pi):x0+r1*cos(angle1))
ecord(2,i-min1+1)=round(y0+(r1^2-(i-x0)^2)^0.5);
end
for i=round(x0+r1*cos(pi):x0+r1*cos(angle2))
ecord(8,i-min1+1)=round(y0-(r1^2-(i-x0)^2)^0.5);
end
ecord(6,temp3)=temp1;
ecord(7,temp4)=temp2;
else
for i=round(x0+r2*cos(angle1):x0+r2*cos(angle2))
ecord(9,i-min1+1)=round(y0-(r2^2-(i-x0)^2)^0.5);
end
for i=round(x0+r1*cos(angle1):x0+r1*cos(angle2))
ecord(8,i-min1+1)=round(y0-(r1^2-(i-x0)^2)^0.5);
end
ecord(6,temp3)=temp1;
ecord(7,temp4)=temp2;
end
end
else
if angle2<=pi;
for i=round(x0+r2*cos(pi):x0+r2*cos(angle1))
ecord(1,i-min1+1)=round(y0+(r2^2-(i-x0)^2)^0.5);
end
for i=round(x0+r2*cos(pi):x0+r2*cos(0))
ecord(6,i-min1+1)=round(y0-(r2^2-(i-x0)^2)^0.5);
end
for i=round(x0+r2*cos(0):x0+r2*cos(angle2))
ecord(2,i-min1+1)=round(y0+(r2^2-(i-x0)^2)^0.5);
end
for i=round(x0+r1*cos(angle1):x0+r1*cos(0))
ecord(3,i-min1+1)=round(y0+(r1^2-(i-x0)^2)^0.5);
end
for i=round(x0+r1*cos(pi):x0+r1*cos(0))
ecord(7,i-min1+1)=round(y0-(r1^2-(i-x0)^2)^0.5);
end
for i=round(x0+r1*cos(pi):x0+r1*cos(angle2))
ecord(4,i-min1+1)=round(y0+(r1^2-(i-x0)^2)^0.5);
end
ecord(8,temp3)=temp1;
ecord(9,temp4)=temp2;
else
if angle1<pi
for i=round(x0+r2*cos(angle1):x0+r2*cos(0))
ecord(1,i-min1+1)=round(y0+(r2^2-(i-x0)^2)^0.5);
end
for i=round(x0+r2*cos(0):x0+r2*cos(angle2))
ecord(5,i-min1+1)=round(y0-(r2^2-(i-x0)^2)^0.5);
end
for i=round(x0+r1*cos(angle1):x0+r1*cos(0))
ecord(2,i-min1+1)=round(y0+(r1^2-(i-x0)^2)^0.5);
end
for i=round(x0+r1*cos(0):x0+r1*cos(angle2))
ecord(4,i-min1+1)=round(y0-(r1^2-(i-x0)^2)^0.5);
end
else
for i=round(x0+r2*cos(pi):x0+r2*cos(angle1))
ecord(9,i-min1+1)=round(y0-(r2^2-(i-x0)^2)^0.5);
end
for i=round(x0+r2*cos(pi):x0+r2*cos(0))
ecord(1,i-min1+1)=round(y0+(r2^2-(i-x0)^2)^0.5);
end
for i=round(x0+r2*cos(angle2):x0+r2*cos(0))
ecord(8,i-min1+1)=round(y0-(r2^2-(i-x0)^2)^0.5);
end
for i=round(x0+r1*cos(pi):x0+r1*cos(angle1))
ecord(7,i-min1+1)=round(y0-(r1^2-(i-x0)^2)^0.5);
end
for i=round(x0+r1*cos(pi):x0+r1*cos(0))
ecord(2,i-min1+1)=round(y0+(r1^2-(i-x0)^2)^0.5);
end
for i=round(x0+r1*cos(angle2):x0+r1*cos(0))
ecord(6,i-min1+1)=round(y0-(r1^2-(i-x0)^2)^0.5);
end
end
end
end
for i=1:lenghmax+1
k=0;
for j=1:10
if ecord(j,i)==0
k=k+1;
else
if k==0
else
ecord(j-k,i)=ecord(j,i);
ecord(j,i)=0;
end
end
end
end
minx=min1;
for i=1:lenghmax
k=1;
for j=1:10
if (ecord(j,i)~=0)&&(ecord(j+1,i)~=0)
if (k==1)
if ecord(j,i)~=ecord(j+1,i)
k=-k;
lengh1=abs(ecord(j+1,i)-ecord(j,i))+1;
d(round(linspace(ecord(j,i),ecord(j+1,i),lengh1)),minx+i)=1;
else
end
else
k=-k;
end
end
end
end
image(d*200)
%%image(ecord)
arc1.m
clear
clc
x1=200;
y1=200;
x2=400;
y2=200;
I=100;
J=200;
x0=round(x1+I);
y0=round(y1+J);
r=round(I^2+J^2)^0.5;
dr=20;
r1=round(r-dr/2);
r2=round(r1+dr);
[angle1,r]=cart2pol(x1-x0,y1-y0);
[angle2,r]=cart2pol(x2-x0,y2-y0);
d=false(2*r2-1,2*r-1);
k=-1;%% k代表旋转方向,若k为1,代表顺时针,否则否之。
edge=zeros(4,1);
if angle1<0
angle1=angle1+2*pi;
end
if angle2<0
angle2=angle2+2*pi;
end
if angle1>angle2
k=k*(-1);
temp=angle1;
angle1=angle2;
angle2=temp;
clear temp
end
i=1;
%% k=1表示顺时针动作
if k==1
if angle2<=pi
edge(i)=angle1;
edge(i+1)=angle2;
else
if angle1<=pi;
edge(i)=angle1;
edge(i+1)=pi;
edge(i+2)=angel2;
else
edge(i)=angle1;
edge(i+1)=angle2;
end
end
else
if angle2<=pi;
edge(1)=angle1;
edge(2)=0;
edge(3)=pi;
edge(4)=angle2;
else
if angle1<pi
edge(1)=angle1;
edge(2)=0;
enge3=angle2;
else
edge(i)=angle1;
edge(i+1)=pi;
edge(i+2)=0;
edge(i+3)=angle2;
end
end
end
%% 以上程序确定了圆环的各条边线的起止点;
temp(:,1)=x0+r1*cos(edge);
temp(:,2)=x0+r2*cos(edge);
[max1,maid1]=max(temp);
[min1,miid1]=min(temp);
max1=max(max1);
max1=round(max1(1));
min1=round(min1);
min1=min(min1);
lenghmax=max1-min1;
temp3=linspace(round(x0+cos(angle1)*r1),round(x0+cos(angle1)*r2),abs(round(cos(angle1)*r1-cos(angle1)*r2))+1);
temp4=linspace(round(x0+cos(angle2)*r1),round(x0+cos(angle2)*r2),abs(round(cos(angle2)*r1-cos(angle2)*r2))+1);
temp1=linspace(round(y0+sin(angle1)*r1),round(y0+sin(angle1)*r2),abs(round(cos(angle1)*r1-cos(angle1)*r2))+1);
temp2=linspace(round(y0+sin(angle2)*r1),round(y0+sin(angle2)*r2),abs(round(cos(angle2)*r1-cos(angle2)*r2))+1);
ecord=zeros(10,lenghmax+1);%%边界值
if k==1
if angle2<=pi
for i=round(x0+r2*cos(angle1):x0+r2*cos(angle2))
ecord(1,i-min1+1)=round(y0+(r2^2-(i-x0)^2)^0.5);
end
ecord(2,temp3-min1+1)=temp1;
ecord(2,temp4-min1+1)=temp2;
for i=round(x0+r1*cos(angle1):x0+r1*cos(angle2))
ecord(4,i-min1+1)=round(y0+(r1^2-(i-x0)^2)^0.5);
end
else
if angle1<=pi;
for i=round(x0+r2*cos(pi):x0+r2*cos(angle1))
ecord(1,i-min1+1)=round(y0+(r2^2-(i-x0)^2)^0.5);
end
for i=round(x0+r2*cos(pi):x0+r2*cos(angle2))
ecord(9,i-min1+1)=round(y0-(r2^2-(i-x0)^2)^0.5);
end
for i=round(x0+r1*cos(pi):x0+r1*cos(angle1))
ecord(2,i-min1+1)=round(y0+(r1^2-(i-x0)^2)^0.5);
end
for i=round(x0+r1*cos(pi):x0+r1*cos(angle2))
ecord(8,i-min1+1)=round(y0-(r1^2-(i-x0)^2)^0.5);
end
ecord(6,temp3-min1+1)=temp1;
ecord(7,temp4-min1+1)=temp2;
else
for i=round(x0+r2*cos(angle1):x0+r2*cos(angle2))
ecord(9,i-min1+1)=round(y0-(r2^2-(i-x0)^2)^0.5);
end
for i=round(x0+r1*cos(angle1):x0+r1*cos(angle2))
ecord(8,i-min1+1)=round(y0-(r1^2-(i-x0)^2)^0.5);
end
ecord(6,temp3-min1+1)=temp1;
ecord(7,temp4-min1+1)=temp2;
end
end
else
if angle2<=pi;
for i=round(x0+r2*cos(pi):x0+r2*cos(angle1))
ecord(1,i-min1+1)=round(y0+(r2^2-(i-x0)^2)^0.5);
end
for i=round(x0+r2*cos(pi):x0+r2*cos(0))
ecord(7,i-min1+1)=round(y0-(r2^2-(i-x0)^2)^0.5);
end
for i=round(x0+r2*cos(0):x0+r2*cos(angle2))
ecord(2,i-min1+1)=round(y0+(r2^2-(i-x0)^2)^0.5);
end
for i=round(x0+r1*cos(angle1):x0+r1*cos(0))
ecord(3,i-min1+1)=round(y0+(r1^2-(i-x0)^2)^0.5);
end
for i=round(x0+r1*cos(pi):x0+r1*cos(0))
ecord(8,i-min1+1)=round(y0-(r1^2-(i-x0)^2)^0.5);
end
for i=round(x0+r1*cos(pi):x0+r1*cos(angle2))
ecord(4,i-min1+1)=round(y0+(r1^2-(i-x0)^2)^0.5);
end
ecord(5,temp3-min1+1)=temp1;
ecord(6,temp4-min1+1)=temp2;
else
if angle1<pi
for i=round(x0+r2*cos(angle1):x0+r2*cos(0))
ecord(1,i-min1+1)=round(y0+(r2^2-(i-x0)^2)^0.5);
end
for i=round(x0+r2*cos(0):x0+r2*cos(angle2))
ecord(6,i-min1+1)=round(y0-(r2^2-(i-x0)^2)^0.5);
end
for i=round(x0+r1*cos(angle1):x0+r1*cos(0))
ecord(2,i-min1+1)=round(y0+(r1^2-(i-x0)^2)^0.5);
end
for i=round(x0+r1*cos(0):x0+r1*cos(angle2))
ecord(5,i-min1+1)=round(y0-(r1^2-(i-x0)^2)^0.5);
end
ecord(3,temp3-min1+1)=temp1;
ecord(4,temp4-min1+1)=temp2;
else
for i=round(x0+r2*cos(pi):x0+r2*cos(angle1))
ecord(9,i-min1+1)=round(y0-(r2^2-(i-x0)^2)^0.5);
end
for i=round(x0+r2*cos(pi):x0+r2*cos(0))
ecord(1,i-min1+1)=round(y0+(r2^2-(i-x0)^2)^0.5);
end
for i=round(x0+r2*cos(angle2):x0+r2*cos(0))
ecord(8,i-min1+1)=round(y0-(r2^2-(i-x0)^2)^0.5);
end
for i=round(x0+r1*cos(pi):x0+r1*cos(angle1))
ecord(7,i-min1+1)=round(y0-(r1^2-(i-x0)^2)^0.5);
end
for i=round(x0+r1*cos(pi):x0+r1*cos(0))
ecord(2,i-min1+1)=round(y0+(r1^2-(i-x0)^2)^0.5);
end
for i=round(x0+r1*cos(angle2):x0+r1*cos(0))
ecord(6,i-min1+1)=round(y0-(r1^2-(i-x0)^2)^0.5);
end
ecord(4,temp3-min1+1)=temp1;
ecord(5,temp4-min1+1)=temp2;
end
end
end
for i=1:lenghmax+1
k=0;
for j=1:10
if ecord(j,i)==0
k=k+1;
else
if k==0
else
ecord(j-k,i)=ecord(j,i);
ecord(j,i)=0;
end
end
end
end
minx=min1;
for i=1:lenghmax
k=1;
for j=1:10
if (ecord(j,i)~=0)&&(ecord(j+1,i)~=0)
if (k==1)
if ecord(j,i)~=ecord(j+1,i)
k=-k;
lengh1=abs(ecord(j+1,i)-ecord(j,i))+1;
d(round(linspace(ecord(j,i),ecord(j+1,i),lengh1)),minx+i)=1;
else
end
else
k=-k;
end
end
end
end
linec.m
%%本程序用于使用圆形aperture进行划线
function d=linc(addrbef,addrnow,r,d,dip)
x0=addrbef(1);
y0=addrbef(2);
x1=addrnow(1);
y1=addrnow(2);
detax=x1-x0+1;
detay=y1-y0+1;
[angle,distens]=cart2pol(detax,detay);
angle=angle+pi/2;
a=zeros(5,2);
n=4;
a(1,1)=x0+r*cos(angle);
a(1,2)=y0+r*sin(angle);
a(2,1)=x1+r*cos(angle);
a(2,2)=y1+r*sin(angle);
a(4,1)=x0-r*cos(angle);
a(4,2)=y0-r*sin(angle);
a(3,1)=x1-r*cos(angle);
a(3,2)=y1-r*sin(angle);
a(5,1)=x0+r*cos(angle);
a(5,2)=y0+r*sin(angle);
a=round(a);
[max1,maxid1]=max(a(:,1));
[max2,maxid2]=min(a(:,1));
lengh=max1-max2+1;
ecord=zeros(n,lengh)-1;
for i=1:n
lengh1=abs(a(i+1,1)-a(i,1))+1;
ecord(i,linspace(a(i,1),a(i+1,1),lengh1)-max2+1)=round(linspace(a(i,2),a(i+1,2),lengh1));
end
for i=1:lengh
k=0;
for j=1:n
if ecord(j,i)==-1
k=k+1;
else
if k==0
else
ecord(j-k,i)=ecord(j,i);
ecord(j,i)=-1;
end
end
end
end
if dip==1
for i=1:lengh
k=1;
for j=1:n-1
if (ecord(j,i)>0)&&(ecord(j+1,i)>0)
if (k==1)
if ecord(j,i)~=ecord(j+1,i)
k=-k;
lengh1=abs(ecord(j+1,i)-ecord(j,i))+1;
d(round(linspace(ecord(j,i),ecord(j+1,i),lengh1)),max2+i-1)=1;
else
end
else
k=-k;
end
end
end
end
else
for i=1:lengh
k=1;
for j=1:n-1
if (ecord(j,i)>0)&&(ecord(j+1,i)>0)
if (k==1)
if ecord(j,i)~=ecord(j+1,i)
k=-k;
lengh1=abs(ecord(j+1,i)-ecord(j,i))+1;
d(round(linspace(ecord(j,i),ecord(j+1,i),lengh1)),max2+i-1)=0;
else
end
else
k=-k;
end
end
end
end
end
line_rect
function d=linw(addrbef,addrnow,xl,yl,d,dip)
addrbef=round(addrbef);
addrnow=round(addrnow);
n=6;
a=zeros(n+1,2);
dx=round(xl/2);
dy=round(yl/2);
x0=addrbef(1);
y0=addrbef(2);
x1=addrnow(1);
y1=addrnow(2);
if abs(x0-x1)<=1
x1=x0;
if y1>y0
d(ceil(y0-yl/2):ceil(y1+yl/2),ceil(x0-xl/2):ceil(x0+xl/2))=dip;
else
d(ceil(y1-yl/2):ceil(y0+yl/2),ceil(x0-xl/2):ceil(x0+xl/2))=dip;
end
else
if abs(y0-y1)<=1
y1=y0;
if x1>x0
d(ceil(y0-yl/2):ceil(y0+yl/2),ceil(x0-xl/2):ceil(x1+xl/2))=dip;
else
d(ceil(y0-yl/2):ceil(y0+yl/2),ceil(x1-xl/2):ceil(x0+xl/2))=dip;
end
else
t1=x1-x0;
t2=y1-y0;
a=zeros(n+1,2);
dx=floor(xl/2);
dy=floor(yl/2);
if t1>0
if t2>0
a(1,1:2)=addrbef+[dx,-dy];
a(2,1:2)=addrbef+[-dx,-dy];
a(3,1:2)=addrbef+[-dx,dy];
a(4,1:2)=addrnow+[-dx,dy];
a(5,1:2)=addrnow+[dx,dy];
a(6,1:2)=addrnow+[dx,-dy];
a(7,1:2)=addrbef+[dx,-dy];
else
a(1,1:2)=addrbef+[-dx,-dy];
a(2,1:2)=addrbef+[-dx,dy];
a(3,1:2)=addrbef+[dx,dy];
a(4,1:2)=addrnow+[dx,dy];
a(5,1:2)=addrnow+[dx,-dy];
a(6,1:2)=addrnow+[-dx,-dy];
a(7,1:2)=addrbef+[-dx,-dy];
end
else
if t2>0
a(1,1:2)=addrbef+[-dx,-dy];
a(2,1:2)=addrbef+[dx,-dy];
a(3,1:2)=addrbef+[dx,dy];
a(4,1:2)=addrnow+[dx,dy];
a(5,1:2)=addrnow+[-dx,dy];
a(6,1:2)=addrnow+[-dx,-dy];
a(7,1:2)=addrbef+[-dx,-dy];
else
a(1,1:2)=addrbef+[-dx,dy];
a(2,1:2)=addrbef+[dx,dy];
a(3,1:2)=addrbef+[dx,dy];
a(4,1:2)=addrnow+[dx,dy];
a(5,1:2)=addrnow+[-dx,-dy];
a(6,1:2)=addrnow+[-dx,-dy];
a(7,1:2)=addrbef+[-dx,-dy];
end
end
end
a=round(a);
[max1,maxid1]=max(a(:,1));
[max2,maxid2]=min(a(:,1));
lengh=max1-max2+1;
ecord=zeros(n,lengh)-1;
for i=1:n
lengh1=abs(a(i+1,1)-a(i,1))+1;
ecord(i,linspace(a(i,1),a(i+1,1),lengh1)-max2+1)=round(linspace(a(i,2),a(i+1,2),lengh1));
end
for i=1:lengh
k=0;
for j=1:n
if ecord(j,i)==-1
k=k+1;
else
if k==0
else
ecord(j-k,i)=ecord(j,i);
ecord(j,i)=-1;
end
end
end
end
for i=1:lengh
k=1;
for j=1:n-1
if (ecord(j,i)>0)&&(ecord(j+1,i)>0)
if (k==1)
if ecord(j,i)~=ecord(j+1,i)
k=-k;
lengh1=abs(ecord(j+1,i)-ecord(j,i))+1;
d(round(linspace(ecord(j,i),ecord(j+1,i),lengh1)),max2+i-1)=1;
else
end
else
k=-k;
end
end
end
end
end
主函数
%%本程序是gerber文件转换程序的主程序,其将调用本目录下的多个程序来完成gerber文件转换的任务
[fun,address]=zhuan();
temp1=size(address);
lenghfun=temp1(1);
clear temp1
apertures=cell(100,2);
infor=zeros(100,1);
ratio1=72.5;
is360=0;
amdata=cell(100,2);
amn=0;
addrnow=[0,0];
addrbef=[0,0];
%%mxl代表x轴方向上的像素数量
mxl=20000;
myl=20000;
d=false(myl,mxl);
coord=zeros(lenghfun,2);
for i=1:200
switch num2str(fun{i,1})
case 'FS'
dfs=fun{i,2:7};
case 'AS'
sas=fun{i,2:3};
case 'MI'
if fun{i,2}==1
end
%%此处先空着,因为一般不会使用该功能
case 'MO'
%%此处定义图像的单位,因为所得到的图片为点阵图,所以该选项将不被本程序使用但其信息将被送入主程序
case 'OF'
%%此处为偏移设置,程序将自动设置
dof=fun{i,2:3};
case 'SF'
%%该选项是设定图像比例因子的
dsf=fun{i,2:3};
case 'IJ'
%%从说明书中并未发现该选项
case 'IN'
%%该选项定义文件名称
din=fun{i,2};
case 'IO'
%%定义在输出设备上的图形偏移
dio=fun{i,2:3};
case 'IP'
mdip=fun{i,2};
case 'IR'
switch fun{i,2}
case 90
d=rot90(d);
case 180
d=rot90(d,2);
case 270
d=rot90(d,-1);
end
case 'PF'
%%提示操作员胶片名称,该参数将被输入到主程序
dpf=fun{i,2};
case 'AD'
%%本功能的作用是定义光圈
switch fun{i,3}
case 'R'
x0=floor(fun{i,4}/2);
y0=floor(fun{i,5}/2);
xd=round(fun{i,4});
yd=round(fun{i,5});
sizefig=[xd,yd];
temp=rect(x0,y0,xd,yd,sizefig);
sizefig=size(temp);
switch fun{i,10}
case 6
r=round(fun{i,6}/2);
temp=temp&~circ(x0,y0,r,sizefig);
case 7
xd=fun{i,6};
yd=fun{i,7};
temp=temp&~rect(x0,y0,xd,yd,sizefig);
end
apertures(eval(fun{i,2}),1)={temp};
apertures(eval(fun{i,2}),2)={[sizefig,x0,y0]};
infor(eval(fun{i,2}),1)=i;
case 'C'
x0=floor(fun{i,4});
y0=x0;
r=round(fun{i,4});
sizefig=[2*r,2*r];
temp=circ(x0,y0,r,sizefig);
sizefig=size(temp);
switch fun{i,10}
case 6
xd=round(fun{i,5});
yd=round(fun{i,6});
temp=(temp&~rect(x0,y0,xd,yd,sizefig));
case 5
r=round(fun{i,5});
temp=(temp&~circ(x0,y0,r,sizefig));
end
apertures(eval(fun{i,2}),1)={temp};
apertures(eval(fun{i,2}),2)={[sizefig,x0,y0]};
infor(eval(fun{i,2}),1)=i;
case 'O'
if fun{i,4}>fun{i,5}
x0=floor(fun{i,4}/2);
y0=floor(fun{i,5}/2);
xd=round(fun{i,4}-fun{i,5}+1);
yd=round(fun{i,5});
xl=round(fun{i,4});
yl=round(fun{i,5});
r=round(fun{i,5}/2);
temp=rect(x0,y0,xd,yd,[xl,yl]);
sizefig=size(temp);
x0=y0;
temp=(temp|circ(x0,y0,r,sizefig));
x0=round(fun{i,4})-y0;
temp=(temp|circ(x0,y0,r,sizefig));
switch fun{i,10}
case 6
x0=round(fun{i,5}/2);
temp=(temp&~circ(x0,y0,xl,yl,r,dip));
case 7
x0=round(fun{i,5}/2);
temp=(temp&~rect(x0,y0,xd,yd,sizefig));
end
else
x0=floor(fun{i,4}/2);
y0=floor(fun{i,5}/2);
xl=round(fun{i,4});
yl=round(fun{i,5});
yd=round(fun{i,5}-fun{i,4}+1);
xd=round(fun{i,4});
r=round(fun{i,4}/2);
temp=rect(x0,y0,xd,yd,uint32([xl,yl]));
sizefig=size(temp);
y0=x0;
temp=(temp|circ(x0,y0,r,sizefig));
y0=round(fun{i,5}-fun{i,4}/2-1);
temp=(temp|circ(x0,y0,r,sizefig));
switch fun{i,10};
case 6
r=round(fun{i,6});
temp=(temp&~circ(x0,y0,r,sizefig));
case 7
xd=round(fun{i,6});
yd=round(fun{i,7});
temp=(temp&~rect(x0,y0,xd,yd,sizefig));
end
end
end
apertures(eval(fun{i,2}),1)={temp};
apertures(eval(fun{i,2}),2)={[sizefig,x0,y0]};
infor(eval(fun{i,2}),1)=i;
case 'P'
x0=fun{i,4};
y0=fun{i,4};
xl=fun{i,4}*2-1;
yl=xl;
n=fun{i,5};
dip=1;
switch fun{i,10}
case 5
theta=0;
temp=polygon(x0,y0,xl,yl,r,n,theta);
case 7
theta=fun{i,6};
temp=polygon(x0,y0,xl,yl,r,n,theta);
dip=0;
r=fun{i,7};
temp=temp+circ(x0,y0,xl,yl,r,dip);
case 8
theta=fun{i,6};
xd=fun{i,7};
yd=fun{i,8};
temp=polygon(x0,y0,xl,yl,r,n,theta);
dip=0;
temp=temp+rect(x0,y0,xl,yl,r,n,theta);
otherwise
for j=1:amn
if fun{i,3}==amdata(j,1)
dam=amdata{i,2};
dam=dam{1};
end
end
amid=strfind(dam,',');
amsize=size(dam);
amsize=amsize(2);
amidsize=size(amid);
amidsize=amidsize(2);
amid(amidsize+1)=amsize+1;
clear amsize amidsize
switch num2str(dam{i,1})
case '1'
dip=dam{amid(1)+1};
r=dam{amid(2)+1}/2;
x0=dam{amid(3)+1:amid(4)-1};
y0=dam{amid(4)+1:amid(5)-1};
case '2'
%%这项功能占时没有用到,连同20占时省略
dip=dam{amid(1)+1};
yd=dam{amid(2)+1}/2;
x0=dam{amid(3)+1:amid(4)-1};
y0=dam{amid(4)+1:amid(5)-1};
case '4'
%%本选项完成一个不规则多边形的绘制任务
dip=dam{amid(1)+1};
n=dam{amid(2)+1:amid(3)-1};
a=zeros(n,2);
for j=1:n
%%此处解决多边形各节点的位置问题,theta是偏转角度;
a(j,1:2)=[dam(2*j+1),dam(2*j+2)];
end
[pangle,pr]=cart2pol(a(:,1),a(:,2));
%%下面这一步完成的是角度的逆时针偏转
pangle=pangle+theta;
[a(:,1),a(:,2)]=pol2cart(pangle,pr);
a(:,1)=a(a,1)-min(a(:,1))+1;
a(:,2)=a(a,2)-min(a(:,2))+1;
a=round(a);
[max1,maxid1]=max(a(:,1));
[max2,maxid2]=min(a(:,1));
lengh=max1-max2+1;
ecord=zeros(n,lengh)-1;
for j=1:n
lengh1=abs(a(j+1,1)-a(j,1))+1;
ecord(j,linspace(a(j,1),a(j+1,1),lengh1)-max2+1)=round(linspace(a(j,2),a(j+1,2),lengh1));
end
for j=1:lengh
k=0;
for l=1:n
if ecord(l,j)==-1
k=k+1;
else
if k==0
else
ecord(l-k,j)=ecord(l,j);
ecord(l,j)=-1;
end
end
end
end
temp=false(xl,yl);
for j=1:lengh
k=1;
for l=1:n-1
if (ecord(l,j)>0)&&(ecord(l+1,j)>0)
if (k==1)
if ecord(l,j)~=ecord(l+1,j)
k=-k;
lengh1=abs(ecord(l+1,j)-ecord(l,j))+1;
temp(round(linspace(ecord(l,j),ecord(l+1,j),lengh1)),max2+j-1)=1;
else
end
else
k=-k;
end
end
end
end
apertures(eval(fun{i,2}),1)={temp};
apertures(eval(fun{i,2}),2)={[size(temp),x0,y0]};
infor(eval(fun{i,2}),1)=i;
%%多边形绘制工作到此结束
end
end
case 'AM'
amn=amn+1;
amdata{amn,1}=fun(i,2);
amdata{amn,2}=fun(i,3);
%%case 'KO'
case 'LP'%%定义图像的明暗
if fun{i,2}=='C'
mdip=0;
else
mdip=1;
end
case 'SR'
%%临时不做
end
end
%绘图部分
for i=1:lenghfun
switch address(i,1)
case 4
switch address(i,2)
case 54
apernow=address(i,3);
case 74
is360=0;
case 75
is360=1;
case 36
polonfill=1;
case 37
polonfill=0;
end
case 5
apernow=address(i,2);
case 1
if address(i,7)==1
d=linw1(address(i,2:5),apertures{apernow,2},d);
else
d=linw(addrbef,addrnow,xl,yl,d,dip);
end
case 2
case 3
end
end
多边形绘制
fun d=polygon(x0,y0,xl,yl,r,n)
%%clear
%%clc
%%r=20;
%%x0=50;
%%y0=50;
%%n=6;
t=2*pi/n;
a=zeros(n+1,2);
for i=1:n+1
a(i,1:2)=[x0+r*cos(i*t-t/2-pi/2),y0+r*sin(i*t-t/2-pi/2)];
end
a=round(a);
[max1,maxid1]=max(a(:,1));
[max2,maxid2]=min(a(:,1));
lengh=max1-max2+1;
ecord=zeros(n,lengh)-1;
for i=1:n
lengh1=abs(a(i+1,1)-a(i,1))+1;
ecord(i,linspace(a(i,1),a(i+1,1),lengh1)-max2+1)=round(linspace(a(i,2),a(i+1,2),lengh1));
end
for i=1:lengh
k=0;
for j=1:n
if ecord(j,i)==-1
k=k+1;
else
if k==0
else
ecord(j-k,i)=ecord(j,i);
ecord(j,i)=-1;
end
end
end
end
d=false(xl,yl);
for i=1:lengh
k=1;
for j=1:n-1
if (ecord(j,i)>0)&&(ecord(j+1,i)>0)
if (k==1)
if ecord(j,i)~=ecord(j+1,i)
k=-k;
lengh1=abs(ecord(j+1,i)-ecord(j,i))+1;
d(round(linspace(ecord(j,i),ecord(j+1,i),lengh1)),max2+i-1)=1;
else
end
else
k=-k;
end
end
end
end
plot(a(:,1),a(:,2))
image(ecord)
image(d*200)
gerber解析函数
function [fun,address]=zhuan()
clc
clear
fid = fopen('10.gbl');
textfile=textscan(fid,'%s','delimiter','*','whitespace','');
tex=textfile{1};
n1=size(tex);
n1=n1(1);
if strcmp(tex(n1),'M02')==0
tex(n1,:)=[];
end
fun=cell(200,10);
address=zeros(n1,7);
address(1,:)=0;
ni=1;
i=1;
while i<n1
n1=size(tex);
n1=n1(1);
celsize=size(tex{i});
if celsize(2)==1
tex(i,:)=[];
n1=n1-1;
end
if tex{i}(1)=='%'
tex{i}(1)='';
if tex{i}(1)=='%'
tex{i}(1)='';
end
end
i=i+1;
end
for i=1:200
isl=isletter(tex{i}(2));
if isl==1
fun(i,1)={tex{i}(1:2)};
switch fun{i,1}
case 'FS'
fun(i,2)={tex{i}(4-1)};
fun(i,3)={tex{i}(5-1)};
fun(i,4)={tex{i}(7-1)};
fun(i,5)={tex{i}(8-1)};
fun(i,6)={tex{i}(10-1)};
fun(i,7)={tex{i}(11-1)};
fun{i,10}=7;
if fun{i,2}=='L'
direc=0;
else
direc=1;
end
integ=fun{i,4};
decim=fun{i,5};
case 'MO'
fun(i,2)={tex{i}(3)};
fun{i,10}=2;
if fun{i,2}=='I'
ratio1=25.4/0.0138;
else
ratio1=1/0.0138;
end
case 'SF'
sfid=strfind(tex{i},'B');
sfid1=sfid(1);
fun(i,2)={tex{i}(4:sfid1-1)};
sfid=size(tex{i});
sfid2=sfid(2);
fun(i,3)={tex{i}(sfid1+1:sfid2)};
fun{i,10}=3;
case 'MI'
misize=size(tex(i));
if misize==4
switch tex{i}(3)
case 'A'
fun(i,2)={tex{i}(4)};
case 'B'
fun(i,3)={tex{i}(6)};
end
else
fun(i,2)={tex{i}(4)};
fun(i,3)={tex{i}(6)};
end
fun{i,10}=3;
case 'OF'
ofid1=strfind(tex(i),'A');
ofid2=strfind(tex(i),'B');
ofid3=size(tex(i));
ofid3=ofid3(2);
ofisem1=isempty(ofid1);
if (ofisem1==1)&&(ofisem2==1);
ofid1=ofid1(1);
ofid2=ofid2(1);
fun(i,2)={tex{i}(ofid1+1:ofid2-1)};
fun(i,3)={tex{i}(ofid2+1:ofid3)};
else
if ofisem1==1
ofid1=ofid1(1);
ofid2=ofid2(1);
fun{i,2}=0;
fun(i,3)={tex{i}(ofid2+1:ofid3)};
else
ofid1=ofid1(1);
ofid2=ofid2(1);
fun{i,3}=0;
fun(i,2)={tex{i}((ofid1+1):(ofid2-1))};
end
end
fun{i,10}=3;
case 'AS'
fun(i,2)={tex{i}(4)};
fun{i,10}=2;
case 'IN'
insize=size(tex(i));
fun(i,2)={tex{i}(3:insize(2))};
fun{i,10}=2;
case 'IP'
fun(i,2)={tex{i}(3)};
fun{i,10}=2;
case 'PF'
pfsize=size(tex{i});
fun(i,2)={tex{i}(3,pfsize)};
case 'IR'
irsize=size(tex{i});
fun(i,2)={tex{i}(3:irsize)};
fun{i,10}=2;
case 'LN'
lnsize=size(tex{i});
fun(i,2)={tex{i}(3:lnsize(2))};
fun{i,10}=2;
case 'AD'
%%apertures定义,这是个大活。
adsize=size(tex{i});
adsize=adsize(2);
adid=strfind(tex{i},'X');
if tex{i}(7)==','
if isempty(adid)==1
fun(i,2)={tex{i}(4:5)};
fun(i,3)={tex{i}(6)};
fun(i,4)={str2double(tex{i}(8:adsize))*ratio1};
fun(i,10)={4};
else
adids=size(adid);
adids=adids(2);
fun(i,2)={tex{i}(4:5)};
fun(i,3)={tex{i}(6)};
fun(i,4)={str2double(tex{i}(8:(adid(1))-1))*ratio1};
adid(adids+1)=adsize+1;
for j=1:adids
fun(i,4+j)={str2double(tex{i}(adid(j)+1:adid(j+1)-1))*ratio1};
end
fun(i,10)={4+adids};
end
else
adid1=strfind(tex{i},',');
if isempty(adid1)==1
fun(i,2)={tex{i}(4:5)};
fun(i,3)={tex{i}(6:adsize)};
fun(i,10)={3};
else
adid2=strfind(tex{i}(adid1(1)+1:adsize),'X');
if isempty(adid2)==1
fun(i,2)={tex{i}(4:5)};
fun(i,3)={tex{i}(6:adid1(1))};
fun(i,4)={tex{i}(adid1(1):adsize)};
fun{i,10}={4};
else
adsize2=size(adid2);
adsize2=adsize2(2);
adid2(adsize2+1)=adsize+1;
fun(i,2)={tex{i}(4:5)};
fun(i,3)={tex{i}(6:adid1(1)-1)};
for j=1:adsize2
fun(i,3+j)={tex{i}(adid2(j)+1:adid2(j+i)-1)};
end
fun(i,10)={3+adsize2};
end
end
end
case 'AM'
fun(i,2)={tex{i}(4:5)};
fun(i,3)={tex(i+1)};
tex(i+1)={'G04'};
fun{i,10}=3;
case 'LP'
fun(i,2)={tex{i}(3)};
fun{i,10}=2;
case 'SR'
srid1=strfind(tex{i},'X');
srid2=strfind(tex{i},'Y');
srid3=strfind(tex{i},'I');
srid4=strfind(tex{i},'J');
srid5=size(tex{i});
fun(i,2)={tex{i}(srid1+1:srid2-1)};
fun(i,3)={tex{i}(srid2+1:srid3-1)};
fun(i,4)={tex{i}(srid3+1:srid4-1)};
fun(i,5)={tex{i}(srid4+1:srid5(2))};
fun{i,10}=2;
case 'TA'
taid1=strfind(tex{i},',');
taid1=taid1(1);
taid2=size(tex{i});
taid2=taid2(2);
fun(i,2)={tex{i}(3:taid1-1)};
fun(i,3)={tex{i}(taid1+1:taid2)};
fun{i,10}=3;
case 'TD'
tdid1=size(tex{i});
fun(i,2)={tex{i}(3:tdid1(2))};
fun{i,10}=2;
case 'KO'
koid1=strfind(tex{i},'X');
koid2=strfind(tex{i},'Y');
koid3=strfind(tex{i},'I');
koid4=strfind(tex{i},'J');
koid5=size(tex{i});
fun(i,2)={tex{i}(koid1+1:koid2-1)};
fun(i,3)={tex{i}(koid2+1:koid3-1)};
fun(i,4)={tex{i}(koid3+1:koid4-1)};
fun(i,5)={tex{i}(koid4+1:koid5(2))};
fun{i,10}=5;
otherwise
end
end
end
%下面是画图代码,address(i,1)4;G代码,5:D代码,1:画线,2:光圈关闭,3闪绘光圈;
for i=1:n1
if ~isletter(tex{i}(2))
addrid5=size(tex{i});
addrid5=addrid5(2);
if tex{i}(1)=='G'
address(i,1)=4;
address(i,2)=str2double(tex{i}(2:3));
if addrid5>3
if tex{i}(4)=='D'
address(i,3)=str2double(tex{i}(5:6));
end
end
else
if tex{i}(1)=='D'
address(i,1)=5;
address(i,2)=str2double(tex{i}(2:3));
else
address(i,2:3)=address(ni,2:3);
address(i,4:5)=address(ni,2:3);
num1=0;
addrid2=zeros(1,addrid5+1);
for j=1:addrid5
addrid1=isletter(tex{i}(j));
if addrid1==1
num1=num1+1;
addrid2(num1)=j;
end
end
%%下面的程序是读取位置操作符的数据,这里面涉及到数据0省略方向和整数和小叔位数;
%%如果direc是0,那么代表左侧省略,1代表右侧省略;
if direc=='0'
for h=1:num1
if h==num1
addrid2(h+1)=addrid5;
end
switch tex{i}(addrid2(h))
case 'X'
address(i,2)=str2double(tex{i}(addrid2(h)+1:addrid2(h+1)-1))/(10^dicim);
case 'Y'
address(i,3)=str2double(tex{i}(addrid2(h)+1:addrid2(h+1)-1))/(10^dicim);
case 'I'
address(i,4)=str2double(tex{i}(addrid2(h)+1:addrid2(h+1)-1))/(10^dicim);
case 'J'
address(i,5)=str2double(tex{i}(addrid2(h)+1:addrid2(h+1)-1))/(10^dicim);
case 'D'
address(i,6)=str2double(tex{i}(addrid2(h)+1:addrid2(h+1)-1));
address(i,1)=address(i,6);
otherwise
end
end
else
%%该步骤是当右边省略时候
for h=1:num1
if h==num1
addrid2(h+1)=addrid5+1;
end
temp1=eval(decim)-(eval(integ)+eval(decim)-(addrid2(h+1)-addrid2(h)-1));
switch tex{i}(addrid2(h))
case 'X'
address(i,2)=str2double(tex{i}(addrid2(h)+1:addrid2(h+1)-1))*ratio1/(10^temp1);
case 'Y'
address(i,3)=str2double(tex{i}(addrid2(h)+1:addrid2(h+1)-1))*ratio1/(10^temp1);
case 'I'
address(i,4)=str2double(tex{i}(addrid2(h)+1:addrid2(h+1)-1))*ratio1/(10^temp1);
case 'J'
address(i,5)=str2double(tex{i}(addrid2(h)+1:addrid2(h+1)-1))*ratio1/(10^temp1);
case 'D'
address(i,6)=str2double(tex{i}(addrid2(h)+1:addrid2(h+1)-1))/(10^temp1);
address(i,1)=address(i,6);
otherwise
end
end
end
ni=i;
end
end
end
end
address(:,7)=((abs(address(:,1)-address(:,3))<1)|(abs(address(:,2)==address(:,4))<1));
address=round(address);
end