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?