Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi "Making Galaxies" von C++ nach Delphi (https://www.delphipraxis.net/159197-making-galaxies-von-c-nach-delphi.html)

stho 17. Mär 2011 17:36

"Making Galaxies" von C++ nach Delphi
 
Hallo Leute

Ich habe mir schon länger mal vorgenommen den Code hier
"http://www.gamedev.net/page/resources/_/reference/programming/game-programming/300/making-galaxies-r1337"
in Delphi nach zu bauen... Leider bin ich wohl ein bisschen zu blöd dafür xD

Das hier ist der Orriginal-Code in C++ (müsste glaube C++ sein, ich lasse mich aber gerne korrigieren ^^)

Code:
float fArmAngle = (float)((360 / m_nArms)%360);
float fAngularSpread = 180/(m_nArms*2);

for ( int i = 0; i < nStars; i++ )
{
  float fR = fRandom(0.0, fRadius);
  float fQ = fRandom(0.0, fAngularSpread ) * (rand()&1 ? 1 : -1);
  float fK = 1;

  float fA = (rand() % m_nArms) * fArmAngle;

  float fX = fR * cos( fDeg2Rad * ( fA + fR * fK + fQ ) );
  float fY = fR * sin( fDeg2Rad * ( fA + fR * fK + fQ ) );

  //... draw star at point fX,fY
}

und das habe ich bisher in Delphi gebaut...


Delphi-Quellcode:
procedure TForm2.FormCreate(Sender: TObject);

  // Hier Danke nochmal an Uwe Raabe :)
  function FRandom(fStart, fEnd: Extended): Extended;
  begin
    randomize;
    result := fStart + (fEnd - fStart) * Random;
  end;

const
  m_nArms = 3;
  nStars = 2000;
  fRadius = 500;
var
  FArmAngle     : Extended;
  FAngularSpread : Extended;
  I: Integer;
  fQ, fK, fR, fA, fX, fY : Extended;
  aBMP : TBitmap;
begin

  aBMP := TBitmap.Create;
  aBMP.Width := 1000;
  aBMP.Height:= 1000;

  FArmAngle     := (360 /  m_nArms) mod 360;
  FAngularSpread := 180 / (m_nArms * 2);


  for I := 1 to nStars do
  begin
    fR := FRandom(0.0, fRadius);
    fK := 1;

    if random(2)=0 then fQ := FRandom(0.0, fAngularSpread) * 1
    else               fQ := FRandom(0.0, fAngularSpread) * -1;

    fA := (Random mod m_nArms) * fArmAngle;
    fX := fR * cos( DegToRad ( fA + fR * fK + fQ ) );
    fY := fR * sin( DegToRad ( fA + fR * fK + fQ ) );

    aBMP.Canvas.Pixels[Round(FX)+ aBMP.Width div 2,Round(FY) + aBMP.Height div 2] := clBlack;
  end;
  aBMP.SaveToFile('C:\Test.bmp');
end;
Leider hänge ich erstmal an den Zeilen

Delphi-Quellcode:
FArmAngle     := (360 /  m_nArms) mod 360;
und
Delphi-Quellcode:
fA := (Random mod m_nArms) * fArmAngle;
Und vermutlich findet ihr noch tausend andere Fehler die bei hierbei gemacht habe... ^^
naja, gibt es eine möglichkeit die beiden abgebildeten zuweisungen irgendwie anders zu realisieren?
Oder hat jemand genug C++ erfahrung um das zu erklären?
damit währe mir ja schon viel geholfen :-)

TonyR 17. Mär 2011 17:47

AW: "Making Galaxies" von C++ nach Delphi
 
Delphi-Quellcode:
fA := (Random mod m_nArms) * fArmAngle;
ist wohl eher
Delphi-Quellcode:
fA := Random(nArms) * fArmAngle;
wenn ich mir rand() in C++ so ansehe.

stho 17. Mär 2011 17:52

AW: "Making Galaxies" von C++ nach Delphi
 
:?
da merk ich mal wieder das ich von C++ nix verstehe... habe mich zwar schlau gelesen aber auf DAS kam ich nicht...

Ich vertrau dir einfach mal das du recht hast :P
jetzt muss ich mir nur noch ein köpfchen machen wie ich das

Delphi-Quellcode:
(360 /  m_nArms) mod 360
hinbekomme ohne eine exception aus zu werfen :|

Danke schonmal :thumb:


EDIT:
Wobei, ist die Übersetzung des Teils
(rand()&1 ? 1 : -1)
eigentlich richtig?
Ich bin mir da nämlich nicht sicher xD

TonyR 17. Mär 2011 18:01

AW: "Making Galaxies" von C++ nach Delphi
 
anstatt
Delphi-Quellcode:
(360 / m_nArms) mod 360
lieber
Delphi-Quellcode:
(360 div m_nArms) mod 360
:)

Edit:
Delphi-Quellcode:
rand()&1 ? 1 : -1
würde ich genau so machen wie du es hast
Delphi-Quellcode:
    if random(2)=0 then fQ := FRandom(0.0, fAngularSpread)
    else fQ := - FRandom(0.0, fAngularSpread);
Aber mir fällt grad auf dass da ein & statt % steht, is das ein Tippfehler, oder muss da wirklich & hin?

Medium 17. Mär 2011 19:04

AW: "Making Galaxies" von C++ nach Delphi
 
Bei % müsste die 1 eine 2 sein um den selben Effekt zu erwirken ;).
Das als Einzeiler (Unit Math nicht vergessen):
Delphi-Quellcode:
fQ := IfThen(Random(2)=0, 1, -1) * FRandom(0.0, fAngularSpread);

stho 18. Mär 2011 05:52

AW: "Making Galaxies" von C++ nach Delphi
 
Liste der Anhänge anzeigen (Anzahl: 1)
Irgendwie kommt noch immer nicht das raus, was raus kommen soll >___<
hm... weiß jemand von euch wo jetzt der Fehler liegt?


Delphi-Quellcode:
  Procedure Func1;
    function FRandom(fStart, fEnd: Extended): Extended;
    begin
      randomize;
      result := fStart + (fEnd - fStart) * Random;
    end;

  const
    m_nArms = 3;
    nStars = 20000;
    fRadius = 800;
  var
    FArmAngle     : Extended;
    FAngularSpread : Extended;
    I: Integer;
    fQ, fK, fR, fA, fX, fY : Extended;
    aBMP : TBitmap;
  begin

    aBMP := TBitmap.Create;
    aBMP.Width := 4000;
    aBMP.Height:= 4000;

    FArmAngle     := (360 div m_nArms) * 360;// (360 /  m_nArms) mod 360;
    FAngularSpread := 180 / (m_nArms * 2);


    for I := 1 to nStars do
    begin
      fR := FRandom(0.0, fRadius);
      fK := 1;

      fQ := IfThen(Random(2)=0, 1, -1) * FRandom(0.0, fAngularSpread);

      fA := (Random(m_nArms)+1) * fArmAngle; //(Random mod m_nArms) * fArmAngle;
      fX := fR * cos( DegToRad ( fA + fR * fK + fQ ) );
      fY := fR * sin( DegToRad ( fA + fR * fK + fQ ) );

      aBMP.Canvas.Pixels[Round(FX) + aBMP.Width div 2,
                         Round(FY) + aBMP.Height div 2] := clBlack;
    end;
    DeleteFile('C:\Test.bmp');
    aBMP.SaveToFile('C:\Test.bmp');
  end;
SIEHE ANHANG

Luckie 18. Mär 2011 06:16

AW: "Making Galaxies" von C++ nach Delphi
 
Lies dir mal die Hilfe zu Randomize durch.

Außerdem gibst du das Bitmap nicht mehr frei.

stho 18. Mär 2011 08:44

AW: "Making Galaxies" von C++ nach Delphi
 
Ja, da hast du recht.
Das BMP gebe ich nicht frei... Aber für die Auftretenden Probleme oder das Ausbleiben des gewünschten Ergebnisses ist dies in meinen Augen unerheblich.
Doch selbst das Nutzen der Randomize-Funktion bringt keine Veränderung in der Rnd-Darstellung... (Siehe Anhang)

Die Funktion bildet zwar eine schöne Linie, jedoch nicht das Resultat was eigentlich erwartet werden würde.
Außerdem wird immer mit 2 Arm gezeichnet was ein bisschen komisch wirkt.
(Unabhängig davon mit welchem Wert ich diese Funktion "füttere")


EDIT:
Ein bisschen Rechtschreibfehler beseitigt, damit das den Text lesen kann ohne Augenkrebs zu bekommen :)

implementation 18. Mär 2011 11:58

AW: "Making Galaxies" von C++ nach Delphi
 
Das Problem ist, dass du
Delphi-Quellcode:
randomize
viel zu oft aufrufst.
Du solltest es nur einmal am Anfang aufrufen und später nicht mehr:
Delphi-Quellcode:
 Procedure Func1;
    function FRandom(fStart, fEnd: Extended): Extended;
    begin
      result := fStart + (fEnd - fStart) * Random;
    end;

  const
    m_nArms = 3;
    nStars = 20000;
    fRadius = 800;
  var
    FArmAngle : Extended;
    FAngularSpread : Extended;
    I: Integer;
    fQ, fK, fR, fA, fX, fY : Extended;
    aBMP : TBitmap;
  begin
    randomize;
    ...
  end;

stho 18. Mär 2011 12:31

AW: "Making Galaxies" von C++ nach Delphi
 
Danke für deine Antwort ;-)
Aber genau das habe ich in meinem Code schon versucht. Leider hat dies keinen erfolg :(


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