Näherung an Pi funktioniert nicht

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

MCWulf

Betreff: Näherung an Pi funktioniert nicht

BeitragDi, Jun 14, 2005 6:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo!

Ich muss für den Mathe-Unterricht gerade ein Programm schreiben, bei dem um einen Viertel-Kreis ein Quadrat gelegt wird und dann zufällig "Sandkörner" draufgestreut werden. Wenn man die Anzahl der Sandkörner im Kreis mit der Anzahl de Sandkörner im Rest teilt, soll man sich Pi nähern...

Blos ich komme mit meinem Code auf 3.6 - 3.7 ... Warum? Stimmt da was nicht?

Code: [AUSKLAPPEN]

;Fenster öffnen
Graphics 640,480,32,2
SetBuffer BackBuffer()

;Deklarationen
Global Radius=200
Global RadiusS=5
Global Interv=1
Global Sandkoernerzahl%
Global DavonKreis%
Global DavonRect%
Global Auswahl%=1
Global Go=0
Global LastMilliSek%
Global TempX#
Global TempY#

;Viertelkreis+Quadrat+Umrandungen zeichnen
Color 20,150,200
Rect  20, 20, Radius,Radius,    1
Color 255,255,255
Rect  20, 0,  Radius,Radius+20, 0
Color 50,  200,100
Oval  20, -radius+20, Radius*2,Radius*2,1
Color 255,255,255
Oval  20, -radius+20,  Radius*2,Radius*2,0
Rect 20,20,radius,radius,0
Color 0,0,0
Rect 0,0,640,20,1
Rect 20+radius,0,radius+21,480,1

;Zufallszahlen zufällig machen
SeedRnd(MilliSecs())

;Beginn der Schleife
While Not KeyHit(1)

   ;Text anzeigen
   Color 0,0,0
   Rect 20+radius+245,0,640,95
   Color 255,255,255
   Text 20+radius+50,20,"Sandkörner:"
   Text 20+radius+250,20,Sandkoernerzahl
   Text 20+radius+50,40,"Davon im Viertel-Kreis:"
   Text 20+radius+250,40,DavonKreis
   Text 20+radius+50,60,"Davon im Rest-Viereck:"
   Text 20+radius+250,60,DavonRect
   Text 20+radius+50,80,"Daraus ergebendes Pi:"
   If davonrect=0 Then
      Text 20+radius+250,80,"---" ;Falls 0 Sandkörner im Quadrat sind nicht 'Durch Null' rechnen!
   Else
      Text 20+radius+250,80,Float(DavonKreis)/Float(DavonRect)
   EndIf
   
   ;Optionen anzeigen und bearbeiten
   If KeyHit(200) Then Auswahl=Auswahl-1
   If KeyHit(208) Then Auswahl=Auswahl+1
   If Auswahl < 1 Then Auswahl=4
   If Auswahl > 4 Then Auswahl=1
   If Auswahl=1 Then
      Color 255,100,100
      If KeyDown(205) And radius < 325 Then
         Radius=Radius+1
         NeuZeichnenUndZuruecksetzen
      EndIf
      If KeyDown(203) And Radius > 50 Then
         Radius=Radius-1
         NeuZeichnenUndZuruecksetzen
      EndIf
   Else
      Color 255,255,255
   EndIf
   Text 20+radius+50,120,"Radius:"
   Text 20+radius+250,120,Radius
   
   If Auswahl=2 Then
      Color 255,100,100
      If KeyDown(205) And RadiusS<100 Then
         RadiusS=RadiusS+1
         NeuZeichnenUndZuruecksetzen
      EndIf
      If KeyDown(203) And RadiusS>1 Then
         RadiusS=RadiusS-1
         NeuZeichnenUndZuruecksetzen
      EndIf
   Else
      Color 255,255,255
   EndIf
   Text 20+radius+50,140,"Radius Sandkörner:"
   Text 20+radius+250,140,RadiusS
   
   If Auswahl=3 Then
      Color 255,100,100
      If KeyDown(205) And interv < 2000 Then
         Interv=Interv+1
         NeuZeichnenUndZuruecksetzen
      EndIf
      If KeyDown(203)And interv > 1 Then
         Interv=Interv-1
         NeuZeichnenUndZuruecksetzen
      EndIf
      If KeyHit(203) And interv >0 Then
         interv=interv-1
         neuzeichnenundzuruecksetzen
      EndIf
   Else
      Color 255,255,255
   EndIf
   Text 20+radius+50,160,"Intervall (ms):"
   If interv > 0 Then
      Text 20+radius+250,160,Interv
   ElseIf interv = 0 Then
      Text 20+radius+250,160,"Turbo"
   EndIf
   
   Color 0,0,0
   Rect 20+radius+40,175,20+radius+150,195
   If Auswahl=4 Then
      Color 255,100,100
      If KeyHit(28) Then
         Select go
            Case 0
               go=1
               lastmillisek=MilliSecs()
            Case 1
               go=0
         End Select
      EndIf
   Else
      Color 255,255,255
   EndIf
   If Go = 0 Then
      
      Text 20+radius+50,180,"Start"
   Else
      Text 20+radius+50,180,"Stop"
   EndIf
   
   If go=1 Then
      If interv > 0 Then
         If MilliSecs()-lastmillisek >=interv Then
            tempX#=Rnd(20,(20+radius))
            tempY#=Rnd(20,(20+radius))
            Sandkoernerzahl=Sandkoernerzahl+1
            If (tempX-(radius+20.0))^2+(tempy-20.0)^2 < radius^2 Then
               Color 0,100+Rnd(-30,30),0
               davonkreis=davonkreis+1
            Else
               Color 0,0,255+Rnd(-60,0)
               davonrect=davonrect+1
            EndIf
            Oval tempX-radiuss/2,tempY-radiuss/2,radiuss,radiuss,1
            lastmillisek=MilliSecs()
         EndIf
      Else
      If interv=0 Then tempa=100
         For i = 1 To tempa
            
            tempX#=Rnd(20,(20+radius))
            tempY#=Rnd(20,(20+radius))
            DebugLog tempx+"   "+tempy
            Sandkoernerzahl=Sandkoernerzahl+1
            If (tempX-(radius+20.0))^2+(tempy-20.0)^2 < radius^2 Then
               Color 0,100+Rnd(-30,30),0
               davonkreis=davonkreis+1
               DebugLog "   =>Im Kreis"
            Else
               Color 0,0,255+Rnd(-60,0)
               davonrect=davonrect+1
               DebugLog "   =>Im Rest"
            EndIf
            Oval tempX-radiuss/2,tempY-radiuss/2,radiuss,radiuss,1
            
            lastmillisek=MilliSecs()
         Next
      EndIf
   EndIf
   
   ;Buffer flippen
   Flip
   
Wend
;Ende der Schleife

;Funktion zum Neuzeichnen der Figur und Zurücksetzen der Sandkörner
Function NeuZeichnenUndZuruecksetzen()
   Cls
   Color 20,150,200
   Rect  20, 20, Radius,Radius,    1
   Color 255,255,255
   Rect  20, 0,  Radius,Radius+20, 0
   Color 50,  200,100
   Oval  20, -radius+20, Radius*2,Radius*2,1
   Color 255,255,255
   Oval  20, -radius+20,  Radius*2,Radius*2,0
   Rect 20,20,radius,radius,0
   Color 0,0,0
   Rect 0,0,640,20,1
   Rect 20+radius,0,radius+21,480,1
   
   sandkoernerzahl=0
   davonkreis=0
   davonrect=0
   
   Color 255,255,255
   Text 20+radius+50,20,"Sandkörner:"
   Text 20+radius+250,20,Sandkoernerzahl
   Text 20+radius+50,40,"Davon im Viertel-Kreis:"
   Text 20+radius+250,40,DavonKreis
   Text 20+radius+50,60,"Davon im Rest-Viereck:"
   Text 20+radius+250,60,DavonRect
   Text 20+radius+50,80,"Daraus ergebendes Pi:"
   If davonrect=0 Then
      Text 20+radius+250,80,"---"
   Else
      Text 20+radius+250,80,Float(DavonKreis)/Float(DavonRect)
   EndIf
   
   If Auswahl=1 Then
      Color 255,100,100
   Else
      Color 255,255,255
   EndIf
   Text 20+radius+50,120,"Radius:"
   Text 20+radius+250,120,Radius
   
   If Auswahl=2 Then
      Color 255,100,100
   Else
      Color 255,255,255
   EndIf
   Text 20+radius+50,140,"Radius Sandkörner:"
   Text 20+radius+250,140,RadiusS
   
   If Auswahl=3 Then
      Color 255,100,100
   Else
      Color 255,255,255
   EndIf
   Text 20+radius+50,160,"Intervall (ms):"
   If interv > 0 Then
      Text 20+radius+250,160,Interv
   ElseIf interv = 0 Then
      Text 20+radius+250,160,"Turbo"
   EndIf
   
   Color 0,0,0
   Rect 20+radius+40,175,20+radius+150,195
   If Auswahl=4 Then
      Color 255,100,100
   Else
      Color 255,255,255
   EndIf
   If Go = 0 Then
      Text 20+radius+50,180,"Start"
   Else
      Text 20+radius+50,180,"Stop"
   EndIf
   
   go=0
End Function


Vielen herzlichen Dank schonmal!
 

Timo

BeitragDi, Jun 14, 2005 8:28
Antworten mit Zitat
Benutzer-Profile anzeigen
warum der Code jetzt nicht klappt, weiß ich nicht, aber ich habe so etwas auch mal gemacht Wink

Hier der code:
(du brauchst dafür das Bild, was ich unten angefügt habe)

BlitzBasic: [AUSKLAPPEN]

Graphics 640,460,16,2
SetBuffer BackBuffer()
SeedRnd MilliSecs()

Const width = 400
Const height = 400
Const genauigkeit# = 1000.0

Local Image,x,y
Local aussen = 0,innen = 0 ;Flächen
Local A#

Dim Punkt(width,height)

Image = LoadImage(\"bild.bmp\")
SetBuffer ImageBuffer(Image)
For x = 1 To width
For y = 1 To height
GetColor x,y
If ColorRed() = 0 And ColorGreen() = 0 And ColorBlue() = 0 Then
Punkt(x,y) = 1
Else
Punkt(x,y) = 0
EndIf
Next
Next

SetBuffer BackBuffer()
Color 255,255,255
For x = 1 To genauigkeit
Cls
DrawBlock Image,10,55

If Punkt(Rand(width),Rand(Height)) = 1 Then
innen = innen + 1
Else
aussen = aussen + 1
EndIf

;A = InnenProzent der Gesamtfläche (gesamtfläche = 2 * 2)
A# = ( innen / genauigkeit ) * 4

Text 10,10,\"Pi = \" + Pi
Text 10,30,\"Flächeninhalt vom Kreis : \" + A#
If KeyHit(1) Then End
Flip
Next
WaitKey()
End


Das benötigte Bild. (*.bmp, 468.8 KB)

D2006

Administrator

BeitragDi, Jun 14, 2005 8:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Hossa.

~BEITRAG EDITIERT~
Die BB-Syntax Tags sind sehr langsam, was sich vorallem bei langen Codes bemerkbar macht. Habe im ersten Post gute alte [ code ] Tags eingefügt.

~BEITRAG EDITIERT~
Ein >400 KB ist allein im Interesse der Modemuser bitte zu verlinken. Übrigens kann BB so ein Bild mit ~5 Zeilen selbst erzeugen.

MfG
D2006

MCWulf

BeitragDi, Jun 14, 2005 14:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Ah, ok, danke, werd ich mir für nächstes mal merken Smile

@Timo: Ja, so kann man es auch machen, blos leider muss ich es mit dem Monte-Carlo-Verfahren machen... Aber warum funkt das nicht? Mein Mathe-Lehrer hat sich das heute mal in der Schule angeschaut und würde sagen, dass das ganze Random-Zeugs in Blitz(3D) nicht so korrekt arbeitet...

Könnte es das sein? Wenn nein, woran liegts dann?

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragDi, Jun 14, 2005 15:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe mir deinen Code nicht genau angesehen, sondern mal eine eigene Version gecodet
Vielleicht erkennst du ja selbst einen
fehler
BlitzBasic: [AUSKLAPPEN]
SeedRnd MilliSecs()
AnzSandkorn=10000000
For i= 0 To AnzSandkorn
x#= Rnd (0,100)
y#= Rnd (0,100)
If Sqr(x^2 +y^2)<= 100.00 Then
inKreis#= inKreis +1
End If
Next
PiZahl# = inKreis/AnzSandkorn*4;wegen Virtelkreis
Print Pi +\" Orginal\"
Print PiZahl#
WaitKey

da kommen bei mir etwas genauere Werte bei raus!
[BB2D | BB3D | BB+]

MCWulf

BeitragDi, Jun 14, 2005 15:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Ahja, du berechnest es anders, jetzt hab ichs bei mir auch umgeändert, jetzt funkts auch auf einmal... Sehr komisch, aber vielen herzlichen Dank!!! Smile

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragDi, Jun 14, 2005 15:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Kein Problem!
[BB2D | BB3D | BB+]
 

Wilhelm

BeitragSo, Jun 19, 2005 10:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
Dein Programm ist gut gemacht, aber Deine Berechnungsformel stimmt nicht. Du darfst nicht die Treffer im Viertelkreis durch die Treffer im Rest teilen, das ergibt tatsächlich ungefähr 3,7.
Stattdessen müssen die Treffer im Viertelkreis durch die Gesamttreffer geteilt und mit 4 malgenommen werden.

WiB

Kalex

BeitragSo, Jun 19, 2005 13:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi Mcwulf.
Wenn das Programm funktioniert kannst du ja an Tonny´s PI-Wettbewerb mitmachen. Dann müsste dein Programm aber PI bis 1000000 Stellen hinter dem Komma berechnen können.

MFG

DS
My Fantasy Story:
Reich der Drachen

MCWulf

BeitragDi, Jun 21, 2005 18:11
Antworten mit Zitat
Benutzer-Profile anzeigen
^^ Ja, allerdings is diese methode ... ... etwas ... ^^ ungenau... und dauert auch ... ... etwas ... ^^ lange, falls man mal 4 stellen nach dem komma genau haben will ^^

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group