fid=fopen('gongfang.STL','r'); %打开二进制stl文件
fileTitle=fread(fid,80,'uchar=>schar');
fnum=fread(fid,1,'int32');
X=zeros(3,fnum);
Y=zeros(3,fnum);
Z=zeros(3,fnum);
fm=zeros(fnum,3);
FVCD=uint8(zeros(3,fnum));
for i=1:fnum,
normal=fread(fid,3,'float32');
vertex1=fread(fid,3,'float32');
vertex2=fread(fid,3,'float32');
vertex3=fread(fid,3,'float32');
clr=fread(fid,1,'uint16');
if bitget(clr,16)==1
rd=bitshift(bitand(65535,clr),-10);
grn=bitshift(bitand(2047,clr),-5);
bl=bitand(63,clr);
FVCD(:,i)=[rd;grn;bl];
end
X(:,i)=[vertex1(1); vertex2(1); vertex3(1)];
Y(:,i)=[vertex1(2); vertex2(2); vertex3(2)];
Z(:,i)=[vertex1(3); vertex2(3); vertex3(3)];
fm(i,:)=normal';
end
fclose(fid);
fprintf(' The sum of trangle are: %d.\n',fnum);%输出三角形的数目
%计算STL模型的体积
fmhang=1;vmhang=1;m=1;
while(fmhang<=fnum)
x1=X(1,fmhang); y1=Y(1,fmhang); z1=Z(1,fmhang);
x2=X(2,fmhang); y2=Y(2,fmhang); z2=Z(2,fmhang);
x3=X(3,fmhang); y3=Y(3,fmhang); z3=Z(3,fmhang);
vmhang=vmhang+3;
VF=[1 1 1 1;x1 x2 x3 x2;y1 y2 y3 y2;z1 z2 z3 0];%计算四面体的体积
VS=[1 1 1 1;x1 x1 x2 x3;y1 y1 y2 y3;z1 0 0 z3];
VT=[1 1 1 1;x1 x2 x3 x3;y1 y2 y3 y3;0 0 0 z3];
v1=(1/6)*abs(det(VF));
v2=(1/6)*abs(det(VS));
v3=(1/6)*abs(det(VT));
vds=v1+v2+v3;
f=fm(fmhang,:);
p=[0,0,1];
s=dot(f,p);
if(s>0)%判断三角形的法向量与投影平面的法向量的关系
vdscell(m,1)=vds;
end
if(s<0)
vdscell(m,1)=-vds;
end
if(s==0)
vdscell(m,1)=0;
end
m=m+1;
fmhang=fmhang+1;
end
vshu=1;vz=0;
while(vshu<=fnum)
vz=vz+vdscell(vshu,1); %对单独三角形的投影体积进行累加
vshu=vshu+1;
end
fprintf(' Volumn? is: %fmm3.\n',vz);