% représentation graphique du jeu d'Engel
% J.-B. Roux, Collège de Saussure, octobre 2000

% préparation des 2 hexagones centraux 
r0=1;				% rayon du cercle circonscrit
d=cos(pi/6);		% distance du centre au milieu du côté
l=2*sin(pi/6);		% hauteur d'un côté de l'hexagone
t=pi/6:pi/3:2*pi;	% angles au sommet de l'hexagone
x=r0*cos(t);		% coordonnées de l'hexagone
y=r0*sin(t);

% dessin des 2 hexagones du bord
f=1.7;				% facteur d'échelle
X=f*x;
Y=f*y;
fill([0 X(2) d 2*d+X(2) 2*d],[0 Y(2) (f-r0+l/2) Y(2) 0],'y')
hold on
fill([0 X(2) X(3)],[0 Y(2) Y(3)],'m')
fill([0 X(3) X(4)],[0 Y(3) Y(4)],'g')
fill([0 X(4) X(5)],[0 Y(4) Y(5)],'c')
fill([0 X(5) d 2*d+X(5) 2*d],[0 Y(5) -(f-r0+l/2) Y(5) 0],'y') 
fill(2*d+[0 X(5) X(6)],[0 Y(5) Y(6)],'m')
fill(2*d+[0 X(6) X(1)],[0 Y(6) Y(1)],'g')
fill(2*d+[0 X(1) X(2)],[0 Y(1) Y(2)],'c')

% autres dessins
fill(x,y,'b',x+2*d,y,'r')		% les hexagones centraux
t=0:pi/48:2*pi;
X=0.2*cos(t);
Y=0.2*sin(t);
fill(X,Y,'k',X+2*d,Y,'k')		% cercles au centre des hexagones

% boutons (flèche vers le bas pris dans la police Wingdings)
pg=uicontrol('units','normalized',...
			 'position',[0.31  0.5 0.03 0.04],...
			 'FontName','Wingdings',...
			 'string','Í',...
			 'callback','clicengel(1)');
mg=uicontrol('units','normalized',...
             'position',[0.41  0.5 0.03 0.04],...
			 'FontName','Wingdings',...
			 'string','Í',...
			 'callback','clicengel(2)');
pg=uicontrol('units','normalized',...
			 'position',[0.595 0.5 0.03 0.04],...
			 'FontName','Wingdings',...
			 'string','Í',...
			 'callback','clicengel(3)');
mg=uicontrol('units','normalized',...
			 'position',[0.695 0.5 0.03 0.04],...
			 'FontName','Wingdings',...
			 'string','Í',...
			 'callback','clicengel(4)');
set(gcf,'name','Jeu d''Engel','NumberTitle','off')

% définition des matrices de couleurs
cp=['mby';'gbm';'cbg';'ybc';'rby';'ybr';'mry';'grm';'crg';'yrc'];	% pierres
co=['yb';'mb';'gb';'cb';'yb';'rb';'yr';'mr';'gr';'cr';'yr'];		% os

% préparation d'une pierre
a=pi/9;								% angle de découpage du cercle = un os
r2=2/3*sin(pi/6)+r0;				% rayon des cercles autour des pierres et os
t11=pi-(a/2+2*a):a/20:pi-(a/2+a);	% portions de la pierre No 1
t12=pi-(a/2+a):a/20:pi-a/2;
t21=a/2:a/20:a/2+a;
t22=a/2+a:a/20:a+2*a;
t31=3*pi/2-a:a/20:3*pi/2;
t32=3*pi/2:a/20:3*pi/2+a;
x11=r2*cos(t11)+2*d;
y11=r2*sin(t11);
x21=r2*cos(t21);
y21=r2*sin(t21);
x31=r2*cos(t31)+d;
y31=r2*sin(t31)+r2+l/6;
x12=r2*cos(t12)+2*d;
y12=r2*sin(t12);
x22=r2*cos(t22);
y22=r2*sin(t22);
x32=r2*cos(t32)+d;
y32=r2*sin(t32)+r2+l/6;
x1=[x11 x(1) x22];					% on réunit toutes les portions
y1=[y11 y(1) y22];
x2=[x(1) x12 x31];
y2=[y(1) y12 y31];
x3=[x(1) x32 x21];
y3=[y(1) y32 y21];

% préparation d'un os
t1=2*pi-a/2:a/20:2*pi+a/2+a/20;		% portions d'os
t2=pi-a/2:a/20:pi+a/2+a/20;
ix4=r2*cos(t1);
iy4=r2*sin(t1);
ix5=r2*cos(t2)+2*d;
iy5=r2*sin(t2);
x4=[ix4 fliplr(x32) x32];			% on réunit toutes les portions
y4=[iy4 fliplr(y32) -y32];
x5=[ix5 x31 fliplr(x31)];
y5=[iy5 -y31 fliplr(y31)];

% dessin des os et pierres
enfacep=[10  0 0 7 8 9];	% matrice des Nos des pierres en face
enfaceo=[10 11 0 7 8 9];	% matrice des Nos des os en face (droite)
P=zeros(3,10);				% matrice des pointeurs sur les Pierres
O=zeros(2,11);				% matrice des pointeurs sur les Os
for i=1:6
	X1=x1*cos(i*pi/3)-y1*sin(i*pi/3);	% rotation de pi/3 des pierres
	Y1=x1*sin(i*pi/3)+y1*cos(i*pi/3);
	X2=x2*cos(i*pi/3)-y2*sin(i*pi/3);
	Y2=x2*sin(i*pi/3)+y2*cos(i*pi/3);
	X3=x3*cos(i*pi/3)-y3*sin(i*pi/3);
	Y3=x3*sin(i*pi/3)+y3*cos(i*pi/3);
	X4=x4*cos(i*pi/3)-y4*sin(i*pi/3);	% et des os
	Y4=x4*sin(i*pi/3)+y4*cos(i*pi/3);
	X5=x5*cos(i*pi/3)-y5*sin(i*pi/3);
	Y5=x5*sin(i*pi/3)+y5*cos(i*pi/3);
	% pierre
	p=fill(X1,Y1,cp(i,1),X2,Y2,cp(i,2),X3,Y3,cp(i,3));
	P(:,i)=p;
	if enfacep(i)~=0	% dessin de la pierre à droite
		p=fill(X1+2*d,Y1,cp(enfacep(i),1),X2+2*d,Y2,cp(enfacep(i),2),X3+2*d,Y3,cp(enfacep(i),3));
		P(:,enfacep(i))=p;
	end
	
	% os
	o=fill(X4,Y4,co(i,1),X5,Y5,co(i,2));
	O(:,i)=o;
	if enfaceo(i)~=0	% dessin de l'os à droite
		o=fill(X4+2*d,Y4,co(enfaceo(i),1),X5+2*d,Y5,co(enfaceo(i),2));
		O(:,enfaceo(i))=o;
	end
	
end
set(O,'linewidth',2,'edgecolor',[0.5 0.5 0.5])
set(P,'linewidth',2,'edgecolor',[0.5 0.5 0.5])

% on enregistre les nos des pierres dans GCF, 
% les pointeurs et les couleurs dans GCA
set(gcf,'userdata',[ 1 2 3 4 5 6;6 5 7 8 9 10;1 2 3 4 5 6;6 7 8 9 10 11]);
set(gca,'userdata',{P,O,cp,co})

% ajout d'un bouton de démonstration
uicontrol('string','demo','callback','demoengel')

% fin
hold off
axis equal
axis off
