function ballon(p,c,t)
% BALLON(P,C,T) représente un icosaèdre tronqué.
% BALLON('i',C,T) représente un icosaèdre
% BALLON('b',C,T) représente un icosaèdre tronqué ou ballon de foot ou fullerène
% BALLON(P,'f',T) est une représentation en fil de fer
% BALLON(P,'n',T) est une représentation avec remplissage noir/blanc
% BALLON(P,'c',T) est une représentation avec remplissage couleur
% BALLON(P,C,1) affiche les numéros des sommets
% BALLON(P,C,0) n'affiche pas les numéros.
% Le ballon de foot classique est donc: BALLON('b','n',0)

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

if nargin==0
	help ballon
	return
end

% Propriétés de l'icosaèdre
f=20; 								% faces
a=30;								% arêtes
s=12;								% sommets

m=5;								% nombre d'arêtes en un sommet
n=3;								% nombre de côtés de chaque face

al=2*asin(cos(pi./m)./sin(pi./n));	% angle d'inclinaison
									% de deux faces adjacentes
R=1;								% rayon de la sphère circonscrite
l=(2*R)./(tan(pi./m).*tan(al/2));	% longueur d'une arête

% valeurs obtenues

%l =1.05146222423827
%al =2.41186499736283

% rayon du cercle d'intersection de la sphère circonscrite avec
% la sphère centrée au sommet le plus haut (le long de l'axe des z)
% de rayon "l".

k=(2-l^2)/2;						% plan d'intersection
r=sqrt(1-k^2);						% rayon du cercle d'intersection

% valeurs obtenues

%k =0.44721359549996
%r =0.89442719099992

% coordonnées des sommets
tt=0:2*pi/5:2*pi-0.1;
x15=r*cos(tt);						% sommets de 1 à 5
y15=r*sin(tt);
z15=k*ones(size(x15));
x6=0;								% sommet 6
y6=0;
z6=R;
x7=0;								% sommet 7
y7=0;
z7=-R;
x812=-x15;							% sommets de 8 à 12 obtenus 
y812=-y15;							% par symétrie centrale
z812=-z15;


% matrice des sommets et des faces
S=[x15' y15' z15'
   x6 y6 z6
   x7 y7 z7
   x812' y812' z812'];
F=[1 2 6
   2 3 6
   3 4 6
   4 5 6
   5 1 6
   5 10 1
   1 10 11
   1 11 2
   2 11 12
   2 12 3
   3 12 8
   3 8 4
   4 8 9
   4 9 5
   5 9 10
   7 12 11
   7 8 12
   7 9 8
   7 10 9
   7 11 10];

if p=='b'								% on calcule l'icosaèdre tronqué
	
	% on coupe depuis chaque sommet l'icosaèdre par un plan. On obtient
	% donc cinq points d'intersection dont les coordonnées sont calculées
	% en divisant les arêtes par 1/3;

	d=1/3;								% découpage de l'arête

	% tableau des indices
	uns=ones(1,5);
	li=[uns];
	for i=2:12
		li=[li, i*uns];					% indices des 12 sommets de l'icosaèdre
	end
	% indices des autres sommets voisins de chaque sommet
	co=[6 2 11 10 5 3 6 1 11 12 2 8 12 4 6 6 5 9 8 3 6 4 10 9 1 1 2 3 4 5 ...
    	10 9 8 12 11 12 3 4 9 7 8 4 5 10 7 11 7 9 5 1 1 2 12 7 10 11 2 3 8 7];

	% matrice des sommets
	S=[S(co,1)*d+S(li,1)*(1-d) S(co,2)*d+S(li,2)*(1-d) S(co,3)*d+S(li,3)*(1-d)];

	% matrice des faces
	FP=[ 1     5     4     3     2		% 12 pentagones
    	 6     7     8     9    10
   	 	15    11    13    12    14
   	 	16    17    18    19    20
   		23    25    21    22    24
    	26    27    28    29    30
    	35    31    32    33    34
    	36    37    38    39    40
    	41    42    43    44    45
    	46    50    49    48    47
    	51    52    53    54    55
    	56    57    58    59    60];
	FH=[14    15    28    29    16    20	% 20 hexagones
    	17    16    29    30    21    22
    	11    15    28    27     7     6
    	27    26     1     2     8     7
    	26    30    21    25     5     1
     	 4     5    25    23    49    50
    	55    51     3     4    50    46
     	 9     8     2     3    51    52
    	56    57    10     9    52    53
    	13    11     6    10    57    58
   		36    37    12    13    58    59
    	19    20    14    12    37    38
    	41    42    18    19    38    39
    	24    22    17    18    42    43
    	48    49    23    24    43    44
   	 	53    54    35    34    60    56
    	59    60    34    33    40    36
    	39    40    33    32    45    41
    	44    45    32    31    47    48
    	46    47    31    35    54    55];
end

% représentation graphique

if p=='i'
	% on dessine l'icosaèdre
	if c=='f'
		patch('vertices',S,'faces',F,'facevertexcdata',hsv(20),'facecolor','none')
	else
		patch('vertices',S,'faces',F,'facevertexcdata',hsv(20),'facecolor','flat')
	end
else
	% on dessine l'icosaèdre tronqué
	if c=='f'
		patch('vertices',S,'faces',FP,'facevertexcdata',hsv(12),'facecolor','none')
		patch('vertices',S,'faces',FH,'facevertexcdata',hsv(20),'facecolor','none')
	elseif c=='c'
		patch('vertices',S,'faces',FP,'facevertexcdata',hsv(12),'facecolor','flat')
		patch('vertices',S,'faces',FH,'facevertexcdata',hsv(20),'facecolor','flat')
	else
		patch('vertices',S,'faces',FP,'facevertexcdata',[0 0 0],'facecolor','flat')
		patch('vertices',S,'faces',FH,'facevertexcdata',[1 1 1],'facecolor','flat')
	end
end


% Affichage des sommets
if t==1
 if p=='i'
	for i=1:12
			text(S(i,1),S(i,2),S(i,3),int2str(i))
	end
else
	view(0,90)
	for i=1:60
		if S(i,3)>=0
			text(S(i,1),S(i,2),S(i,3),int2str(i))
		end
	end
 end
end

axis off
axis equal
rotate3d on

 
