
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                           generation de la texture                           %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function generer(handles)

global Qr va zones x_max y_max r_min dx tailles ng_min ng_max NG polygone courbe_spline
global choix_loi params motif angle choix_mapping expression discretisation


   % initialisation de la pile et sortie du mode mapping
   tailles=[];
   choix_mapping=0;

   % lecture des parametres de la generation
   x_max    =str2num(get(handles.xm   ,'string'));
   y_max    =str2num(get(handles.ym   ,'string'));
   r_min    =str2num(get(handles.rm   ,'string'));
   dx       =str2num(get(handles.dx   ,'string'));
   choix_loi=        get(handles.choix,'value' ); 
   param_1  =str2num(get(handles.c1   ,'string'));
   param_2  =str2num(get(handles.c2   ,'string'));
   param_3  =str2num(get(handles.c3   ,'string'));
   motif    =        get(handles.motif,'value' );
   angle=get(handles.rotation,'Value');
   params=[param_1 param_2 param_3];

   % saisie de la forme d'un polygone si necessaire
   axes(handles.axes1);
   axis normal
   axis image;
   grid off;
   if motif==5,
      axis([-.5 .5 -.5 .5]);
      poly=getligne;
      if size(poly,1)>=3,
         polygone=poly;
      end
      hold on
      plot(polygone(:,1),polygone(:,2),'k');
      plot([polygone(end,1) polygone(1,1)],[polygone(end,2) polygone(1,2)],'k');
      hold off
      axes(handles.axes2);
      plot(polygone(:,1),-polygone(:,2),'k');
      hold on;
      plot([polygone(end,1) polygone(1,1)],-([polygone(end,2) polygone(1,2)]),'k');
      hold off;
   end

   % saisie de la forme d'une courbe spline si necessaire
   if motif==6,
      courbe=[];
      bouton=0;
      i=1;
      axis([-.5 .5 -.5 .5]);
      hold on
      while bouton~=3,
         [courbe(i,1),courbe(i,2),bouton]=ginput(1);
         plot(courbe(i,1),courbe(i,2),'go');
         drawnow;
         i=i+1;
      end
      courbe(i,:)=courbe(1,:);
      hold off
      if size(courbe,1)>=4,
         courbe_spline=courbe;
      end
      pts=points_spline(courbe_spline,200);
      axes(handles.axes2);
      axis([-.5 .5 -.5 .5]);
      plot(pts(:,1)',-pts(:,2)','k');
   end

   % saisie des parametres d'une ellipse si necessaire
   answer='';
   if motif==7,
      prompt={'Demi grand axe : a (attention a<0.5)','Demi petit axe : b','Angle en radian : phi'};
      dlgTitle='Ellipse';lineNo=1;def={'.5','.15','0.'};
      answer=inputdlg(prompt,dlgTitle,lineNo,def);
      if (~isempty(answer))
         a=str2num(char(answer(1)));
         b=str2num(char(answer(2)));
         phi=str2num(char(answer(3)));
         c=sqrt(abs(a^2-b^2));
         ellipse=[max(a,b) c -phi];
      end
   end
   
   % saisie des parametres d'une fonction lissante si necessaire

   if motif==8,
      prompt={'expression de la fonction lissante "y=f(r);", r dans [0 ; 0.5]',...
              'nombre de points de discretisation (de 2 a 65535)'};
      dlgTitle='Fonction lissante';lineNo=1;def={expression,num2str(discretisation)};
      answer=inputdlg(prompt,dlgTitle,lineNo,def);
      if (~isempty(answer))
         expression=char(answer(1));
         discretisation=str2num(char(answer(2)));
         pas=.5/(discretisation-1);
         r=0:pas:.5;
         eval(expression);
         axes(handles.axes2);
         plot(-.5:pas:.5,[y(end:-1:2) y]);
         axes(handles.axes1);
      end
   end
   
   % Calcul des textures
   % affichage de la texture et des commandes utilisees avec les parametres d'entrees
   N=round(param_3*(2/pi)*(1/(r_min^2)-1)*(x_max+1)*(y_max+1));
   if (~isempty(answer))
      messagebox('*****************************************************************************************',...
              'Generation de texture',sprintf('le nombre de point a tirer est de %d',N));
   else
      messagebox('','*****************************************************************************************');
   end    
          
   tic;
   if motif==5,
      [Qr,va,zones]=scid2d(x_max,y_max,r_min,dx,choix_loi,params,motif,angle,polygone);        
      messagebox('La ligne de commande : ',sprintf('polygone(1,:) = [ %s ]',num2str(polygone(:,1)')),sprintf('polygone(2,:) = [ %s ]',num2str(polygone(:,2)')),...
                 sprintf('scid2d(%0.4g,%0.4g,%0.2g,%0.2g,[%0.3g %0.3g %0.3g],%0.2g,%0.2g,%0.2g,polygone'')',x_max,y_max,r_min,dx,choix_loi,params,motif,angle));    
   elseif motif==6,
      [Qr,va,zones]=scid2d(x_max,y_max,r_min,dx,choix_loi,params,motif,angle,courbe_spline);
       messagebox('La ligne de commande : ',sprintf('courbe_spline(1,:) = [ %s ]',num2str(courbe_spline(:,1)')),sprintf('courbe_spline(2,:) = [ %s ]',num2str(courbe_spline(:,2)')),...
                  sprintf('scid2d(%0.4g,%0.4g,%0.2g,%0.2g,[%0.3g %0.3g %0.3g],%0.2g,%0.2g,%0.2g,courbe_spline'')',x_max,y_max,r_min,dx,choix_loi,params,motif,angle));     
   elseif motif==7,
     if (~isempty(answer))
       [Qr,va,zones]=scid2d(x_max,y_max,r_min,dx,choix_loi,params,motif,angle,ellipse);
       messagebox('La ligne de commande : ',...
                  sprintf('scid2d(%0.4g,%0.4g,%0.2g,%0.2g,%0.2g,[%0.3g %0.3g %0.3g],%0.2g,%0.2g,[%0.2g %0.2g %0.2g])',x_max,y_max,r_min,dx,choix_loi,params,motif,angle,ellipse(1),ellipse(2),ellipse(3)));    
     end                
   elseif motif==8,
      if (~isempty(answer))
        [Qr,va,zones]=scid2d(x_max,y_max,r_min,dx,choix_loi,params,motif,angle,y);
        messagebox('La ligne de commande : ',sprintf('r = 0:%0.5g:.5 ',.5/(discretisation-1)),sprintf('%s ',expression),...
                  sprintf('scid2d(%0.4g,%0.4g,%0.2g,%0.2g,[%0.3g %0.3g %0.3g],%0.2g,%0.2g,%0.2g,y)',x_max,y_max,r_min,dx,choix_loi,params,motif,angle));    
      end
      else
      [Qr,va,zones]=scid2d(x_max,y_max,r_min,dx,choix_loi,params,motif,angle);
      messagebox('La ligne de commande : ',sprintf('scid2d(%0.4g,%0.4g,%0.2g,%0.2g,%0.2g,[%0.3g %0.3g %0.3g],%0.2g,%0.2g)',x_max,y_max,r_min,dx,choix_loi,params,motif,angle));    
   end
   temps=toc;
   if (~isempty(answer) | (motif~=7 & motif~=8))   
      messagebox(sprintf('temps de calcul : %g s',temps),...
                 '*****************************************************************************************');
   else
      messagebox('l''operation a ete annulee',...
                 '*****************************************************************************************'); 
   end
   % affichage de la texture
   axes(handles.axes1);
   afficher(Qr,handles);
   ng_min=0; ng_max=0;
