function plot3d(S,F,style,coul,k,r)
% PLOT3D(S,F,STYLE,COUL) représente un objet à trois dimensions
% PLOT3D(S,F,'R',COUL) représente l'objet avec remplissage
% PLOT3D(S,F,'F',COUL) représente l'objet en fil de fer
% PLOT3D(S,F,'FN',COUL) représente l'objet en fil de fer avec les numéros des sommets
% PLOT3D(S,F,'FNA',COUL) représente l'objet en fil de fer avec les numéros des sommets
%                        et les axes
% PLOT3D(S,F,'T',COUL,K) représente l'objet rempli avec des polygones troués
%						 avec un rapport K
% PLOT3D(S,F,'L',COUL,K,R) représente l'objet rempli avec des polygones troués
%						 avec un rapport K et un relief construit par homothétie de 
%                        centre O et de rapport R.

% J.-B. Roux, Collège de Saussure, 1998

% initialisation
[nbf,co]=size(F);	% nbf est le nombre de faces
if nargin==2
	style='F  ';
	coul=gray(nbf);
elseif nargin==3
	coul=gray(nbf);
end
style=[style,'   '];
style=style(1:3);
if isempty(coul)
	coul=gray(nbf);
end

% tracé des faces

for i=1:nbf
	nbs=F(i,1);		% nbs est le nombre de sommets
	ind=F(i,2:nbs+1);	% indices des sommets de la face
	
	if upper(style(1))=='F'
		plot3(S(ind,1),S(ind,2),S(ind,3))
	elseif upper(style(1))=='R'
		fill3(S(ind,1),S(ind,2),S(ind,3),coul(i,:))
	elseif upper(style(1))=='T'				% polygone troué
		p1=[S(ind,1) S(ind,2) S(ind,3)];	% polygone initial
		p2=polygoneReduit(p1,k);            % polygone réduit d'un rapport K
		for j=1:nbs-1
			fill3([p1(j,1) p1(j+1,1) p2(j+1,1) p2(j,1) p1(j,1)], ...
			      [p1(j,2) p1(j+1,2) p2(j+1,2) p2(j,2) p1(j,2)], ...
				  [p1(j,3) p1(j+1,3) p2(j+1,3) p2(j,3) p1(j,3)],coul(i,:), ...
				  'edgecolor',coul(i,:))
		end
		plot3(p1(:,1),p1(:,2),p1(:,3),'-k',p2(:,1),p2(:,2),p2(:,3),'-k')
	elseif upper(style(1))=='L'				% polygone en relief
		p1=[S(ind,1) S(ind,2) S(ind,3)];	% polygone initial
		p2=polygoneReduit(p1,k);            % polygone réduit d'un rapport K
		p3=r*p1;							% polygone d'homothétie R
		p4=polygoneReduit(r*p1,k);			% polygone réduit de K d'homothétie R
		for j=1:nbs-1
	  		fill3([p1(j,1) p1(j+1,1) p2(j+1,1) p2(j,1) p1(j,1)], ...
			      [p1(j,2) p1(j+1,2) p2(j+1,2) p2(j,2) p1(j,2)], ...
				  [p1(j,3) p1(j+1,3) p2(j+1,3) p2(j,3) p1(j,3)],coul(i,:), ...
				  'edgecolor',coul(i,:))	% ABCD et A'B'C'D'
			fill3([p3(j,1) p3(j+1,1) p4(j+1,1) p4(j,1) p3(j,1)], ...
			      [p3(j,2) p3(j+1,2) p4(j+1,2) p4(j,2) p3(j,2)], ...
				  [p3(j,3) p3(j+1,3) p4(j+1,3) p4(j,3) p3(j,3)],coul(i,:), ...
				  'edgecolor',coul(i,:))	% EFGH et E'F'G'H'
			fill3([p2(j,1) p4(j,1) p4(j+1,1) p2(j+1,1) p2(j,1)], ...
				  [p2(j,2) p4(j,2) p4(j+1,2) p2(j+1,2) p2(j,2)], ...
				  [p2(j,3) p4(j,3) p4(j+1,3) p2(j+1,3) p2(j,3)],coul(i,:))	% polygone latéraux
		end
		plot3(p1(:,1),p1(:,2),p1(:,3),'-k',p2(:,1),p2(:,2),p2(:,3),'-k')
	else
		error('Style non défini')
	end
end

% ajout des numéros des sommets
if upper(style(2))=='N'
	[nbs,co]=size(S);
	for i=1:nbs
		text(S(i,1),S(i,2),S(i,3),num2str(i))
	end
end

% ajout des axes
if upper(style(3))=='A'
	mx=1.5;
	plot3([0 mx],[0 0],[0 0],'r')
	plot3([0 0],[0 mx],[0 0],'r')
	plot3([0 0],[0 0],[0 mx],'r')
	text(mx,0,0,'x')
	text(0,mx,0,'y')
	text(0,0,mx,'z')
end
% réinitialisation
axis equal
axis off
if (upper(style(1))~='F') & (upper(style(1))~='R')
	set(gcf,'renderer','zbuffer')
end

