![]() |
"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:
Leider hänge ich erstmal an den Zeilen
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;
Delphi-Quellcode:
und
FArmAngle := (360 / m_nArms) mod 360;
Delphi-Quellcode:
Und vermutlich findet ihr noch tausend andere Fehler die bei hierbei gemacht habe... ^^
fA := (Random mod m_nArms) * fArmAngle;
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 :-) |
AW: "Making Galaxies" von C++ nach Delphi
Delphi-Quellcode:
ist wohl eher
fA := (Random mod m_nArms) * fArmAngle;
Delphi-Quellcode:
wenn ich mir
fA := Random(nArms) * fArmAngle;
![]() |
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:
hinbekomme ohne eine exception aus zu werfen :|
(360 / m_nArms) mod 360
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 |
AW: "Making Galaxies" von C++ nach Delphi
anstatt
Delphi-Quellcode:
lieber
(360 / m_nArms) mod 360
Delphi-Quellcode:
:)
(360 div m_nArms) mod 360
Edit:
Delphi-Quellcode:
würde ich genau so machen wie du es hast
rand()&1 ? 1 : -1
Delphi-Quellcode:
Aber mir fällt grad auf dass da ein & statt % steht, is das ein Tippfehler, oder muss da wirklich & hin?
if random(2)=0 then fQ := FRandom(0.0, fAngularSpread)
else fQ := - FRandom(0.0, fAngularSpread); |
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);
|
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:
SIEHE ANHANG
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; |
AW: "Making Galaxies" von C++ nach Delphi
Lies dir mal die Hilfe zu Randomize durch.
Außerdem gibst du das Bitmap nicht mehr frei. |
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 :) |
AW: "Making Galaxies" von C++ nach Delphi
Das Problem ist, dass du
Delphi-Quellcode:
viel zu oft aufrufst.
randomize
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; |
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 10:19 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 by Thomas Breitkreuz