Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: Java: Piin likiarvon selvittäminen kokeilemalla

Sami [30.03.2004 01:46:29]

#

Arpoo pisteitä neliönmuotoiselle alueelle, katsoo kuuluuko arvottu piste ympyrän sisälle ja laskee näiden arpomalla saatujen tietojen perusteella piin likiarvoa.
Tämä metodi ei ole kovinkaan tarkka, eikä nopea, mutta onpahan kuitenkin... :)

Valmis käännetty appletikin löytyy osoitteesta http://www.paivola.net/~sami/java/pii/pii.html

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

public class Pii extends Applet{
	//Laskurit laskemaan sisälle ja ulos osuneita pisteitä
	int sisalla, ulkona;
	int arvottu;

	//Tekstikenttä likiarvon tulostamista varten
	Label pii;


	public void init() {
		//Koon asettaminen ja laskurien alustaminen
		//Laskennan kannalta koko on samantekevää,
		//mutta alueen pitää olla neliön muotoinen!
		this.setSize(500, 500);
		sisalla = 0;
		ulkona = 0;
		arvottu = 0;

		pii = new Label();
		add(pii);
	}

	public void paint(Graphics g) {
		//Asetetaan tekstikenttä sopivan kokoiseksi
		pii.setBounds(this.getWidth() / 2 - 75, 10, 150, 20);

		//Pyöritään silmukassa koko loppuelämä...
		while (true) {
			//Arvotaan uusi piste
			double x = Math.random() * this.getWidth();
			double y = Math.random() * this.getHeight();

			//Jos piste on alueen sisällä, maalataan se punaisella,
			//ulkopuolella olevat pisteet maalataan vihreällä
			if (onkoSisalla(x, y)) {
				int red, green, blue;
				red = (int)(Math.random() * 100) + 155;
				green = (int)(Math.random() * 100);
				blue = (int)(Math.random() * 100);

				g.setColor(new Color (red, green, blue));
			} else {
				int red, green, blue;
				red = (int)(Math.random() * 100);
				green = (int)(Math.random() * 100) + 155;
				blue = (int)(Math.random() * 100);

				g.setColor(new Color (red, green, blue));
			}
			//Piirretään piste
			g.drawLine((int)x, (int)y, (int)x, (int)y);

			arvottu++;

			//Näytetään piin arpomalla saatu likiarvo 10000 kierroksen välein
			//sekä konsolissa, että piirtopinnalla
			if (arvottu % 10000 == 0) {
				System.out.println((4.0 * sisalla) / (double)arvottu);
				pii.setText("" + (4.0 * sisalla) / (double)arvottu);
			}
		}
	}


	//Metodi, joka tarkistaa kuuluuko piste ympyrän sisälle vai ei.
	//Laskemiseen käytetään perinteistä Pythagoraan lausetta, eli
	//a^2 + b^2 = c^2
	public boolean onkoSisalla(double x, double y) {
		if (Math.sqrt(Math.pow(((this.getWidth() / 2) - x), 2)
			+ Math.pow(((this.getHeight() / 2) - y), 2))
			< this.getHeight() / 2) {

			sisalla++;
			return true;
		} else {
			ulkona++;
			return false;
		}
	}
}

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta