//applet permettant de visualiser les problemes d'echantillonnage d'un signal sinusoidal
   import java.awt.*;

   public class sinus_esp extends java.applet.Applet
   {
      String croix="x";
      Label freq = new Label ("            Frecuencia del senhal en Hz:");
      Label freqe = new Label ("           Frecuencia de samplado en Hz:");
      Label temps = new Label ("Duracion del senhal en s:");
      //Label origine = new Label ("Fase en grados:");
      TextField A = new TextField("100",20);
      TextField B = new TextField("2000",20);
      TextField C = new TextField("0.05",20);
      //TextField D = new TextField("0",20);
      Button calcul =new Button("Calcular");
   
      public void init()
      {
         add(freq);
         add(A);
         add(freqe);
         add(B);
         add(temps);
         add(C);
         //add(origine);
         //add(D);
         add(calcul);
      }
   
      public boolean action(Event evt, Object arg)
      {
         if (evt.target == calcul)
            repaint();
         return true;
      }
   
   
      public void paint (Graphics g)
      {
         double w=0;
         double f=0;
         double fe=0;
         double i=0;//valeur de X
         double max =0;
         double phi=0;
         double valeur_max=0;
         int n=0; //f=n*fe
         int index=0;
         int x[]=new int[301];
         int	y[]=new int[301];
      
      //parametrage
         f=Integer.parseInt(A.getText());	//frequence du signal
         fe=Integer.parseInt(B.getText());	//frequence d'echantillonnage
         w=2*Math.PI*f;
         max=Double.valueOf(C.getText()).doubleValue();
         //phi=Integer.parseInt(D.getText()); //Déphasage en degrés
         //phi=phi*Math.PI/180;//phi converti en radians
      
      //Axes
         g.setColor(Color.blue);
         g.drawLine(0,200,300,200);
         g.drawLine(0,100,0,300);		
         g.drawLine(350,200,650,200);
         g.drawLine(350,100,350,300);		
         g.drawString("Amplitud",3,100);
         g.drawString("Amplitud",351,100);
         g.drawString("Tiempo",290,210);
         g.drawString("Tiempo",640,210);
      
         g.setColor(Color.blue);
         g.drawString("Senhal samplado",400,325);
      
         g.setColor(Color.black);
         g.drawString("Senhal original",100,325);
      
      //calcul et stockage de points dans x[] et y[]
         for (index=0;index<=300;index++)
         {
            x[index] = index;
            y[index] = (int) (200-100*Math.sin(index*w*max/299-phi));
         }
      //tracé de la fonction
         g.setColor(Color.black);
         g.drawPolygon (x,y,300);
      //Il vaut mieux remplacer tous les g.drawPolygon par des g.drawPolyline mais g.drawPolyline
      //n'est pas compatible avec toutes les versions de Java.
      
      //tracé de croix de l'échantillonnage
         index=0;
         for (i=0;i<=max;i=i+(1/fe))
         {int xfe; int yfe;
            g.setColor(Color.blue);
            xfe=(int) (i/max*300);
            yfe=(int) (200-100*Math.sin(i*w-phi));
            g.drawLine(xfe-2,yfe-2,xfe+2,yfe+2);
            g.drawLine(xfe+2,yfe-2,xfe-2,yfe+2);
            xfe=(int) ((i/max*300)+350);
            yfe=(int) (200-100*Math.sin(i*w-phi));
            g.drawLine(xfe-2,yfe-2,xfe+2,yfe+2);
            g.drawLine(xfe+2,yfe-2,xfe-2,yfe+2);
         }
      
      //tracé du signal échantillonné
         if (f==0.5*fe)
         {
            g.setColor(Color.blue);
            g.drawString("El teoremo de samplado esta justo respetado",400,340);
         }
      
         if (f<0.5*fe)
         {	
            index=0;
            g.setColor(Color.blue);
            g.drawString("El teoremo de samplado esta respetado",400,340);
            for (index=0;index<=300;index++)
            {
               x[index] = index+350;
               y[index] = (int) (200-100*Math.sin(index*w*max/299-phi));
            }
            g.drawPolygon (x,y,300);
         }
      
      
         if (f>0.5*fe)
         {
            g.setColor(Color.red);
            g.drawString("Atencion ! El teoremo de samplado no esta respetado",400,340);
            n=(int) (f/fe);
            f=f-(n*fe);
            if ((f>0)&&(f<0.5*fe))
            {
               g.setColor(Color.red);
               w=-2*Math.PI*f;
               index=0;
               for (index=0;index<=300;index++)
               {
                  x[index] = index+350;
                  y[index] = (int) (200+100*Math.sin(index*w*max/299-phi));
               }
               g.drawPolygon (x,y,300);
            
            }
            if ((f>0.5*fe)&&(f<fe))
            {
               g.setColor(Color.red);
               f=fe-f;
               w=2*Math.PI*f;
               index=0;
               for (index=0;index<=300;index++)
               {
                  x[index] = index+350;
                  y[index] = (int) (200+100*Math.sin(index*w*max/299-phi));
               }
               g.drawPolygon (x,y,300);
            
            }
         
         }
      
      }
   }