PrecedenteAltri AppletSuccessivo



Calcolo dell'area di un cerchio

Si può stimare l'area del cerchio ricoprendolo di quadrati e calcolando le aree delle figure composte rispettivamente dai quadrati completamente interni al cerchio e quelli la cui intersezione con il cerchio non sia vuota.Questo applet permette di fare degli esperimenti variando la dimensione dei quadrati.



Questo browser non e' abilitato
a visualizzare applet

Istruzioni:

Nel campo in basso a sinistra si può inserire un numero che rappresenta la dimensione in pixel dei quadrati che ricoprono il cerchio. Più piccolo è questo numero e migliore sarà la stima dell'area.
In basso a destra si leggono le due stime dell'area del cerchio, rispettivamente:
  • La somma delle aree dei quadrati completamente interni al cerchio (quadrati gialli)
  • La somma delle aree dei quadrati non completamente esterni al cerchio (quadrati gialli e grigi)

Le aree sono normalizzate in modo tale che l'area vera del cerchio sia pigreco.


Codice sorgente: area.java
import java.applet.Applet;
import java.awt.*;
import java.awt.image.ColorModel;
import java.awt.image.MemoryImageSource;
import java.lang.InterruptedException;

public class area extends Applet {

    AreaControls controls;
    AreaCanvas canvas;

    public void init() {
	setLayout(new BorderLayout());
	controls = new AreaControls();
	add("South", controls);
	add("Center", canvas = new AreaCanvas(controls));
    }


    public boolean action(Event ev, Object arg) {
          canvas.repaint();
	    return true;
    }



}

class AreaCanvas extends Canvas {
 
    AreaControls control;

    AreaCanvas(AreaControls control) {
      this.control = control;
    }

    public void paint(Graphics g) {

      Color grey = new Color(100,100,100);

      int len = Integer.parseInt(control.n_fld.getText());
      if(len<2)len=2;

	int w = size().width;
	int h = size().height;
      int cx = w/2;
      int cy = h/2;

      double radius = 0.8*(cx>cy?cy:cx);
      double radius2 = radius*radius;

      // area di un quadretto in unità di r^2
      double qarea = len*len/radius2;
      double isum =0, esum = 0;

      // disegno i quadrati
      int x,y;
      for(x=0;x<cx;x+=len)
      for(y=0;y<cy;y+=len)
        {
         int x1 = x+len-1;
         int y1 = y+len-1;
         boolean inside = (x1*x1+y1*y1<radius2);
         boolean outside = (x*x+y*y>=radius2);
         if(!outside) 
           {
            if(inside) {
              g.setColor(Color.yellow);
              isum+=4*qarea;esum+=4*qarea;
            } else {
              g.setColor(grey);esum+=4*qarea;
            }
            g.fillRect(cx+x,cy+y,len,len);
            g.fillRect(cx-len-x,cy+y,len,len);
            g.fillRect(cx+x,cy-len-y,len,len);
            g.fillRect(cx-len-x,cy-len-y,len,len);
           }
        }
      
      // disegno la griglia
      g.setColor(Color.black);
      for(x=cx;x<w;x+=len) g.drawLine(x,0,x,h-1);
      for(x=cx-len;x>=0;x-=len) g.drawLine(x,0,x,h-1);
      for(y=cy;y<h;y+=len) g.drawLine(0,y,w-1,y);
      for(y=cy-len;y>=0;y-=len) g.drawLine(0,y,w-1,y);

      // disegno il cerchio
      int d = (int)(radius);
      g.setColor(Color.red);
      g.drawOval(cx-d,cy-d,2*d,2*d);


      

      control.area1_lab.setText(Double.toString(isum));
      control.area3_lab.setText(Double.toString(esum));

     }
}



class AreaControls extends Panel {
    public TextField n_fld;
    public Label area1_lab, area2_lab, area3_lab;
    public AreaControls() {
	setLayout(new FlowLayout());
	add(new Label("lato:"));
	add(n_fld        = new TextField("100", 4));
	add(new Label("pixel    "));
	add(area1_lab = new Label("                "));
	add(area2_lab = new Label(" < area < "));
	add(area3_lab = new Label("                "));

    }
}

  





PrecedenteAltri AppletSuccessivo


Gian Marco Todesco