AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Annäherung an Pi mit Monte carlo, paintbox
Thema durchsuchen
Ansicht
Themen-Optionen

Annäherung an Pi mit Monte carlo, paintbox

Ein Thema von Borgschüler · begonnen am 19. Jan 2012 · letzter Beitrag vom 19. Jan 2012
Antwort Antwort
Borgschüler

Registriert seit: 6. Sep 2007
20 Beiträge
 
#1

AW: Annäherung an Pi mit Monte carlo, paintbox

  Alt 19. Jan 2012, 12:10
OK es klappt, Pi ist zwar relativ ungenau, aber das hat die monte carlo methode so ansich!

Aber kann mir vl jemand erklären, warum ich soviel rumprobieren musste, damit das ganze quadrat zu sehen ist?

Code:
procedure TForm1.Button1Click(Sender: TObject);
var i, count,x,y : integer;
pi : real;
begin
count := 0;
for i := 1 to 100000 do
 begin
  x:= random(200);
  y:= random(200);
   if (sqrt(x*x+y*y) < paintbox1.width) then
      begin
        count := count +1;
        paintbox1.canvas.pixels[x,y] := clred;
      end
      else
        paintbox1.canvas.pixels[x,y] := clgreen;
 end;
 pi := (4*count/100000);
 Label1.caption:= floattostr(pi);
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.079 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Annäherung an Pi mit Monte carlo, paintbox

  Alt 19. Jan 2012, 12:34
Aber kann mir vl jemand erklären, warum ich soviel rumprobieren musste, damit das ganze quadrat zu sehen ist?
Sollen wir jetzt schreiben, dass du es vorher nicht gerafft hast, oder wie?

1. war bei dir wahrscheinlich die Eigenschaften Width und Height (Length gibts nicht!) der Paintbox nicht auf 200 gesetzt (gut in den Screenshots weiter oben zu sehen) und du aber
2. immer konstant auf 200 anstatt wie jetzt auf Width verglichen hast.

Würde übrigens an der Stelle der If-Abfrage das Ergebnis der Wurzel noch per Round() runden, ansonsten werden Gleitkommazahlen mit Integerzahlen
verglichen, was nicht immer gut gehen muss. Der Kompiler castet zwar, aber ich hätte ein sicherers Gefühl.

Ansonsten die anderen Vorschläge mit einarbeiten!
  Mit Zitat antworten Zitat
einbeliebigername

Registriert seit: 24. Aug 2004
140 Beiträge
 
Delphi XE8 Professional
 
#3

AW: Annäherung an Pi mit Monte carlo, paintbox

  Alt 19. Jan 2012, 12:47
Hallo,

Aber kann mir vl jemand erklären, warum ich soviel rumprobieren musste, damit das ganze quadrat zu sehen ist?
Ich habe doch schon geschrieben was vermutlich passiert. Und ansonsten liegt es an der falschen Benutzung der PaintBox. Schreib mal am Ende von Button1Click noch die Zeile paintbox1.Invalidate; (bzw. paintbox1.Repaint; kannst du auch mal ausprobieren) hin. Und dann schreib hier mal was passiert und was du denkst wieso.

Einbeliebigername.
  Mit Zitat antworten Zitat
Borgschüler

Registriert seit: 6. Sep 2007
20 Beiträge
 
#4

AW: Annäherung an Pi mit Monte carlo, paintbox

  Alt 19. Jan 2012, 12:59
ok wenn ich paintbox1.invalidate oder paintbox1.repaint schreibe, verschwindet das gezeichnete. ich erklär mir das dadurch, dass die paintbox in den urzustand versetzt wird??

auf jedenfall danke leute, für die ganzen vorschläge!
  Mit Zitat antworten Zitat
einbeliebigername

Registriert seit: 24. Aug 2004
140 Beiträge
 
Delphi XE8 Professional
 
#5

AW: Annäherung an Pi mit Monte carlo, paintbox

  Alt 19. Jan 2012, 13:35
Hallo,

ich erklär mir das dadurch, dass die paintbox in den urzustand versetzt wird??
Ne, Falsch. Invalidate und Repaint bewirken das sich die PaintBox neuzeichnet. Beim Neuzeichnen geht die PaintBox immer wie folg vor:
1. Füllen der Zeichenfläche mit der Farbe, die bei Color angegeben ist
2. Auslösen des Ereignisses OnPaint

Da bei dir aber keine Behandlung dieses Ereignisses existiert wird auch nichts gezeichnet und die PaintBox bleibt leer. Das was man mit Invalidate und Repaint selbst auslösen kann, stößt auch Windows von sich aus an. Windows lässt sich an dieser Stelle aber nur schwer kontrollieren. Man muss immer daran denken, dass jederzeit Windows auf die Idee kommen kann, das komplette oder teilweise Neuzeichen eines Fensters anzustoßen. Auch die VCL löst unter Umständen das Neuzeichnen aus

Einbeliebigername.
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#6

AW: Annäherung an Pi mit Monte carlo, paintbox

  Alt 19. Jan 2012, 14:23
Nenenenene..

Also es liegt daran, weil deine Paintbox nicht quadratisch ist (die Positionierung hat damit also nichts zu tun, sondern die Dimensierung)

Mach einfach folgendes irgendwo zu Beginn der Anwendung (FormCreate)
Delphi-Quellcode:
  PaintBox1.Width := 250;
  PaintBox1.Height := PaintBox1.Width;
Edit (Erklärung, warum):
Zitat:
   if (sqrt(x*x+y*y) < 200) then
Heißt soviel wie, wenn die Länge des Richtungsvektors A (x, y) (x, y relativ zum Ursprung -> bei der Paintbox ist es die linke obere Ecke) < 200, dann markiereden Pixel bei aX, aY rot, sonst grün.

200 ist dein Radius. Wenn du eine Paintbox benützen willst, die nicht quadratisch ist (was ja, wenn man ein Kreis "einzeichnen" will, sinnlos ist), dann müsstest statt 200 die kleinere Dimensionskomponente der Paintbox nehmen - sei es nun Width oder Height -> damit der ganze Kreis anschließend auch sichtbar wird!
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG

Geändert von Aphton (19. Jan 2012 um 14:26 Uhr)
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#7

AW: Annäherung an Pi mit Monte carlo, paintbox

  Alt 19. Jan 2012, 15:33
Mal was ganz Grundsätzliches

Eine Paintbox ist eine flüchtige Zeichenfläche.
Sobald eine Paintbox durch ein anderes Fenster überdeckt und wieder aufgedeckt wird,
ist der aufgedeckte Bereich "kaputt".

Will man eine TPainbox für die Ausgabe von Monte Carlo Punkten verwenden
muss man alle bisherigen Punkte in einem Array oder Liste zwischenspeichern.
Wenn dann das OnPaint-Event ausgelöst wird, muss man alle Punkte aus dem Array neu zeichnen.

Die Lösung von DeddyH geht auch in Ordnung; nur bekommt man nach jedem Aufdecken eine
neue Punktewolke.

Will man diesen Aufwand nicht betreiben sollte man TImage für die Ausgabe verwenden.
Andreas
  Mit Zitat antworten Zitat
Borgschüler

Registriert seit: 6. Sep 2007
20 Beiträge
 
#8

AW: Annäherung an Pi mit Monte carlo, paintbox

  Alt 19. Jan 2012, 18:03
Hallo!

Also das komische ist, ich seh kein fenster das über der paintbox auch nur kurz sein könnte. Zudem wird ja erst durch den button klick gezeichnet.

Ich habe jetzt das selbe problem bei einem sierpinski dreieck, man sieh wenn überhaupt nur 3 pixel und wenn ich den befehl paintbox1.repaint gebe, dann flackern die drei punkte einfach nur!

in der schule (windows xp) hats die probleme nie gegeben...

überhaupt versteh ich hier die meisten vorschläge nicht, kann mir einer bitte sagen wie ich das mit deiner paintbox hinbekomme und nicht mit einem image, weil das wird bei mir vom lehrer verlangt...
  Mit Zitat antworten Zitat
einbeliebigername

Registriert seit: 24. Aug 2004
140 Beiträge
 
Delphi XE8 Professional
 
#9

AW: Annäherung an Pi mit Monte carlo, paintbox

  Alt 19. Jan 2012, 19:51
Hallo,
Also das komische ist, ich seh kein fenster das über der paintbox auch nur kurz sein könnte.
Muss ja auch kein Fenster darüber sein. Eine Aufforderung von Windows reicht aus damit sich die PaintBox neuzeichnet.

Ich habe jetzt das selbe problem bei einem sierpinski dreieck, man sieh wenn überhaupt nur 3 pixel und wenn ich den befehl paintbox1.repaint gebe, dann flackern die drei punkte einfach nur!
Wie sieht denn da jetzt der Sourcecode aus?

in der schule (windows xp) hats die probleme nie gegeben...
Unter welchem Betriebssystem arbeitest du denn jetzt? Und mit welcher Delphi-Version?

überhaupt versteh ich hier die meisten vorschläge nicht, kann mir einer bitte sagen wie ich das mit deiner paintbox hinbekomme und nicht mit einem image, weil das wird bei mir vom lehrer verlangt...
Was hat euch den der Lehrer gezeigt, wie ihr mit der Paintbox arbeiten sollt? Er wird euch doch mal Beispiel-Sourcecode gezeigt haben.


Einbeliebigername.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#10

AW: Annäherung an Pi mit Monte carlo, paintbox

  Alt 19. Jan 2012, 20:02
Wenn dann das OnPaint-Event ausgelöst wird, muss man alle Punkte aus dem Array neu zeichnen.
Üblicherweise zeichnet man aber auf ein Bitmap im Speicher und kopiert es bei Bedarf auf die Zeichenfläche.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:30 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz