[B3D und B2D] Saturnringe und Sonnensystem

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

 

Krischan

Betreff: [B3D und B2D] Saturnringe und Sonnensystem

BeitragMi, Okt 12, 2005 17:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

ich habe mal ein wenig mit Saturnringen herumgespielt, wen es interessiert:

user posted image
Download Source+GFX

Die Ringe selbst sind ein Sprite mit einer Textur überzogen, die ich mittels Polarkoordinaten aus einem Streifen gebastelt habe. Sicher könnte man das auch anders machen, aber so ist es sauschnell. Den Schatten musste ich allerdings auf die Textur einzeichnen. Man kann übrigens auch durch dieses Miniversum fliegen, Steuerung mit Maus und Pfeiltasten, Speed über Maustasten (links 10x, rechts 20x, beide 200x). Die Tasten 1-5 sind vordefinierte Punkte, die ganz nett aussehen.

Vielleicht bastel ich irgendwann mal das Sonnensystem nach, die benachbarten Sterne, die Milchstrasse, den Kosmos und darüber hinaus Wink Vielleicht mal ne Frage an die Runde zum Schluss: erinnert sich wer noch an David Braben's Frontier (Elite II)? Der hatte doch so eine geniale Funktion gebastelt, wo er 100 Milliarden Sterne in unserer Galaxie mittels eines Algorithmus berechnet hat, so dass immer dieselben Planeten bei rausgekommen sind? Ganz toll fand ich damals die Darstellung der Galaxie, wo man stufenlos rein/rauszoomen konnte bis auf Sternenebene, sah aus wie mit Perlin Noise gemacht.

Hat irgendjemand eine Idee, wie man sowas programmieren könnte? Ich habe es bislang nur geschafft, in 2D mittels archimedischen Spiralen was zu erstellen, was so ähnlich wie eine Spiralgalaxie aussieht.

Screenshot:
user posted image

Code:
BlitzBasic: [AUSKLAPPEN]
Graphics 800,600,32,2

arms=4
stars=100000
radius=25
spread#=70
rotation=1.6

plotgalaxy(stars,arms,radius,spread,wi#,rotation)
Color 255,255,255

While Not KeyDown(1)
Wend

End

Function plotgalaxy(stars,arms,radius,spread#,wi#,rotation)
Repeat
px=px+plotarm(stars,arms,radius,spread#,wi#,rotation)
wi#=wi#+(360/arms)
Until wi#=>360
Return px
End Function

Function plotarm(stars,arms,radius,spread#,angle,rotation)
For i=1 To (stars/arms)
fR#=Rnd(0,radius)^1.5+Rnd(-spread#,spread#)
fQ#=Rnd(0,spread)
If Rnd(0,1)>.5 Then fQ#=-fQ#
fK#=rotation
fX#=fR#*Cos(angle+fR#*fK#+fQ#)
fY#=fR#*Sin(angle+fR#*fK#+fQ#)
col#=255
Color col#,col#,col#
Plot(400+fX#,300+fY#)
px=px+1
Next
Return px
End Function
  • Zuletzt bearbeitet von Krischan am Sa, Okt 15, 2005 11:20, insgesamt einmal bearbeitet
 

Knartz

BeitragFr, Okt 14, 2005 13:02
Antworten mit Zitat
Benutzer-Profile anzeigen
super !

schade nur, dass der schatten nicht echt ist - aber was solls.

megaman hatte auch nie schatten - nicht mal die playstation konvertierung *g*
 

BlackTermi

BeitragFr, Okt 14, 2005 16:23
Antworten mit Zitat
Benutzer-Profile anzeigen
sehr schön

erlaube mir mal eine frage, seit wann programmierst du mit bb? grade neu? also für das erste was du hier zeigst, ist das ein sehr schöner einstand
 

Krischan

BeitragSa, Okt 15, 2005 10:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Umm ehm öhhh - also ehrlich gesagt habe ich bis vor dem 1. Oktober noch nie was von Blitzbasic gehört, bin dann zufällig auf BB gestossen, Demo gezogen, bissi rumprobiert, unzählige Tutorials studiert und Demos angesehen, habs mir dann am 4.10. gekauft weil man dann doch grössere Sachen schreiben will und auch compilieren, tja und dann seitdem jede freie Minute da reingesteckt.

Programmieren tu ich schon länger, so seit ca. 1987 mit Basic auf dem VC20 angefangen, dann auf dem C64 weitergemacht. Hab dann später auf dem PC ein bissi mit QB45 herumgemacht, bin dann aber an der 64K Grenze und der AI gescheitert und habs aufgegeben. Hab damals (1995?) auch mal zwei Spiele und ein paar Tools gebastelt, wen es interessiert (alles mit Sources):

Apfelsee 1.3 - Ein See aus einem Apfelmännchen
Artillerie Duell PC - Remake der C64-Version für den PC
Demos - Kleine Grafikdemos
DSA2 Savegame Editor - Damit konnte man beim Schwarzen Auge II mogeln Wink
Risiko 0.44 - Remake des Amiga Risk
VGA Apfelsee 2.0 - stark erweiterte VGA-Version des Apfelsees

Tja und dann vor 3-4 Jahren mit PHP angefangen, halt nur Webseiten. Und nun... Blitzbasic Smile Hätte ich das damals mit den Rechnern von heute gehabt, man wird ja nicht jünger Wink

Und danke für die Blumen, ich finde es noch lange nicht perfekt, mir schwebt da wie gesagt so ein Solar System Simulator vor, vielleicht noch mehr. Als Spiel könnte man sowas dann vielleicht als Starflight/Elitemix verwursten, irgendwie. Im Moment bastel ich an der Grundlage von einem Sonnensystem auf reellen Bahndaten, soweit man das als Laie/Nichtastronom hinbekommen kann.

Hier ein Democode, allerdings im Moment nur 2D, ist bestimmt noch voller Bugs:

BlitzBasic: [AUSKLAPPEN]
Graphics 800,600,16,2

AppTitle \"Sonnensystem\"

SetBuffer BackBuffer()

;Datenfelder auslesen
Dim planeten$(9,8)
Restore planeten
For p=0 To 9
For q=0 To 8
Read planeten$(p,q)
Next
Next

;Parameter festlegen
mx=GraphicsWidth()/2
my=GraphicsHeight()/2
zoom#=100
zeit#=1

;1 Jahr = Umlaufzeit Erde
jahr#=360/(365.256/Float(planeten$(3,4)))

;Fonts laden
font1=LoadFont(\"System\",16,0,0,0)
font2=LoadFont(\"Small Fonts\",10,0,0,0)

;Hauptschleife
While Not KeyHit(1)

;Tastatursteuerung
If KeyDown(208) Then zoom#=zoom#+10
If KeyDown(200) Then zoom#=zoom#-10
If KeyDown(205) Then zeit#=zeit#+(zoom#/1000)
If KeyDown(203) Then zeit#=zeit#-(zoom#/1000)

;Begrenzungen
If zoom#<25 Then zoom#=25
If zoom#>2500 Then zoom#=2500
If zeit#<1 Then zeit#=1
If zeit>1000 Then zeit#=1000

; Bildschirm leeren
Cls

;alle Objekte durchgehen
For planet=0 To 9

;Daten aus den Feldern lesen
name$=planeten$(planet,0)
dist#=Float(planeten$(planet,1))/zoom#*100
aphel#=Float(planeten$(planet,2))
perihel#=Float(planeten$(planet,3))
speed#=365.256/Float(planeten$(planet,4))
size#=Float(planeten$(planet,5))/zoom#
If size#<5 Then size#=5
r=Int(planeten$(planet,6))
g=Int(planeten$(planet,7))
b=Int(planeten$(planet,8))

;aktuellen Planet einzeichnen
zeichneplanet(mx,my,name$,dist#,aphel#,perihel#,speed#,size#,i#,360,r,g,b,font2)

Next

;Winkel erhöhen
i#=i#+zeit#

SetFont font1

;abgelaufene Zeit in Erdjahren zeigen
Color 255,255,255
Text 0,0,\"Erdumläufe:\":Text 100,0,i#/jahr#
Text 0,15,\"Zoom:\":Text 100,15,Int(zoom#)
Text 0,30,\"Speed:\":Text 100,30,zeit#

;Bufferswitch
Flip 1

Wend

End

.planeten
; --------------------------------------------------------------------------------
; Daten der einzelnen Planeten, aus denen die Szene berechnet wird
; frei aus der Wikipedia übernommen bzw. umgerechnet
; --------------------------------------------------------------------------------
; Name Radius Aphel Perihel synod.Per. Grösse Rot Grün Blau
; --------------------------------------------------------------------------------
Data \"Sonne\" , 0.0 , 1.000 , 1.000 , 1.000 , 1392.000 , 255 , 255 , 0
Data \"Merkur\" , 38.7 , 1.206 , 0.794 , 87.989 , 4.878 , 255 , 128 , 0
Data \"Venus\" , 108.2 , 1.007 , 0.993 , 224.701 , 5.000 , 255 , 255 , 0
Data \"Erde\" , 149.6 , 1.017 , 0.983 , 365.256 , 12.756 , 0 , 0 , 255
Data \"Mars\" , 227.9 , 1.093 , 0.906 , 686.980 , 6.794 , 255 , 0 , 0
Data \"Jupiter\" , 778.6 , 1.049 , 0.951 , 4332.589 , 142.984 , 255 , 192 , 0
Data \"Saturn\" ,1514.6 , 1.057 , 0.944 , 10759.346 , 120.536 , 255 , 224 , 0
Data \"Uranus\" ,3003.6 , 1.046 , 0.954 , 30685.400 , 51.118 , 0 , 128 , 255
Data \"Neptun\" ,4545.7 , 1.011 , 0.989 , 60267.240 , 49.248 , 0 , 255 , 255
Data \"Pluto\" ,7304.3 , 1.244 , 0.756 , 90465.000 , 2.390 , 255 , 255 , 255
; --------------------------------------------------------------------------------


;Planet an einer bestimmten Stelle mit Kreisbahn zeichnen
Function zeichneplanet(mx,my,name$,dist#,aphel#,perihel#,speed#,size#,i#,angle#,r,g,b,font)

;Vorberechnungen
radiusx#=dist#*aphel#
radiusy#=dist#*perihel#
i#=i#*speed#

;mittleren Bahnradius einzeichnen
Color 32,32,32
Oval mx-(dist#),my-(dist#),dist#*2,dist#*2,0

;Ellipsenposition berechnen
xcos#=Cos#(angle#)
xsin#=Sin#(angle#)
tmpx#=Cos#(i#)*radiusx#
tmpy#=Sin#(i#)*-radiusy#
x#=tmpx#*xcos#+tmpy*-xsin#
y#=tmpx#*xsin#+tmpy*xcos#

;elliptischen Bahnradius einzeichnen
Color r/4,g/4,b/4
Oval mx-radiusx#,my-radiusy,radiusx#*2,radiusy#*2,0

;Planet auf Ellipsenposition zeichnen
Color r,g,b
Oval mx+x#-(size#/2),my+y#-(size#/2),size#,size#,1

;Planetennamen über dem Objekt einzeichnen
SetFont font
Text mx+x#,my+y#-(size#/2)-5,name$,1,1

End Function


Die farbigen Bahnen sind die elliptischen Umlaufbahnen unter Berücksichtigung der Aphel/Perihel, die graue Bahn ist der jeweilige durchschnittliche Kreisradius. Mit Pfeiltaste links/rechts bestimmt man die Geschwindigkeit und mit Pfeiltaste rauf/runter den Zoomfaktor. Viel Spass...
 

BlackTermi

BeitragSa, Okt 15, 2005 11:51
Antworten mit Zitat
Benutzer-Profile anzeigen
hmm, sehr schön, aber ich würde mir überlegen die planeten mit types zu verwalten...

Sebastian

BeitragSo, Okt 16, 2005 14:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Hiers was ,von mir :
BlitzBasic: [AUSKLAPPEN]

;Üblicher Anfangs-stoff

Graphics3D 1280,1024,16,1
SetBuffer BackBuffer()
SeedRnd MilliSecs()


Dim planet(40)
Dim speed#(40)


Global path


Global cam = CreateCamera()
CameraRange cam,1,100000
PositionEntity cam,0,2250,0
TurnEntity cam,90,0,0


;Planeten-Basteln


For x = 0 To 40
planet(x) = CreateSphere()

If x = 0 Then
pos = 0
size = 20

Else
pos = pos + Rnd(10,150)
size = Rnd(1,10)
EndIf

PositionEntity planet(x),0,0,pos
EntityBlend planet(x),3
ScaleEntity planet(x),size,size,size
speed#(x) = Rnd(0.1,0.5)


If x > 0 Then
parent = Rnd(0,x-1)
EntityParent planet(x),planet(parent)

EndIf


Next



;Is für die Filter

Global img = CreateImage(1280,1024)
Global img2 = CreateImage(1280,1024)

Global mode


;main-loop



Repeat

If KeyDown(57) Then mode = 0

moveplanets()

RenderWorld



pathmode() ; Spurmodus



circelmode() ;Parent-Childmodus

Color 0,255,0

For x = 1 To 40

CameraProject(cam,EntityX(planet(x),1),EntityY(planet(x),1),EntityZ(planet(x),1))
cex = ProjectedX#()
cey = ProjectedY#()

Text 10,10*x,x + \" @ \" + cex + \" | \" + cey + \" | \"
Next

Flip()

Until KeyHit(1)

;Move it .....

Function moveplanets()
For x = 0 To 40
TurnEntity planet(x),0,speed#(x),0
Next
End Function


Function pathmode() ;Spurmodus


If KeyHit(59) Then ; F1
mode = 1
SetBuffer ImageBuffer(img2)
Cls
EndIf

If mode = 1 Then
CopyRect 0,0,1280,1204,0,0,BackBuffer(),ImageBuffer(img)
SetBuffer ImageBuffer(img2)
DrawImage img,0,0
SetBuffer BackBuffer()
DrawImage img2,0,0
EndIf
End Function


Function circelmode() ;Parent-Childmodus


If KeyDown(60) Then mode = 2 ;F2
If mode = 2 Then
For x = 1 To 40


CameraProject(cam,EntityX(planet(x),1),EntityY(planet(x),1),EntityZ(planet(x),1))
cex = ProjectedX#()
cey = ProjectedY#()



pentity = GetParent(planet(x))
CameraProject(cam,EntityX(pentity,1),EntityY(pentity,1),EntityZ(pentity,1))
ex = ProjectedX#()
ey = ProjectedY#()

Color 0,255,0
Rect cex - 5,cey - 5,10,10,0

Line ex,ey,cex,cey





Next
EndIf
End Function



Ich weiß die Umsetzung is nicht ganz elegant .....
... dafür war das son 2-Stunden Blitz-Projekt. Wink
Ich hab das geprogg als ich auf der letzten Lan-party , mein SuM neuinstallieren musste und deshalb die erste Partie nicht mitzocken konnte.

Als mit F1 ziehen die Sterne spuren und mit F2 kann man die Parent-child-beziehungen sichtbar machen ..........
Seit 2 Jahren kein BlitzBasic und kein Windows mehr, und stolz darauf !
 

Krischan

Betreff: Realistisches 2D-Sonnensystem

BeitragDo, Okt 20, 2005 11:51
Antworten mit Zitat
Benutzer-Profile anzeigen
So, ich habe mich auch noch mal hingesetzt und präsentiere Euch hier ein realistisches Sonnensystem in 2D-Draufsicht. Es werden alle 9 Planeten unter Berücksichtigung des N-Körper Problems ausgehend von ihren realen Positionen/Geschwindigkeiten vom 01.01.2000 dargestellt. Den Core habe ich von folgender Webseite:

http://www.physics.odu.edu/~gc...ations.htm
(dort: planets1.bas, eine Simulation was mit dem Sonnensystem passiert, wenn plötzlich ein Stern mit gleicher Sonnenmasse da durchmaschiert)

Allerdings bedurfte der Code einiger Veränderungen meinerseits, damit es in Blitzbasic gut aussieht Rolling Eyes Wenn man will, kann man die Anfangsparameter entsprechend abändern. In der laufenden Simulation kann man dann mit folgenden Tasten eingreifen:

Pfeil rauf/runter = Zoom in/out
Pfeil links/rechts = langsamer/schneller
Space = Tracers ein/aus
F1 = inneres Sonnensystem
F2 = komplettes Sonnensystem
F3 = Sonnenmasse verdoppelt
F4 = Sonnenmasse halbiert
F5 = Erdmasse = 0.05 Sonnenmassen Wink

Bei F3-F5 passieren i.d.R. sehr witzige Sachen (aber nicht witzig, wenn man auf dem dritten Planeten dort wohnt) - wir spielen Q und verändern einfach mal die Gravitationsverhältnisse in unserem Sonnensystem 8)

Screenshot:
user posted image

Der Code ist so wie er jetzt ist ganz nett aber vielleicht findet sich jemand, der ihn noch dahingehend optimiert, dass die Tracers bei Zoomveränderung keine Linien ziehen, also der Screen gelöscht wird. Ich habs mit CLS versucht, aber das ist zu lahm und flackert. Keine Ahnung, wie man das besser machen könnte. So ganz habe ich den Originalsource nicht verstanden, aber er funzt Very Happy

So und hier isser: Download

Was ein Akt, im Internet einen brauchbaren Code für so eine Darstellung zu finden, ich habe geschlagene 5 Tage alle möglichen Seiten mit verschiedenen Google-Begriffen abgesucht, nix. Entweder C++ mit meilenlangen Sources oder merkwürdige QBasic-Scripte die schwer auf BB zu portieren waren. Letztlich kann man meinen Code sogar für B3D verwenden, da die Z-Koordinaten vorhanden sind und auch im Betrieb berücksichtigt werden.

Eine letzte Frage, die sich mir noch stellt ist, wie man es anstellt, zufällige Planetensysteme mittels dieses Codes zu erstellen. Ich habe da ein paar Versuche gestartet, aber nach ein paar Jahren wurden die Systeme extrem instabil. Leider ist die Datenbasis unseres Sonnensystems eine Momentaufnahme, und diesen dann zufällig und gleichzeitig realitätsnah mittels einer Formel so zu berechnen, dass realistische und stabile Verhältnisse dabei herauskommen habe ich noch nicht geschafft. Naja Gott wird schon gewusst haben, warum sich der Planet genau dort mit der Geschwindigkeit befunden muss Confused

Meinen besten Versuch könnt Ihr hier downloaden

Die Formel ist im Moment so aufgebaut (vor der Massenormalisierung eingeschoben)
BlitzBasic: [AUSKLAPPEN]
;zufällige Planeten (experimentell)
SeedRnd MilliSecs()
For i=1 To pn-1
speed#=(1/Exp(i)*500+1500/Sqr(i+2.7))-50
X#(i)=-i-Rnd(-.2,.2)
Y#(i)=-i-Rnd(-.2,.2)
Z#(i)=0
VX#(i)=-speed#/100000
VY#(i)=speed#/100000
VZ#(i)=0
Next


Ich habe dazu Excel verwendet und das ganze grafisch dargestellt:
user posted image

Die Werte in Spalte B habe ich experimentell mit einem eingezeichneten Kreis über der Flugbahn herausgefunden, sind also annähernd kreisförmig. Huch, jetzt ist der Post doch etwas länger geworden, als zunächst beabsichtigt Embarassed

Sebastian

BeitragDo, Okt 20, 2005 19:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Shocked *staun* Shocked
Seit 2 Jahren kein BlitzBasic und kein Windows mehr, und stolz darauf !

BlitzChecker

BeitragDo, Okt 20, 2005 19:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich bin beeindruckt! Von einem (Fast)Anfänger hätte ich das nicht erwartet!
www.xairro.com

Firstdeathmaker

BeitragDo, Okt 20, 2005 22:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Also bei mir läuft das hier sehr flüssig:

BlitzBasic: [AUSKLAPPEN]
;Realistisches 2D-Modell des Sonnensystems V1.0
;unter Berücksichtigung des N-Körper Problems
;mit realen Daten der Objekte vom 01.01.2000

AppTitle "Realistisches 2D-Modell des Sonnensystems V1.0"

;Parameter
scrX = 640 ;Bildschirmbreite
scrY = 480 ;Bildschirmhöhe
scrD = 32 ;Farbtiefe
scrT = 2 ;1=Fenster 2=Fullscreen
pn = 10 ;Anzahl Planeten
ps = 3 ;Grösse der Planeten
zoom = 200 ;Zoomfaktor (1=weit,250=nah, 200=inneres System, 5=komplett)
tracers = 1 ;Planetenspuren 1=ein 0=aus
sunmove = 1 ;Korrektur der Sonnenbewegung 1=ein 0=aus
sunmass#= 1.0 ;Sonnenmasse (1=normal)
TIM# = 0 ;Zeitfaktor rücksetzen
TIMINT# = 0.5 ;um x Sonnentage erhöhen pro Durchgang, je höher desto ungenauer!
;bei über 10 kann der Merkur "verloren" gehen :-)

;Gaußsche Gravitationskonstante
K1# = .01720209895
K2# = K1# * K1#

;Felder dimensionieren
Dim X#(pn), Y#(pn), Z#(pn), VX#(pn), VY#(pn), VZ#(pn), MASS#(pn), ro(pn), gr(pn), bl(pn)
Dim name$(pn), oldx#(pn), oldy#(pn), DEG#(pn), MU#(pn), SEMI#(pn), ECCEN#(pn)

;Datenfelder auslesen
Dim pla$(pn,11)
Restore planetdata
For p=0 To pn-1
For q=0 To 11
Read pla$(p,q)
name$(p)=pla$(p,0) ;Name
X#(p)=pla$(p,1) ;X-Position
Y#(p)=pla$(p,2) ;Y-Position
Z#(p)=pla$(p,3) ;Z-Position
VX#(p)=pla$(p,4) ;Geschwindigkeit X
VY#(p)=pla$(p,5) ;Geschwindigkeit Y
VZ#(p)=pla$(p,6) ;Geschwindigkeit Z
MASS#(p)=Float(pla$(p,7))*10^Int(pla$(p,8)) ;Masse
ro(p)=pla$(p,9) ;Rotanteil
gr(p)=pla$(p,10) ;Grünanteil
bl(p)=pla$(p,11) ;Blauanteil
Next
Next

;Daten der Objekte Stand 01.01.2000
.planetdata
; Name POS X POS Y POS Z Vx Vy Vz Masse*10^X Rot Grü Bla
Data "Sonne" , 0.0000000 , 0.0000000 , 0.0000000 , 0.000000000 , 0.000000000 , 0.000000000 , 1.991 , 30 , 255 , 255 , 0
Data "Merkur" , -0.1778023 , -0.3863251 , -0.1879025 , 0.020335410 , -0.007559570 , -0.006147710 , 3.191 , 23 , 255 , 64 , 0
Data "Venus" , 0.1787301 , -0.6390267 , -0.2987722 , 0.019469170 , 0.004915870 , 0.000978980 , 4.886 , 24 , 255 , 192 , 128
Data "Erde" , -0.3305873 , 0.8497269 , 0.3684325 , -0.016483420 , -0.005365460 , -0.002326460 , 5.979 , 24 , 0 , 0 , 255
Data "Mars" , -1.5848092 , -0.3648638 , -0.1244522 , 0.003821510 , -0.011241840 , -0.005259630 , 6.418 , 23 , 255 , 0 , 0
Data "Jupiter" , 4.1801700 , -2.5386080 , -1.1900210 , 0.004106423 , 0.006125327 , 0.002525539 , 1.901 , 27 , 128 , 255 , 0
Data "Saturn" , -4.6197080 , -8.2374610 , -3.2033610 , 0.004647751 , -0.002328957 , -0.001161564 , 5.684 , 26 , 255 , 255 , 128
Data "Uranus" , -3.7245900 , -17.1975200 , -7.4791700 , 0.003833665 , -0.000845721 , -0.000424809 , 8.682 , 25 , 0 , 255 , 255
Data "Neptun" , 1.9138100 , -27.9215500 , -11.4762000 , 0.003118271 , 0.000233303 , 0.000017967 , 1.027 , 26 , 0 , 128 , 255
Data "Pluto" , -23.2285900 , -18.5272000 , 1.2167500 , 0.002066577 , -0.002488884 , -0.001397200 , 1.080 , 24 , 128 , 128 , 128

;Masse mit Sonne normalisieren (Sonne=1)
For I = 1 To pn-1
MASS#(I) = MASS#(I) / MASS(0)
Next
MASS#(0) = sunmass#

;reduzierte Masse in Gaussschen Einheiten erzeugen
For I = 1 To pn-1
MU#(I) = K2# * (1 + MASS#(I))
Next

;Grafikmodus
Graphics scrX,scrY,scrD,scrT
SetBuffer BackBuffer()

;Hauptschleife
While Not KeyHit(1)

If KeyDown(200) Then zoom=zoom+1: Cls: If zoom>250 Then zoom=250
If KeyDown(208) Then zoom=zoom-1: Cls: If zoom<1 Then zoom=1
If KeyDown(203) Then TIMINT#=TIMINT#-.5:If TIMINT#<.5 Then TIMINT#=.5
If KeyDown(205) Then TIMINT#=TIMINT#+.5:If TIMINT#>25 Then TIMINT#=25
If KeyHit(57) Then tracers=1-tracers:Cls
If KeyDown(59) Then zoom=200:Cls
If KeyDown(60) Then zoom=5:Cls
If KeyDown(61) Then MASS#(0)=2
If KeyDown(62) Then MASS#(0)=0.5
If KeyDown(63) Then MASS#(3)=.05


;Zeit um Faktor erhöhen
TIM# = TIM# + TIMINT#

;Tracer einzeichnen
For i=0 To pn-1
;Tracerfarbe
If tracers Then Color 32,32,32 Else Color 0,0,0
Oval(scrX/2+oldx#(i),scrY/2+oldy#(i),ps,ps,1)
Next

;Berechnungen und Planetenausgabe
Gosub NewV
Gosub NewP

;Fake CLS oben links
Rect 0,0,150,42,1
Color 255,255,255

;Textausgabe oben links
Text 0, 0,"Tage: "+Int(TIM#)
Text 0,10,"Jahre: "+TIM#/365.25
Text 0,20,"Zeit: "+TIMINT#
Text 0,30,"Zoom: "+zoom

;Tastaturbefehle
;Pfeil rauf/runter = Zoom in/out
;Pfeil links/rechts = langsamer/schneller
;Space = Tracers ein/aus
;F1 = inneres Sonnensystem
;F2 = komplettes Sonnensystem
;F3 = Sonnenmasse verdoppelt
;F4 = Sonnenmasse halbiert
;F5 = Erdmasse = 0.05 Sonnenmassen Wink
kp=0

;Bufferflip
Flip 1

Wend

End

;ab hier Gosubs-------------------------------------------------------------

;Gosub: neue Geschwindigkeit berechnen
.NewV
For I = 0 To pn-1
;Parameter rücksetzen
AX# = 0
AY# = 0
AZ# = 0

;keine Ahnung was hier passiert
For J = 0 To pn-1
If (J = I) Then Goto weiter
XJI# = X#(J) - X#(I)
YJI# = Y#(J) - Y#(I)
ZJI# = Z#(J) - Z#(I)
R# = Sqr(ZJI# * ZJI# + YJI# * YJI# + XJI# * XJI#)
R3# = R# * R# * R#
COEFF# = K2# * MASS#(J) / R3#
AX# = COEFF# * XJI# + AX#
AY# = COEFF# * YJI# + AY#
AZ# = COEFF# * ZJI# + AZ#
.weiter
Next

;neue Geschwindigkeit berechnen
VX#(I) = VX#(I) + AX# * TIMINT#
VY#(I) = VY#(I) + AY# * TIMINT#
VZ#(I) = VZ#(I) + AZ# * TIMINT#
Next
Return

;Gosub: neue Position berechnen und Planeten einzeichnen
.NewP
For i=0 To pn-1
;neue Position berechnen
X#(i) = X(i) + VX#(i) * TIMINT#
Y#(i) = Y(i) + VY#(i) * TIMINT#
Z#(i) = Z(i) + VZ#(i) * TIMINT#

;Zoomfaktor berücksichtigen
sx#=X#(i)*zoom
sy#=Y#(i)*zoom

;Korrektur der Sonnenbewegung
If i=0 And sunmove=1 Then
sunx#=sx#
suny#=sy#
EndIf

;Position mit Zoomfaktor und Sonnenkorrektur
sx#=sx#-sunx#
sy#=sy#-suny#

;alte Position für Tracer speichern
oldx#(i)=sx#
oldy#(i)=sy#

;Planeten zeichnen
Color ro(i),gr(i),bl(i)
Oval(scrX/2+sx#,scrY/2+sy#,ps,ps,1)
Next
Return
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image

Shodan

BeitragMi, Okt 26, 2005 22:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Interessant. Bei hochziehen des Zeitraffers hat sich Mars verabschiedet und ist aus seiner Bahn ausgebrochen. Ich hoffe dein Modell ist nicht zu exakt, sonst passiert das eines Tages wirklich Laughing
www.selfmadegames.de
 

Krischan

BeitragDo, Okt 27, 2005 8:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Das liegt einfach daran, dass die Berechnung ungenauer wird, wenn man den Step höhersetzt. Ich kann Dich beruhigen, bei Step 1 vergeht in ca. 1 Sekunde genau ein Tag (je nach Geschwindigkeit des PCs, hab da keine Millisekundenberechnung eingebaut), also ein Step von 0.0002777 (1/3600) wäre im Idealfall zeitnah, da fliegt dann nix mehr weg Smile

Allerdings:

Zitat:
Rechnungen von Jacques Laskar für die Erde deuten darauf hin, daß schon eine Meßungenauigkeit der Erdbahn von 15 Metern nach 100 Millionen Jahren zu einer Ungenauigkeit von 100 Prozent für die Bahnparameter unseres Heimatplaneten führt [4]. Es läßt sich also sagen, daß sich unser Sonnensystem durchaus chaotisch verhalten kann, sich dies aber erst in für uns ungeheuer großen Zeiträumen äußert.

http://www.eberl.net/chaos/Sem/Krause/D_index.html

Und wie das bei chaotischen Systemen so üblich ist kann eine kleine Ungenauigkeit in den Anfangsparametern später fatale Folgen haben, siehe Simulator.

Ich hatte da auch mal eine Situation (Erde=0,05 Sonnenmassen im richtigen Zeitpunkt), in der der Mars plötzlich eine zeitlang zum Mond der Erde wurde, bevor er dann mit wahnsinniger Geschwindigkeit links aus dem Bildschirm geflogen ist. Embarassed

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSa, Nov 05, 2005 12:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja die Ungenauigkeit liegt daran, daß der Rechner schritweise berechnet. In der Natur wird aber 'fliessend' Einfluss genommen. Je mehr man die Simulationsgeschwindigkeit hochdreht, umso größere Schritte werden beim berechnen gemacht. Das ein Planet dann wie ein Geschoss weg fliegt liegt daran das bei großen Schritten 'plötzlich' Planeten so nah beieinander liegen können, das die Gravitationskraft enorm groß wird. Diese Beschleunigt dann die Planeten wie Geschosse voneinander weg. Bei dieser Geschwindigkeit und der Schrittgröße wird dann anschliessend kaum noch Gravitationskraft zueinander wirksam.

Was ich aber eigendlich fragen wollte. Wenn hier mal ein paar Spezialisten mir verraten könnten wie sich Spiralen im Universum bilden. Dem währe ich sehr dankbar. Habe solche Simulationen mit biszu 8000 Partikeln gemacht, wo jeder einzelne Einfluss zum anderem hat. Problem: Irgendwann hat man ein Zentrum mit 'wirr' fliegenden Partikeln. Dann habe ich eine Art 'Gravitationsdoppler-Effekt' eingebaut. Dieser sollte eine Gravitationsausbreitung mit Lichtgeschwindigkeit simulieren. Also wenn sich Partikel zueinander nähern, dann wird bedingt durch den Doppler-Effekt die Gravitation 'abgeschwächt', und verstärkt wenn sie sich voneinander weg bewegen (Berechnet durch Entfernung und relative Geschwindigkeit (Also 'vergangene Zeit' bis Gravitationskraft einfluss nimmt)). Zudem wurde auch die Entfernung mit berücksichtigt. Dadurch habe ich in der tat Spiralbildende Galaxien geschaffen. Leider wurde aber auch durch den Effekt eine ewige Zunahme der gesammten Durchschnittsgeschwindigkeit eingeführt. Somit hatte die Galaxie eine ewige Ausdehnung bevor sie sich richtig stabilisieren konnte. Dann habe ich (was im Weltraum nicht vorhanden ist) ein Bewegungswiederstand eingebaut, der verhindern sollte das die ewige Geschwindigkeitszunahme eine Ausdehnung und letztendlich zum verfliegen der Galaxie führt. Je nachdem wie die Ausgangssituation war, hatte ich nach etwa 10000 Zyklen ein Ring oder eine ständig aufbauende Spirale die wieder verfällt und sich wieder aufbaut. Das Problem ist auch, daß solche Simulationen nicht einfach mal so durchgeführt werden können. Ich habe mein Rechner schonmal 36 Stunden dafür rechnen lassen, die Werte in eine Datei gespeichert um dann eine 15min lange Animationssequenz anschauen zu können.

Kann ja mal den Code für BB hier rein posten, falls Interesse besteht.

nX^

BeitragDi, Jun 13, 2006 21:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hatte mal Langeweile und habe an dem Code rumgebastelt.


user posted image
user posted image
user posted image
user posted image
  • Zuletzt bearbeitet von nX^ am Fr, Jun 16, 2006 21:06, insgesamt einmal bearbeitet

Mr.Hyde

Newsposter

BeitragDi, Jun 13, 2006 21:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab ebenfalls mal nen bisschen rumgespielt. Man hat ja sonst nix zu tun Wink
user posted image
user posted image
BBP News RSS | Chaos Interactive | Watanien 2 Screens, Infos und Download | Watanien 2 Worklog | PuzzleMasters
http://abgeordnetenwatch.de - http://www.regierungs-beratung.de - Der Regierung auf die Finger schauen
 

$tankY

BeitragDi, Jun 13, 2006 21:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Ihr kramt diesen alten Thread hoch, schick ganz geile Pics, aber - was hier wohl angebracht wäre - ihr habt keinen source gesendet Rolling Eyes

Mr.Hyde

Newsposter

BeitragDi, Jun 13, 2006 21:50
Antworten mit Zitat
Benutzer-Profile anzeigen
hm. könnte ihn jetzt posten, sind aber nicht so weltbewegende Veränderungen. Eher die Vielzahl an kleinen Änderungen macht den Unterschied
BBP News RSS | Chaos Interactive | Watanien 2 Screens, Infos und Download | Watanien 2 Worklog | PuzzleMasters
http://abgeordnetenwatch.de - http://www.regierungs-beratung.de - Der Regierung auf die Finger schauen
 

chmee

BeitragMo, Jul 03, 2006 14:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Da es "ähnlich" ist , wollte ich es hier reinposten.

1. Uralter lausiger Programmierstil, nix von wegen Funktionen oder Objektorientiert.
2. Mir fehlt das Blurring für nen Schweif.

Ich wollte die kleine Gravitiation-Sim auf die 10-100 fache Menge pushen.
Aber ich denke auch, unter BB/B3D wird das nix.

Code: [AUSKLAPPEN]
; ---------------------------------------
; --       Gravitation Sim v 0.7       --
; -- geschrieben:chmee@phreekz.de 2006 --
; ---------------------------------------
Const anz=140
Const blur=1         ; momentan nicht benutzt

Const xmax=1440
Const ymax=900

Const Gravkonst#=2.9
Const reib#=0.95

Const Mitte=0         ; Statische Kraft ? 0/1
is=10                ; Initial Geschwindigkeit
imn=3                ; Masse Mimimum
imx=30               ; masse Maximum


Dim x#(anz),y#(anz),dx#(anz),dy#(anz),mass#(anz),col(anz)
Dim blurpix(1,blur,anz)
SeedRnd MilliSecs()
Const xmid=xmax/2
Const ymid=ymax/2
Graphics xmax,ymax,32,1

ima=Int(0.35*imx)
imb=Int(0.65*imx)
imc=Int(0.80*imx)

.Start
xini=Rnd(25,xmid-10)   ; Initial X
yini=Rnd(25,ymid-10)   ; Initial Y

; ---------- Statische Gravitationskraft
x#(0)=0
y#(0)=0
mass#(0)=imx*40
;----------------------------------------------
tast=""
buf=0
Mit=1-Mitte
; Initialisieren der Punkte
For an=1 To anz
 x#(an)=Rnd(-xini,xini)
 y#(an)=Rnd(-yini,yini)
 dx#(an)=Rnd(-is,is)/10
 dy#(an)=Rnd(-is,is)/10
 mad=Rnd(imn,imx)
 mass#(an)=mad/5

 Select True
   Case mad<ima
   c=$6666FF
   Case mad=>ima And mad<imb
    c=$FF0000
   Case mad=>imb And mad<imc
    c=$00CC00
   Case mad=>imc
     c=$FFFFFF
 End Select

col(an)= c

Next

SetBuffer BackBuffer()
Cls
SetBuffer FrontBuffer()
Cls
SetBuffer BackBuffer()

While Not (tast Or mou)
 tast=GetKey()
 mou=GetMouse()
 LockBuffer BackBuffer()
 
   For an=1 To anz
     dxx#=0
     dyy#=0
     xaa#=x#(an)
   yaa#=y#(an)
   maa#=mass#(an)
   
   For in=Mit To anz                      ; Kraft pro Punkt berechnen
        If an<>in Then                      ; Nicht mit sich selbst, da div0-Error
       xu#=xaa#-x#(in)
       yu#=yaa#-y#(in)
         entf#=(xu#*xu#)+(yu#*yu#)
       komp#=gravkonst#*mass#(in)*maa#/entf#   ; Entf N quadsch > Wurzel entfernt bei Entf#
      dxx#=(dxx#-xu#*komp#)*reib#         ; -- X * Konst * Masse1 * Masse2 / Entfernung^2
       dyy#=(dyy#-yu#*komp#)*reib#
        EndIf 
     Next
     

   dx#(an)=dx#(an)+dxx#/anz                ; Richtungsvektor dx und dy
     dy#(an)=dy#(an)+dyy#/anz
     x#(an)=xaa#+dx#(an)
     y#(an)=yaa#+dy#(an)
      xxx=xmid+Int(x#(an))
     yyy=ymid+Int(y#(an))
   ;If xxx>xmax Or xxx<0 Then dx#(an)=-dx#(an) ; Wenn an Wände gestoßen, Kräfte dx/dy umkehren
   ;If yyy>ymax Or yyy<0 Then dy#(an)=-dy#(an)
   
     If xxx<xmax And xxx>0 And yyy<ymax And yyy>0 Then
      WritePixelFast xxx,yyy,col(an),BackBuffer()
   EndIf
 Next
 UnlockBuffer BackBuffer()
 
Flip
Cls
Wend
If tast=32 Then Goto start


mfg chmee
Das Leben könnte so schön bunt sein, aber nee....

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group