/* PiMC.java
 * 
 * Rapport du nombre de points dans le 1/4 de cercle de rayon 1
 * centré à l'origine et de coordonnées positives (1er quadrant)
 * au nombre de points du carré O(0;0) I(1;0) A(1;1) J(0;1)
 *
 * echo "set term dumb 40 20;set nokey;set xrange [0 : 1]; set yrange  [0 : 1]; plot sqrt(1-x**2)"|gnuplot
 *
 *    1 *********---+------+-----+----++
 *      +     + ******     +     +     +
 *      |            *****             |
 *  0.8 ++               ***          ++
 *      |                  ***         |
 *      |                     **       |
 *  0.6 ++      Intérieur      ***    ++
 *      |          du            **    |
 *      |     quart de cercle     **   |
 *      |                           *  |
 *  0.4 ++                          **++
 *      |                            **|
 *      |                             *|
 *  0.2 ++                            *+
 *      |                              *
 *      +     +     +      +     +     *
 *    0 ++----+-----+------+-----+----+*
 *      0    0.2   0.4    0.6   0.8    1
 *
 * Jean-Paul Davalan <jpdvl@wanadoo.fr>
 *  */

import java.applet.*;
import java.awt.*;
import java.lang.*;

public class PiQMC extends Applet {
  public long niter = 0, nit;
  public double pi = 0.0, somme = 0.0;
  public double r2 = 0.414213562373095048801688724; // sqrt(2) - 1
  public double r3 =  0.732050807568877293527446341; // sqrt(3) - 1
  public double a=0, b=0;
  public void init() {
    setIter(getParameter("iterations"));
  }
 
  public void paint(Graphics g) {
    g.clearRect(0, 0, 450, 40);
    g.drawString("Pi est évalué à 4 * " +somme+" / "+niter+" = " +  pi, 10, 10);
    g.drawString("après avoir choisi " + niter + " points dans le carré.", 10, 30);
  }
  public void setIter(String s) {
    long i;
    if(s == null) {
      nit = 0;
    } else {
      nit = Long.parseLong(s);
    }
    for(i=1; i <= nit; i++) {
      niter++;
      a = a+r2; a = a-Math.floor(a);
      b = b+r3; b = b-Math.floor(b);
      somme += (a*a+b*b < 1)? 1 : 0;
      pi = 4*somme/niter;
    }	    
    repaint();
  }
}
