/* fourchette.java - jpq - 04/07/99 - 29/08/00 - 31/10/2010 - 27/05/2015
 * Auteur : Jean-Paul Quelen
 * Détermination de fourchette et vérification de la capture des vraies valeurs de p
 * Fonctionne normalement avec n > 30 et 0,2 < p < 0,8
 */

import java.awt.event.* ;
import java.awt.* ;
import java.applet.* ;
import java.util.* ;

public class fourchettes extends java.applet.Applet implements ActionListener

{ static final long serialVersionUID = 270515L ;
  double p ;
  TextField tp, tn ;
  int n, N ;
  Random r ;
  Button ok ;
  String fourch [] = { "90%", "95%", "99%" } ;
  double ic [] = { 1.6449, 1.9600, 2.5758 } ;
  dessin D ;

  public void init () {
	  if (n == 0) {
		  try {
			  p = Double.parseDouble (getParameter ("p"));
			  n = Integer.parseInt (getParameter ("n"));
		  }
          catch (NullPointerException e) {
              p = 0.4;
              n = 100;
		  }
          catch (NumberFormatException e) { }
	  }
      n = Math.max (1, n);
      p = Math.max (0.0, Math.min(1.0, p));

    r = new Random () ;

    setLayout (new BorderLayout ()) ;
    setFont (new Font ("Arial, Helvetica, sans-serif", Font.PLAIN, 10)) ;
    Panel pnl = new Panel () ;
    add (pnl, BorderLayout.NORTH) ;
    pnl.setBackground (Color.lightGray) ;
    pnl.add ( new Label ("vraie valeur de p :")) ;
    pnl.add (tp = new TextField (10)) ;
    tp.setText (Double.toString (p)) ;
    pnl.add (new Label ("taille de l'échantillon :")) ;
    pnl.add (tn = new TextField (10)) ;
    tn.setText (Integer.toString (n)) ;
    pnl.add (ok = new Button ("Ok")) ;
    ok.addActionListener (this) ;
    add (D = new dessin (), BorderLayout.CENTER) ;
  	D.repaint () ;
  }

  private double arrondi (double d, int i)
  { double dpi = Math.pow (10, (double) i) ;
    return Math.floor (d * dpi) / dpi ;
  }

  public void actionPerformed (ActionEvent e)
  { if (e.getSource () == ok)
    { try {p = Double.parseDouble (tp.getText ()) ; }
      catch (NumberFormatException nfe) { }
      if (p < 0.0) p = 0.0 ;
      if (p > 1.0) p = 1.0 ;
      tp.setText (Double.toString (p)) ;
      try { n = Integer.parseInt (tn.getText ()) ; }
      catch (NumberFormatException nfe) { }
      if (n <= 0) n = 1 ;
      tn.setText (Integer.toString (n)) ;
      D.repaint () ;
    }
  }

  public String getAppletInfo ()
  { return "fourchette par j.-p. Quelen" ; }

////////////////////////////////////////////////////////////////////////////////

protected class dessin extends Canvas
{ static final long serialVersionUID = 311010L ;
	Image img ;
  Graphics g ;
  int w, h ;

  public void update (Graphics g1)
  { paint (g1); }

  public void paint (Graphics g1)
  { int w1 = getSize().width ;
  	int h1 = getSize().height ;
  	if ((img == null) || (w1 != w) || (h1 != h))
  	{ w = w1 ;
  		h = h1 ;
  		img = createImage (w, h) ;
      g = img.getGraphics () ;
    }
    g.setColor (Color.white);
    g.fillRect (0, 0, w, h) ;
    g.setColor (Color.black) ;
    int som = 0 ;
    for (int i = 0 ; i < n; i ++)
    { double d = r.nextDouble () ;
      if (d < p) som ++ ;
    }
    double pe = (double) som / (double) n ;
    g.drawString (" nombre d'individus ayant le caractère étudié : " + Integer.toString (som),0, 20) ;
    g.drawString (" nombre d'individus n'ayant pas le caractère étudié : " + Integer.toString (n - som), 0, 40) ;
    g.drawString (" p estimé : " + Integer.toString (som) + " / " + Integer.toString (n) + " = " + Double.toString (arrondi (pe, 4)), 0, 60) ;
    for (int i = 0 ; i < 3 ; i ++)
    { /* double ecart = ic [i] * Math.sqrt (pe * (1.0 - pe) / (double) n) ; */
      double ecart = ic [i] * 0.5 / Math.sqrt ((double) n) ;
      g.setColor (Color.black) ;
      double pemin = (pe - ecart >= 0.0) ? pe - ecart : 0.0 ;
      double pemax = (pe + ecart <= 1.0) ? pe + ecart : 1.0 ;
      g.drawString (" intervalle de confiance au niveau " + fourch [i] + " : " + "[" + Double.toString (arrondi (pemin, 4)) + ", " + (arrondi (pemax, 4)) + "]", 0, 110 + i * 50) ;
      g.setColor (Color.yellow) ;
      int nl = 120 + i * 50 ;
      g.drawLine (0, nl, getSize().width, nl) ;
      g.setColor (Color.black) ;
      int inter = getSize().width / 10 ;
      g.fillRect (0, nl, 1, 1) ;
      g.drawString ("0", 0, nl + 11) ;
      for (int j = 1 ; j < 10 ; j ++)
      { g.fillRect (inter * j, nl, 1, 1) ;
        g.drawString ("0." + Integer.toString (j), inter * j - 8, nl + 11) ;
      }
      g.fillRect (getSize().width - 1, nl, 1, 1) ;
      g.drawString ("1", getSize().width - 5, nl + 11) ;
      g.setColor (Color.blue) ;
      g.drawLine ((int)(pemin * (double) getSize().width), nl, (int)(pemax * (double) getSize().width), nl) ;
      g.fillRect ((int)(pe * (double) getSize().width) - 1, nl - 1, 3, 3) ;
      g.setColor (Color.red) ;
      g.fillRect ((int)(p * (double) getSize().width) - 1, nl - 1, 3, 3) ;
    }    
    g1.drawImage (img, 0, 0, this) ;
  }
}

////////////////////////////////////////////////////////////////////////////////

/* permet le fonctionnement en mode commande 13/02/15
 * usage : arbre.jar width height p n
 */

	public static void main (String [] args) {
		int w = 600;
		int h = 320;
		double p = 0.4;
		int stn = 100;

// Création et lancement de l'applet
		fourchettes fo = new fourchettes ();
		fo.n = stn;
		fo.p = p;
		fo.init ();
		fo.start ();

// Création de la fenêtre contenant l'applet
		Frame f = new Frame ("Fourchette") ;
		f.addWindowListener (new fermer ()) ;
		f.add (fo) ;
		f.setSize (w, h) ;
		f.setVisible (true) ;
	}

// Permet la fermeture de la fenêtre contenant l'applet
	protected static final class fermer extends WindowAdapter {
		public void windowClosing (WindowEvent e) {
			System.exit (0) ;
		}
	}

}