AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi "Making Galaxies" von C++ nach Delphi
Thema durchsuchen
Ansicht
Themen-Optionen

"Making Galaxies" von C++ nach Delphi

Ein Thema von stho · begonnen am 17. Mär 2011 · letzter Beitrag vom 18. Mär 2011
Antwort Antwort
stho

Registriert seit: 16. Sep 2009
Ort: 127.0.0.1
288 Beiträge
 
Delphi 2007 Professional
 
#1

"Making Galaxies" von C++ nach Delphi

  Alt 17. Mär 2011, 18:36
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

FArmAngle := (360 / m_nArms) mod 360; und
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
  Mit Zitat antworten Zitat
Benutzerbild von TonyR
TonyR

Registriert seit: 17. Jun 2006
Ort: Bautzen
503 Beiträge
 
FreePascal / Lazarus
 
#2

AW: "Making Galaxies" von C++ nach Delphi

  Alt 17. Mär 2011, 18:47
fA := (Random mod m_nArms) * fArmAngle; ist wohl eher fA := Random(nArms) * fArmAngle; wenn ich mir rand() in C++ so ansehe.
Es ist unmöglich, witzig zu sein ohne ein bisschen Bosheit. Die Bosheit eines guten Witzes ist der Widerhaken, der ihn haften lässt. - Georg Christoph Lichtenberg
  Mit Zitat antworten Zitat
stho

Registriert seit: 16. Sep 2009
Ort: 127.0.0.1
288 Beiträge
 
Delphi 2007 Professional
 
#3

AW: "Making Galaxies" von C++ nach Delphi

  Alt 17. Mär 2011, 18:52

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
jetzt muss ich mir nur noch ein köpfchen machen wie ich das

(360 / m_nArms) mod 360 hinbekomme ohne eine exception aus zu werfen

Danke schonmal


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

Geändert von stho (17. Mär 2011 um 18:57 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von TonyR
TonyR

Registriert seit: 17. Jun 2006
Ort: Bautzen
503 Beiträge
 
FreePascal / Lazarus
 
#4

AW: "Making Galaxies" von C++ nach Delphi

  Alt 17. Mär 2011, 19:01
anstatt (360 / m_nArms) mod 360 lieber (360 div m_nArms) mod 360

Edit: 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?
Es ist unmöglich, witzig zu sein ohne ein bisschen Bosheit. Die Bosheit eines guten Witzes ist der Widerhaken, der ihn haften lässt. - Georg Christoph Lichtenberg

Geändert von TonyR (17. Mär 2011 um 19:07 Uhr)
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#5

AW: "Making Galaxies" von C++ nach Delphi

  Alt 17. Mär 2011, 20:04
Bei % müsste die 1 eine 2 sein um den selben Effekt zu erwirken .
Das als Einzeiler (Unit Math nicht vergessen):
fQ := IfThen(Random(2)=0, 1, -1) * FRandom(0.0, fAngularSpread);
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
stho

Registriert seit: 16. Sep 2009
Ort: 127.0.0.1
288 Beiträge
 
Delphi 2007 Professional
 
#6

AW: "Making Galaxies" von C++ nach Delphi

  Alt 18. Mär 2011, 06:52
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
Miniaturansicht angehängter Grafiken
unbenannt.jpg  
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7

AW: "Making Galaxies" von C++ nach Delphi

  Alt 18. Mär 2011, 07:16
Lies dir mal die Hilfe zu Randomize durch.

Außerdem gibst du das Bitmap nicht mehr frei.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
stho

Registriert seit: 16. Sep 2009
Ort: 127.0.0.1
288 Beiträge
 
Delphi 2007 Professional
 
#8

AW: "Making Galaxies" von C++ nach Delphi

  Alt 18. Mär 2011, 09:44
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

Geändert von stho (18. Mär 2011 um 11:38 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von implementation
implementation

Registriert seit: 5. Mai 2008
940 Beiträge
 
FreePascal / Lazarus
 
#9

AW: "Making Galaxies" von C++ nach Delphi

  Alt 18. Mär 2011, 12:58
Das Problem ist, dass du 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;
  Mit Zitat antworten Zitat
stho

Registriert seit: 16. Sep 2009
Ort: 127.0.0.1
288 Beiträge
 
Delphi 2007 Professional
 
#10

AW: "Making Galaxies" von C++ nach Delphi

  Alt 18. Mär 2011, 13:31
Danke für deine Antwort
Aber genau das habe ich in meinem Code schon versucht. Leider hat dies keinen erfolg
  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 16:41 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