很久之前用matlab做了一个绘图程序在矩阵中绘制gerber文件

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



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
function GRABIT Extracts data points from an image file. % % GRABIT starts a GUI program for extracting data from an image file. % It is capable of reading in BMP, JPG, TIF, GIF, and PNG files (anything % that is readable by IMREAD). Multiple data sets can be extracted from a % single image file, and the data is saved as an n-by-2 matrix variable in % the workspace. It can also be renamed and saved as a MAT file. % % Following steps should be taken: % 1. Load the image file. % 2. Calibrate axes dimensions. You will be prompted to select 4 points % on the image. Zoom and pan enabled. % 3. Grab points by clicking on points. Right-click to delete a point. % Image can be zoomed and panned. % 4. Multiple data sets will remain in memory so long as the GUI is open. % Variables can be renamed, saved to file, or edited in Array Editor. % % Panning is achieved by clicking and dragging on the image. Double-click % to center view. Right click and drag to zoom in and out. In addition, % there are keyboard shortcuts for zooming: % - zoom in % - zoom out % - reset view % % This code will also work for extracting data points from a tilted or a % skewed image (even upside-down or mirrored). The calibration stage % ensures that the imperfect orientation or quality of the image is % accounted for. % % The types of files that will most likely work are BMP, JPG, TIF, GIF (up % to 8-bit), and PNG files. Basically, any format supported by the IMREAD % is accepted. % % GRABIT(FILENAME) will start the GUI program and open the image file % FILENAME.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值