Einzelnen Beitrag anzeigen

mabstudent

Registriert seit: 13. Nov 2010
23 Beiträge
 
#1

Programm zur Bestimmung von PI - Schleife auf Knopfdruck abbrechen, aber wie?

  Alt 13. Nov 2010, 15:13
Hallo zusammen,

Ich bin schon seit längerem in eurem Forum unterwegs und bisher mit der Suche ausgekommen, doch dieses mal reicht sie mir leider nicht ganz.
Vorab tut es mir leid dass ich euch das Problem nur aus der Sicht eines Maschinenbaustudenten, der ein Pflichtsemester Informatik absolvieren muss, darstellen kann.


Aufgabe ist folgende:

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


Meine Teilaufgaben sind:
1. Imagefeld erzeugen
2. Viertelkreis mit r=300 darauf zeichnen, Mittelpunkt(0,0)
3. auf Knopfdruck Pixelregen starten
4. auf Knopfdruck Pixelregen stoppen
5. Pixel die zufällig im Viertelkreis landen eine Farbe geben z.B. blau
6. Pixel die außerhalb des Viertelkreises landen eine andere Farbe geben z.B. rot
7. PI ist das Verhältnis der im Viertelkreis liegenden Pixel zu der Gesamtheit der Pixel (PI soll eine 12-stellige Genauigkeit haben)

Mein Struktogramm dazu: siehe Anhang
Mein bisheriger Quelltext:

Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Image1: TImage;
    Button1: TButton;
    Button2: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    BitBtn1: TBitBtn;
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);

  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  b,h,x,y,u,i:integer;


implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
application.ProcessMessages;
u:=0;
Randomize();
image1.Canvas.Brush.color:=clwhite;
image1.Canvas.FillRect(Rect(0,0,b,h));
image1.Canvas.MoveTo(0,300);

  FOR x:=0 TO 300 DO //Viertelkreis zeichnen
    begin
    y:=trunc(sqrt((300*300)-(x*x)));
    image1.canvas.LineTo(x,y);
    end;

end;

procedure TForm1.Button1Click(Sender: TObject); //Zufallszahlen grafisch ausgeben

begin
  application.processmessages; //damit die Anwendung nicht hakt
  FOR i:=0 TO u:=1 DO //lass die Schleife laufen bis u:=1 ist
  x:=random(300); //zufallszahlen erzeugen von 0-300
  y:=random(300);
  IF (sqrt((x*x)+(y*y))<=300) //wurzel aus x^2+y^2 entspricht dem radius des VK
  THEN image1.canvas.pixels[x,y]:=clblue
  ELSE image1.Canvas.Pixels[x,y]:=clred;
end;

end;



procedure TForm1.Button2Click(Sender: TObject);
begin
u:=1;
end;

end.

Folgende Probleme treten hierbei auf:

1. Wie kann ich die Schleife welche Zufallszahlen erzeugt und diese als Pixel auf das Image regnen lässt solange laufen lassen bis ich einen Knopf drücke, der es stoppt?
2. Wie lautet der richtige Quellcode für die Berechnung von PI:=((4*Viertelkreispixel)/Gesamtzahlpixel)? Anders gefragt: Welche Typen müssen die Variablen haben?
Miniaturansicht angehängter Grafiken
pi.png  
  Mit Zitat antworten Zitat