Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi mehrdimensionale Arrays (https://www.delphipraxis.net/112811-mehrdimensionale-arrays.html)

JackTheRippa 27. Apr 2008 18:04


mehrdimensionale Arrays
 
Hi Leute,

für eine Monte-Carlo-Simulation (= Berechnung von Pi; Monte-Carlo-Algorithmus) will ich Punkte in einem Koordinatensystem zufällig generieren. Die Koordinaten sollen dann in einem Array (dynamisch) gespeichert werden, das ein "Unter-"array mit zwei Indizes hat, um dort jede x und y-Koordinate zu speichern.
Also Array of Array[0..1] of Real oder so.
Wo kann ich das deklarieren und wie greife ich sowohl auf das übergeordnete als auch auf das untergeordnete Array nacheinander zu?

Gruß JTR

mkinzler 27. Apr 2008 18:15

Re: mehrdimensionale Arrays
 
Ich würde mir einen Typ delarieren:

Delphi-Quellcode:
type
    TKord = Record
        x, y, Extended;
    end;

...
   Koordinaten: Array of TKord;
oder
Delphi-Quellcode:
   Koordinaten: Array of Array of Extended;

JackTheRippa 27. Apr 2008 18:28

Re: mehrdimensionale Arrays
 
Also das Prog ohne arrays sieht im moment so aus:

Delphi-Quellcode:
unit mUnit;

interface

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

type
  TForm1 = class(TForm)
    BtStart: TButton;
    EdWdh: TEdit;
    EdTreffer: TEdit;
    EdPi: TEdit;
    ImBild: TImage;
    LaTropfenzahl: TLabel;
    LaTreffer: TLabel;
    LaPi: TLabel;
    Lapii: TLabel;
    Label1: TLabel;
    TiLabel: TTimer;
    BtClear: TButton;
    BtClose: TButton;
    procedure BtStartClick(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure TiLabelTimer(Sender: TObject);
    procedure BtClearClick(Sender: TObject);
    procedure BtCloseClick(Sender: TObject);
  private
    { Private-Deklarationen }
    IMLINKS: Boolean;
    IMRECHTS: Boolean;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.BtStartClick(Sender: TObject);
VAR z, x, y: REAL; i, Treffer, Tropfenzahl, x1, y1: Integer;
begin
 Tropfenzahl:= StrToInt(Edwdh.Text);
 Treffer:=0;
 For i:=1 to Tropfenzahl do
  Begin
   x:=random;
   y:=random;
   x1:=round (x*200);
   y1:=round (y*200);

  IF x*x + y*y <= 1 Then
   Begin
    Treffer:= Treffer + 1;
    ImBild.Canvas.Pixels[x1,y1]:=clred;
   End
    Else
     Begin
     ImBild.Canvas.Pixels[x1,y1]:=clblue;
     End;
   End;

   z:= (Treffer / Tropfenzahl) * 4;
   EdTreffer.Text:=IntToStr(Treffer);
   EdPi.Text:=FloatToStr(z);
   
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
 randomize;
 ImBild.Canvas.Ellipse(-200,200,200,-200);

 IMLINKS:= false;

 IMRECHTS:= true;
  IF IMRECHTS THEN TiLabel.Enabled:=true;

end;

procedure TForm1.TiLabelTimer(Sender: TObject);
begin
    IF IMRECHTS THEN
    Begin
     Label1.Left:= Label1.Left + 1;
    End;
   IF Label1.Left >= 208 THEN
    Begin
     IMRECHTS:=false;
     IMLINKS:=true;
    End;
   IF IMLINKS THEN
    Begin
     Label1.Left:= Label1.Left - 1;
    End;
   IF Label1.Left <= 8 THEN
    Begin
     IMLINKS:=false;
     IMRECHTS:=true;
    End;
end;

procedure TForm1.BtClearClick(Sender: TObject);
begin
 ImBild.Canvas.Rectangle(0,0,200,200);
 ImBild.Canvas.Ellipse(-200,200,200,-200);
 EdWdh.Text:='';
 EdTreffer.Text:='';
 EdPi.Text:='';
end;

procedure TForm1.BtCloseClick(Sender: TObject);
begin
 close
end;

end.

mkinzler 27. Apr 2008 20:03

Re: mehrdimensionale Arrays
 
Delphi-Quellcode:
setLength( Koordinaten, Tropfenanzahl -1);
...

Koordinaten[i].x := x1;
Koordinaten[i].y := y1;

marabu 27. Apr 2008 20:48

Re: mehrdimensionale Arrays
 
Hallo,

ein paar kleine Anmerkungen:

Randomize() beim Ereignis Form.OnActivate() wird mitunter mehrmals aufgerufen - besser man koppelt es an Form.OnCreate().

Statt TKord kann man auch TPoint nehmen.

Warum sollen denn die Koordinaten überhaupt zwischengespeichert werden?

Hier noch ein Muster ohne Wert:

Delphi-Quellcode:
const
  R = 200;

procedure TDemoForm.StartButtonClick(Sender: TObject);
const
  TwoColors: array [Boolean] of TColor = (clBlue, clRed);
var
  z, x, y: Double;
  i, Treffer, Tropfenzahl: Integer;
  isHit: Boolean;
begin
  Tropfenzahl:= StrToInt(Edwdh.Text);
  Treffer:=0;
  for i := 1 to Tropfenzahl do
  begin
    x := Random;
    y := Random;
    isHit := x*x + y*y <= 1;
    Inc(Treffer, Ord(isHit));
    ImBild.Canvas.Pixels[Round(x * R), Round(y * R)] := TwoColors[isHit];
  end;
  z := (Treffer / Tropfenzahl) * 4;
  EdTreffer.Text := IntToStr(Treffer);
  EdPi.Text := FloatToStr(z);
end;
Freundliche Grüße

mkinzler 27. Apr 2008 20:57

Re: mehrdimensionale Arrays
 
Stimmt, an TPoint habe ich nicht gedacht. :oops:


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:08 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