Newsgroup: it.comp.lang.pascal
Titolo: Metodo MonteCarlo per calcolare pigreco

Devo fare questo programmino in TP(7).
Per chi non lo conoscesse lo riassumo in poche righe: bisogna
disegnare un quarto di circonferenza di raggio 1 ed inscriverlo in un
quadrato di raggio 1. Poi bisogna prendere A CASO dei punti in questo
quadrato e contare quelli che vanno a finire dentro il quarto di
circonferenza e quelli che vanno a finire fuori. Il rapporto tra il
numero di punti esterni e quello dei punti interni sarà
approssimativamente il valore di pigreco.
Ora mi trovo in difficoltà... =)
1) Come devo fare per disegnare il quarto di circonferenza? Disegnare
la circonferenza e poi nasconderne un pezzo? Disegnare solo un arco?
2) Che procedura devo usare per verificare se il punto creato con
coordinate x e y randomizzate è dentro o fuori il quarto di
circonferenza?
Grazie a tutti! Ciao!
¨¨°º©o¿,,¿o©º°¨¨°º©  Mr. GiMa ©º°¨¨°º©o¿,,¿o©º°¨
------------------------------------------------------------------------------
             WEB: 
http://come.to/gima
            MAIL: 
gim...@freemail.it
             UIN: 2685398
------------------------------------------------------------------------------
Togliere NOSPAM dal mio indirizzo per rispondere

Grazie a tutti! Ciao!
Allora.
r:=400;
Vai in modalita' grafica e disegni un rettangolo pieno di colore
esempio rosso.
	SetFillStyle(1,red);
	bar(0,0,r,r);
poi disegni un settore circolare di colore giallo
	SetFillStyle(1,yellow);
	Setolor(yellow)
	PieSlice(0,0,270,360,r);
poi cominci a generare dei punti all'interno del quadrato
	x:=random(r+1);
	y:=random(r+1);
per saper se il punto e' caduto all'interno del settore circolare
basta che guardi il colore del pixel di coordinete (x,y)
	colore:=GetPixel(x,y)
fai due conti ed il gioco e' fatto.
Il tutto diventa piu' o meno cosi':
program  pigreco;
uses     graph;
var      gd,gm,r,x,y:integer;
         n1,n2,i:longint;
begin
         n1:=0;
         n2:=1000000;
         r:=400;
         randomize;
         gd:=detect;
         initGraph(gd,gm,'');
         SetFillStyle(1,red);bar(0,0,r,r);
         SetFillStyle(1,yellow);
         setColor(yellow);
         PieSlice(0,0,270,360,r);
         for i:=1 to n2 do begin
            x:=random(r+1);
            y:=random(r+1);
            if GetPixel(x,y)=yellow then
               inc(n1);
            end;
         CloseGraph;
         writeln('Pi greco = ', 4/(n2/n1));
         writeln('Pigreco reale = ',pi)
end.
Da notare che
                           4
pigrego=  -------------
                         n2/n1
e non come avevi detto tu   (n2/n1)
Ciao,  Fabio
fabi...@rocketmail.com

e non come avevi detto tu   (n2/n1)
L'aveva detto la mia prof! ;)
Grazie mille. ciao.


Un bel di' Fabio M. scrisse:
FM> Vai in modalita' grafica e disegni un rettangolo pieno di colore
FM> esempio rosso.
FM> 
FM> poi disegni un settore circolare di colore giallo
FM> 
FM> per saper se il punto e' caduto all'interno del settore circolare
FM> basta che guardi il colore del pixel di coordinete (x,y)
FM> 	colore:=GetPixel(x,y)
FM> 
FM> fai due conti ed il gioco e' fatto.
FM> 
secondo me e' meglio (in termini di efficienza) verificare la
distanza di (x,y) dall'origine e' minore del raggio della circonferenza:
	if (x*x + y*y <= r*r) then
Cosi' ad occhio direi che, nonostante possa sembrare piu' lento, sia
piu' efficiente... sicuramente piu' efficace :-)
Ciao!
-- 
"Un uomo con un orologio sa che ore sono. Un uomo con 2 orologi non e mai
sicuro", legge di Segal
-- 
Emanuele Cesena
em...@iol.it
          occhio all'antispam NOSPAM!
http://www.geocities.com/SiliconValley/Grid/8879


------------------------------------------------------------------------------------------------------------------
Avevo giŕ provato questa soluzione ma non funziona e non so il motivo.
Mi da come risultato sempre 4, come se incrementasse sempre lo stesso
valore... o forse non li incrementa, veramente strano!
Ci vado a riflettere un altro po'! =)
------------------------------------------------------------------------------------------------------------------
AGGIORNAMENTO:
ho risolto il problema: ho cambiato tutte le variabili da integer a
longint e cosě funziona tutto e il risultato č, effettivamente, piů
preciso solo che, anche se scrivo
	Write('Pi greco = ', p:3:10);
Mi esce una cosa del genere:
	Pi greco = 3,1440000000
Perchč solo 3 cifre decimali e dopo tutti zeri?
Grazie! Ciao!
¨¨°ş©oż,,żo©ş°¨¨°ş©  Mr. GiMa ©ş°¨¨°ş©oż,,żo©ş°¨



per esempio fai cosi':
	write('Pi greco = ',p:3:10);
riserverai cosi' 3 cifre per l'intero e 10 per i decimali.
Fabio
fabi...@rocketmail.com

Un bel di' Mr GiMa scrisse:
MG> 	Write('Pi greco = ', p:3:10);
MG> 
MG> Mi esce una cosa del genere:
MG> 
MG> 	Pi greco = 3,1440000000
MG> 
MG> Perchè solo 3 cifre decimali e dopo tutti zeri?
MG> 
probabilmente nei calcoli che hai fatto, non arrivi mai ad una precisione 
superiore ai millesimi... :-)
-- 
"5. Ascolta attentamente mentre gli altri discutono. Poi seppelliscili con
una frase fatta", dal decalogo di Spark per il giovane manager



Ma che cavolo di risposte do!!!!!
Aveva fatto la stessa cosa.
Fabio
fabi...@rocketmail.com

Fabio
Ihihihih! =P
¨¨°º©o¿,,¿o©º°¨¨°º©  Mr. GiMa ©º°¨¨°º©o¿,,¿o©º°¨
