AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Grafische Ausgabe von Zufallszahlen, Bestimmung von PI nach der Monte-Carlo-Methode
Thema durchsuchen
Ansicht
Themen-Optionen

Grafische Ausgabe von Zufallszahlen, Bestimmung von PI nach der Monte-Carlo-Methode

Ein Thema von hamptoncourt · begonnen am 20. Nov 2010 · letzter Beitrag vom 21. Nov 2010
Antwort Antwort
hamptoncourt

Registriert seit: 20. Nov 2010
34 Beiträge
 
#1

Grafische Ausgabe von Zufallszahlen, Bestimmung von PI nach der Monte-Carlo-Methode

  Alt 20. Nov 2010, 13:50
Hallo,

ich habe keine Ahnung, ob ich hier jetzt mit meiner Frage am richtigen Ort gelandet bin. Bin noch neu hier.

Im laufe meines Studiums haben wir jetzt auch das Fach Informatik bekommen, bei dem unser Professor ganz getreu dem Motto arbeitet: "Ich erkläre nix und die Studenten haben es selbst sofort zu wissen." Daher bin ich mit einer neuen Praktikumsaufgabe etwas überfordert *lol* Ich versuche zwar in diversen Büchern dazu etwas zu finden, aber parallel hoffe ich auch hier einige Anregungen zu bekommen.

Zu dem Programm (Ich zitiere einfach mal die Aufgabenstellung):
Grafische Ausgabe von Zufallszahlen, Bestimmung nach der Monte-Carlo Methode

Auf ein quadratisches Imagefeld der Kantenlänge 300 Pixel ist beim Programmstart ein schwarzer Viertelkreis mit dem Mittelpunkt an der Ecke (0,0) und dem Radius von 300 Pixeln aus 100 Geradenstücken zu zeichnen.

Auf Knopfdruck des Startknopfes läßt das Programm nun Punkte als Pixel auf das Imagefeld "regnen". Dabei werden die Koordinatenwerte (x und y), welche die jeweilige Pixelposition bestimmen, vom Zufallszahlengenerator ermittelt. Pixel, die innerhalb des Viertelkreise liegen, werden in blauer Farbe gezeichnet, die außerhalb in roter Farbe.

Ein Stoppknopf unterbricht das Erzeugen der Punkte. Aus dem Verhältnis der Punkte im Quadrat und der Punkte im Viertelkreis wird dann die Zahl PI berechnet und auf ein Label mit 12 Dezimalstellen ausgegeben.
Zusätzlich wird der Prozentsatz der Abweichung des ermittelten Wertes von der Delphi-Konstante PI ermittelt und auf einem weiteren Label mit 3 Dezimalstellen und dem %-Zeichen dahinter ausgegeben.

Ein dritter Knopf beendet das Programm.


Soweit so gut .... ich weiß schon, wie ich den Kreis zeichne und so. Bei den Pixeln habe ich eine Ahnung, bin für Anregungen aber offen. Aber wie soll das mit dem Verhältnis funktionieren??? Das ist mir irgendwie schleierhaft. Man kann doch einfach sagen: Alle roten Punkte summieren zu wert1, alle blauen Punkte summieren zu wert2, oder???

Ich habe irgendwie dazu noch nicht so wirklich was gefunden. Ich bin für jede Anregung also dankbar ...

greetz ... hamptoncourt
  Mit Zitat antworten Zitat
aurikel_Max

Registriert seit: 9. Okt 2009
86 Beiträge
 
#2

AW: Grafische Ausgabe von Zufallszahlen, Bestimmung von PI nach der Monte-Carlo-Metho

  Alt 20. Nov 2010, 13:54
ehm .. jetzt nur mal ganz spontan - du überprüfst ja beim Zeichnen, ob der Punkt innerhalb oder außerhalb des Feldes ist (und zeichnest entsprechend rot bzw. blau) - an dieser Stelle kannst du doch einfach 2 Variablen hochzählen lassen.

Edit: Ehm, solltest du das mit den Pixeln noch nicht haben, hier mal ein paar allgemeine Ideen:
-du erzeugst ja 2 Zufallswerte: den X- bzw. Y-Wert
-jetzt guckst du, ob die Werte auf dem Kreis liegen (keine Ahnung, was an dem Punkt geschehen soll) // das könnte man bestimmt i-wie rechnerisch machen, aber du kannst doch bestimmt auch einfach gucken, ob die der Pixel zu der Koordinate schwarz ist (schwarz = Farbe des Kreises)
-ansonsten musst du noch überprüfen, ob der Punkt innerhalb des Kreises // bzw. außerhalb des Kreises liegt - das kann man bestimmt auch mathematisch machen (geht das nicht mit der Kreisgleichung, in die man dann einen Punkt einsetzt? - bin mir aber gerade nicht sicher und mit den Gedanken auch nicht ganz anwesend)
Max

Geändert von aurikel_Max (20. Nov 2010 um 14:01 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#3

AW: Grafische Ausgabe von Zufallszahlen, Bestimmung von PI nach der Monte-Carlo-Metho

  Alt 20. Nov 2010, 13:55
Vielleicht hilft dir das hier:

http://www.delphipraxis.net/155927-p...-aber-wie.html
http://www.delphipraxis.net/156029-v...-zeichnen.html

Alles schon mal da gewesen
  Mit Zitat antworten Zitat
hamptoncourt

Registriert seit: 20. Nov 2010
34 Beiträge
 
#4

AW: Grafische Ausgabe von Zufallszahlen, Bestimmung von PI nach der Monte-Carlo-Metho

  Alt 21. Nov 2010, 14:32
hey ... danke für die schnellen Antworten und sorry für meine späte reaktion ... habe derzeit 3 Projektarbeiten am laufen und das zerrt ganz schön auf die Nerven ....

Die Tips in dem anderen Thema sind schon echt gut ... allerdings (auch wenn ich jetzt Gefahr laufe, als vollkommener Trottel da zu stehen) verstehe ich nicht alles davon *lol*

Also ich habe es hinbekommen, das der Kreis gezeichnet wird und auch die Pixel darauf regnen, auch in Farbe ... aber jetzt hinke ich etwas hinterher ...

Die arbeiten dort mit der Variablen Abbr. Am Anfang steht Abbr := false und beim klicken auf den Stop Button soll diese auf True gesetzt werden ... soweit verständlich .... aber als was muss ich die Variable zuvor festlegen???

var Abbr : ???;

begin
Abbr := false;
While Not Abbr Do
begin .....

Aphton hat da zwar ein schönes funktionierendes Programm angehängt, aber aus dem Quelltext werd ich nicht wirklich schlau :-/

Dann noch etwas zu dem Zählen ... dort wird vorgeschlagen, man solle da mit einer Liste arbeiten ... allerdings ist in unserer Aufgabe festgelegt, welche Objekte wir in unserem Form einfügen fürfen. Das beschränkt sich dann auf
1 Imagefeld
3 Buttons (Start / Stop / Schließen)
2 Labels (Errechneter Wert von PI und prozentuale Abweichung von der Delphi Konstanten für PI)

Kann man in die Schleife zum Zeichnen der Pixel nicht gleich eine Zählstruktur einbauen??? Sowas wie:
zahl_rot := zahlrot + 1

Hoffe ihr könnt mir da nochmal helfen ...
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Grafische Ausgabe von Zufallszahlen, Bestimmung von PI nach der Monte-Carlo-Metho

  Alt 21. Nov 2010, 14:55
Zum reinen Berechnen von PI benötigst du doch einfach nur die Anzahl der bisher erzeugten Punkte und die Anzahl der Punkte, die im Kreissegment liegen.

Mal PseudoCode:
Code:
// Erst die Berechnung

ZufallsPunkt erzeugen
AnzahlAllerPunkte um 1 erhöhen
Merken ob der ZufallsPunkt im Kreissegment liegt in PunktImSegment
Ist PunktImSegment dann
  AnzahlPunkteImSegment um 1 erhöhen
PInachMC ist jetzt AnzahlPunkteImSegment / AnzahlAllerPunkte * 4

// Jetzt kommt die Ausgabe

Schreibe PInachMC in ein Label
Ist PunktInSegment dann
  Zeichne ZufallsPunkt in rot
sonst
  Zeichne ZufallsPunkt in blau
Noch was zur Liste mit den Werten:

1. Diese wird NICHT auf der Form erzeugt, ist also durchaus verwendbar für dich

2. Die Liste ist für die reine Berechnung NICHT erforderlich
Für ein Protokoll oder die Anzeige kann diese aber benötigt werden.
Wenn der Anzeige-Bereich vergrößert wird, dann muss das Bild neu gezeichnet werden und dazu benötigt man halt alle Punkte, die bisher ermittelt wurden.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (21. Nov 2010 um 15:12 Uhr)
  Mit Zitat antworten Zitat
hamptoncourt

Registriert seit: 20. Nov 2010
34 Beiträge
 
#6

AW: Grafische Ausgabe von Zufallszahlen, Bestimmung von PI nach der Monte-Carlo-Metho

  Alt 21. Nov 2010, 15:11
Ja, das habe ich auch so verstanden und hätte es auch so gemacht ... immer um eins erhöhen und dann zum Schluss dann mit der Formel nach MC ...

Aber mein großes Problem ist halt nur, dass er einfach nicht mit der Schleife aufhört .... hatte jetzt gedacht, ich versuche es mit einem Wert u ... solange u=0 ist, soll der die Schleife machen und beim Klick auf den Stop Button wird u=1 ... aber irgendwie funktioniert das auch nicht. Der sagt mir dann als Fehler das u zwar existiert, jedoch nie benutzt wird ... häää???? *lol* komische geschichten hier ....
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Grafische Ausgabe von Zufallszahlen, Bestimmung von PI nach der Monte-Carlo-Metho

  Alt 21. Nov 2010, 15:22
Delphi-Quellcode:
procedure foo;
var
  u : integer;
begin
  u := 0;
  repeat

  until u = 25;
end;

procedure anotherfoo;
var
  u : integer;
begin
  u := 25;
end;
Das Problem ist, diese beiden Variablen u haben eine lokale Gültigkeit und wissen absolut nichts voneinander! Du würdest hier eine Variable benötigen mit einem größeren Gültigkeitsbereich.
Delphi-Quellcode:
var
  u : integer;
procedure foo;
begin
  u := 0;
  repeat

  until u = 25;
end;

procedure anotherfoo;
begin
  u := 25;
end;
Problematisch ist hierbei jetzt nur noch, dass wenn die procedure foo arbeitet man so keine Möglichkeit hat, von aussen die procedure anotherfoo aufzurufen.

Hier ein kleines Beispiel, wie so eine simple Abbruchbedingung in einer Form mit Buttons realisert werden kann
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class( TForm )
    btnAbbruch: TButton;
    btnStart: TButton;
    procedure btnAbbruchClick( Sender : TObject );
    procedure btnStartClick(Sender: TObject);

  private
    { Private-Deklarationen }
    Abbruch : Boolean;

  public
    { Public-Deklarationen }
  end;

var
  Form1 : TForm1;

implementation

{$R *.dfm}

procedure TForm1.btnAbbruchClick( Sender : TObject );
  begin
    Abbruch := True;
  end;

procedure TForm1.btnStartClick(Sender: TObject);
begin
  Abbruch := False;
  while not Abbruch do
  begin
    // ganz tolle Berechnung

    // Der Anwendung die Möglichkeit geben anstehende Ereignisse abzuarbeiten
    Application.ProcessMessages;
  end;
end;

end.
Application.ProcessMessages ist hierbei einer der Schlüssel, denn ansonsten könntest du auf dem Button btnAbbruch Samba tanzen und es würde trotzdem nichts passieren und abgebrochen schon mal gar nichts.

Dieses ist ein simples Beispiel und eigentlich nicht wirklich schöner Stil.
Die Berechnung sollte innerhalb eines Threads erfolgen, den man sehr schon von aussen abbrechen kann.
Aber das würde die Aufgabe hier extrem sprengen, würde aber im Gegenzug die Trennung von Code und Ausgabe sehr elegant machen.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (21. Nov 2010 um 15:29 Uhr)
  Mit Zitat antworten Zitat
hamptoncourt

Registriert seit: 20. Nov 2010
34 Beiträge
 
#8

AW: Grafische Ausgabe von Zufallszahlen, Bestimmung von PI nach der Monte-Carlo-Metho

  Alt 21. Nov 2010, 16:37
wow ... danke für die ausführliche beschreibung ... das hilft mir auf jeden fall weiter ....

mir viel auch auf, dass u ja immer nur auf diese eine Prozedur beschränkt ist .... ich dummerchen *lol* hatte das dann oben zu den Variablen gesetzt dann funzte es auch ...

aber dein Beispiel ist auch sehr gut. Werde mich auf jeden Fall daran versuchen ... danke dir ...
  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 12:04 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz