![]() |
AW: Annäherung an Pi mit Monte carlo, paintbox
Kann es sein dass die Paintbox auf dem Formular einfach zu klein ist?
Liebe Grüße, Valentin |
AW: Annäherung an Pi mit Monte carlo, paintbox
Vielleicht legt sich kurz ein anderes Fenster drüber. Verschieb das Zeichnen doch mal ins OnPaint der PaintBox, da gehört es ja auch hin. Bei mir wird die Grafik auch korrekt dargestellt.
[edit] Meine Änderungen:
Delphi-Quellcode:
[/edit]
type
TForm1 = class(TForm) PaintBox1: TPaintBox; Button1: TButton; procedure Button1Click(Sender: TObject); procedure PaintBox1Paint(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private-Deklarationen } FPainting: Boolean; public { Public-Deklarationen } end; ... procedure TForm1.Button1Click(Sender: TObject); begin paintbox1.Width := 200; paintbox1.Height := 200; FPainting := not FPainting; PaintBox1.Invalidate; end; procedure TForm1.FormCreate(Sender: TObject); begin randomize; end; procedure TForm1.PaintBox1Paint(Sender: TObject); var i,x,y : integer; begin if FPainting then for i := 1 to 100000 do begin x:= random(200); y:= random(200); if (sqrt(x*x+y*y) < 200) then paintbox1.canvas.pixels[x,y] := clred else paintbox1.canvas.pixels[x,y] := clgreen; end else PaintBox1.Canvas.FillRect(Rect(0, 0, PaintBox1.Width, PaintBox1.Height)); end; |
AW: Annäherung an Pi mit Monte carlo, paintbox
Liste der Anhänge anzeigen (Anzahl: 3)
Liebe Leute, je nach dem wo die paintbox platziert ist, ist ein anderer teil zu sehn, bzw an einer stelle sieht man wirklich ein perfektes quadrat! aber seht selbst.
Wie kann das bitte sein? geht garnicht in meinen kopf! ich werde jetzt die pi berechnung durchführen, und dann das ergebnis präsentieren. |
AW: Annäherung an Pi mit Monte carlo, paintbox
Hallo,
Zitat:
Zitat:
Zitat:
Delphi-Quellcode:
immer wieder andere Werte liefert, würde bei jedem neuzeichnen sich das Bild ändern. Dann dauert ein Neuzeichnen wegen
random(200)
Delphi-Quellcode:
auch etwas länger. Und ich denkt der TE ist mit dem Algorithmus auch noch nicht fertig. Es ist ja erst mal nur die Visualisierung. Da fehlt ja noch das Ausrechnen von PI.
for i := 1 to 100000 do
Zitat:
Einbeliebigername. |
AW: Annäherung an Pi mit Monte carlo, paintbox
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); |
AW: Annäherung an Pi mit Monte carlo, paintbox
Zitat:
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! |
AW: Annäherung an Pi mit Monte carlo, paintbox
Hallo,
Zitat:
Delphi-Quellcode:
(bzw.
paintbox1.Invalidate;
Delphi-Quellcode:
kannst du auch mal ausprobieren) hin. Und dann schreib hier mal was passiert und was du denkst wieso.
paintbox1.Repaint;
Einbeliebigername. |
AW: Annäherung an Pi mit Monte carlo, paintbox
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! |
AW: Annäherung an Pi mit Monte carlo, paintbox
Hallo,
Zitat:
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. |
AW: Annäherung an Pi mit Monte carlo, paintbox
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:
Edit (Erklärung, warum):
PaintBox1.Width := 250;
PaintBox1.Height := PaintBox1.Width; Zitat:
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! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:54 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