Umlaufbahnen

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

Travis

Betreff: Umlaufbahnen

BeitragSo, Aug 22, 2004 1:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Hier werden Anziehungskräfte zwischen verschiedenen Objekten simuliert. Es sind verschiedene Beispielkonfigurationen zum ausprobieren vorhanden.

EDIT: 11.01.05 - Neuste Version mit optimierten Umlaufbahnen und genauerer Berechnung. Dazu jetzt 10 wählbare Beispiele, per Pfeiltasten wählbar.

Code: [AUSKLAPPEN]

; Gravitation und Umlaufbahnen
; Copyright August 2004, Daniel Nobis

; Hier werden Anziehungskräfte zwischen verschiedenen Objekten simuliert.
; Dabei wird die Masse und auch die Entfernung berücksichtigt.
; Auf diese Weise lassen sich zum Beispiel Umlaufbahnen erzeugen.

; Dieses Programm enthält 10 verschiedene Beispiele mit mehreren Objekten, die
; aufeinander einwirken. Zur Auswahl ändern sie einfach den Zähler von PresetSystem().

; Um eigene Objekte zu erstellen rufen Sie diese Funktion auf:
; CreateObjekt(PosX, PosY, SpeedX, SpeedY, Masse, Modus)

; - Der Modus bestimmt ob ein Objekt fixiert (0) oder frei beweglich (1) ist.

AppTitle "Gravitation Simulation"

Global ResX = 800
Global ResY = 600

Graphics ResX, ResY, 16, 2

Type Objekt
 Field x#,y#,sx#,sy#,masse#,typ
End Type

Type Punkt
 Field x,y,start
End Type

.Preset
Global Speed# = .08
Global Bahnen = 1
Global Name$ = "Gravitation Simulation"
Global PresetID

DeleteSystem()         ; Alle Objekte löschen
PresetSystem(PresetID) ; <---- Beispielkonfigurationen (10 Modi möglich)


; --- Hauptschleife ---
SetBuffer BackBuffer()
 Repeat
  Cls

    If KeyHit(59) Then Bahnen = Bahnen Xor 1
    Text ResX/2,30, "Copyright (C) 2004 Daniel Nobis", 1
    Text ResX/2,50, "FPS: " + FPS(), 1
    Text ResX/2,10, Name$, 1
   
    If PresetID = 0 Then
     Text ResX/2, ResY/2, "Drücken Sie die Pfeiltasten um durch die Presets zu blättern", 1
    EndIf
 
    If UpdateInput() = 1 Then Goto Preset

    UpdateObjekt()
    UpdatePunkt()

  Flip 0
 Until KeyHit(1)
End
; --- Hauptschleife ---


; --- System löschen ---
Function DeleteSystem()
 For o.objekt = Each objekt
  Delete o
 Next

 For p.punkt = Each punkt
  Delete p
 Next
End Function
; --- System löschen ---


; --- Beispielkonfigurationen ---
Function PresetSystem(ID)
 Select ID
  Case 1
   Speed# = .08
   Name$ = "Umlaufbahnen"
   CreateObjekt(ResX/2, ResY/2, 0, 0, 3.000, 1)
   CreateObjekt(ResX/2, ResY/7, 13.5, 0, 0.000, 1)
   CreateObjekt(ResX/2, ResY/4, 12.5, 0, 0.000, 1)
   CreateObjekt(ResX/2, ResY/3, 11.0, 0, 0.000, 1)
  Case 2
   Speed = .02
   Name$ = "Große Blume"
   CreateObjekt(ResX/2, ResY/2, 0, 0, 550.000, 0)
   CreateObjekt(700, 300, 50, -50, 1.000, 1)
   CreateObjekt(100, 300, -50, 50, 1.000, 1)
  Case 3
   Speed# = .08
   Name$ = "Chaos Anomalie"
   CreateObjekt(ResX/2, ResY/2, 0, 0, 30.000, 1)
   CreateObjekt(700, 300, 5, -5, 1.000, 1)
   CreateObjekt(100, 300, -5, 5, 1.000, 1)
  Case 4
   Speed# = .08
   Name$ = "Atom"
   CreateObjekt(ResX/2, ResY/2, 0, 0, 30.000, 1)
   CreateObjekt(ResX/2, ResY/7, 13.5, 0, 0.000, 1)
   CreateObjekt(ResX/2, ResY/4, 13.0, 0, 0.000, 1)
   CreateObjekt(ResX/2, ResY/3, 11.0, 0, 0.000, 1)
  Case 5
   Speed# = .08
   Name$ = "Spiro Fun"
   CreateObjekt(ResX/2, ResY/2, 0,  0, 3.000, 1)
   CreateObjekt(ResX/2, 100, -13.5, 0, 0.100, 1)
   CreateObjekt(ResX/2, 500, 13.5,  0, 0.100, 1)
  Case 6
   Speed# = .04
   Name$ = "Chaos Theorie"
   CreateObjekt(ResX/2, ResY/2,   0, 0, 30.000, 1)
   CreateObjekt(ResX/2, 100,  +15.5, 0,  5.000, 1)
   CreateObjekt(ResX/2, 500,  -15.5, 0,  5.000, 1)
  Case 7
   Speed# = .008
   Name$ = "Kleine Blume"
   CreateObjekt(ResX/2, 100, +157, 0, 5000.000, 1)
   CreateObjekt(ResX/2, 500, -157, 0, 5000.000, 1)
  Case 8
   Bahnen = 0
   Speed# = .08
   Name$ = "Gravitationskreis"
   For w = 0 To 359 Step 15
    PosX = ResX/2 + Cos(w) * 250
    PosY = ResY/2 + Sin(w) * 250
    CreateObjekt(PosX, PosY, 0, 0, 1.000, 0)
   Next   
   For w = 0 To 359 Step 15
    PosX = ResX/2 + Cos(w) * 100
    PosY = ResY/2 + Sin(w) * 100
    CreateObjekt(PosX, PosY, 0, 0, 1.000, 1)
   Next
  Case 9
   Speed = .08
   Name$ = "Instabiles System"
   CreateObjekt(ResX/2, ResY/2, 0,  0, 3.000, 1)
   CreateObjekt(ResX/2, ResY/2-200, -13.5, 0, 0.100, 1)
   CreateObjekt(ResX/2, ResY/2+200, +13.5, 0, 0.100, 1)
   CreateObjekt(ResX/2-100, ResY/2, 0, -11.0, 0.100, 1)
   CreateObjekt(ResX/2+100, ResY/2, 0, +11.0, 0.100, 1)
  Case 10
   Speed# = .001
   Name$ = "Stabiles System"
   CreateObjekt(ResX/2, ResY/2, 0,  0, 5000.000, 1)
   CreateObjekt(ResX/2, ResY/2-200, -560.0, 0, 5.000, 1)
   CreateObjekt(ResX/2, ResY/2+200, +560.0, 0, 5.000, 1)
   CreateObjekt(ResX/2-100, ResY/2, 0, -450.0, 5.000, 1)
   CreateObjekt(ResX/2+100, ResY/2, 0, +450.0, 5.000, 1)
 End Select
End Function
; --- Beispielkonfigurationen ---


; --- Neuen Flugbahnpunkt erstellen ---
Function CreatePunkt(x,y)
 If x > 0 And x < ResX And y > 0 And y < ResY Then
  p.punkt = New punkt
  p\x = x
  p\y = y
  p\start = MilliSecs()
 EndIf
End Function
; --- Neuen Flugbahnpunkt erstellen ---


; --- Neues Objekt erstellen ---
Function CreateObjekt(x#,y#,sx#,sy#,masse#,typ)
 o.objekt = New objekt
 o\x = x
 o\y = y
 o\sx = sx
 o\sy = sy
 o\masse# = masse
 o\typ = typ
End Function
; --- Neues Objekt erstellen ---


; --- Flugbahnpunkte aktualisieren ---
Function UpdatePunkt()
 LockBuffer BackBuffer()
  For p.punkt = Each punkt

   WritePixelFast(p\x, p\y, $FFFFFF, BackBuffer()) 
   If MilliSecs()-p\start > 2500 Then Delete p   

  Next
 UnlockBuffer BackBuffer()
End Function 
; --- Flugbahnpunkte aktualisieren ---


; --- Objekte aktualisieren ---
Function UpdateObjekt()
 For o.objekt = Each objekt

  For o2.objekt = Each objekt
   If o <> o2 Then
    Abstand# = Abstand(o\x,o\y,o2\x,o2\y)
    If Abstand < 500 Then
     
     Winkel1 = winkel(o2\x,o2\y,o\x,o\y) 
     Winkel2 = winkel(o\x,o\y,o2\x,o2\y)
 
     ; O1 wird von O2 angezogen
     o\sx# = o\sx + Cos(Winkel1) * (500-Abstand) / 2000 * o2\masse * speed
     o\sy# = o\sy + Sin(Winkel1) * (500-Abstand) / 2000 * o2\masse * speed

     ; O2 wird von O1 angezogen
     o2\sx# = o2\sx + Cos(Winkel2) * (500-Abstand) / 2000 * o\masse * speed
     o2\sy# = o2\sy + Sin(Winkel2) * (500-Abstand) / 2000 * o\masse * speed

    EndIf
   EndIf
  Next

  ; Objekte bewegen
  If o\typ <> 0 Then
   col = (3-o\masse#)*255
   Color col,col,+255-col
   o\x# = o\x# + o\sx# * Speed#
   o\y# = o\y# + o\sy# * Speed#
   If Bahnen = 1 Then CreatePunkt(o\x+3,o\y+3)
  Else
   Color 150,0,0
  EndIf

  ; Objekte darstellen
  Oval o\x+3,o\y+3,6,6

 Next
End Function
; --- Objekte aktualisieren ---


; --- Benutzereingabe ---
Function UpdateInput()
 If KeyHit(200) Then
  PresetID = PresetID + 1
  If PresetID > 10 Then PresetID = 1
  If PresetID < 1 Then PresetID = 10
  Return 1
 EndIf

 If KeyHit(208) Then
  PresetID = PresetID - 1
  If PresetID > 10 Then PresetID = 1
  If PresetID < 1 Then PresetID = 10
  Return 1
 EndIf
End Function
; --- Benutzereingabe ---


; --- Frames per Second ---
Global FPSSEC = MilliSecs(), FPS, FRAMES

Function FPS()
 
  FRAMES = FRAMES + 1
  If MilliSecs() - FPSSEC => 1000 Then
   FPS = FRAMES
   FRAMES = 0
   FPSSEC = MilliSecs()
  EndIf

 Return FPS
End Function
; --- Frames per Second ---


; --- Abstandsfunktion ---
Function Abstand(x1#,y1#,x2#,y2#)
 xhypo# = x1# - x2#
 yhypo# = y1# - y2#
 Abstand# = Sqr((xhypo# ^ 2) + (yhypo# ^ 2))
 Return Abstand#
End Function
; --- Abstandsfunktion ---


; --- Winkel berechnen ---
Function Winkel#(x1#,y1#,x2#,y2#)
 ; 1 = Ziel, 2 = Ursprung
 Return (450-ATan2(x1#-x2#,y1#-y2#)) Mod 360
End Function
www.funforge.org

Ich hasse WASD-Steuerung.

Man kann alles sagen, man muss es nur vernünftig begründen können.
  • Zuletzt bearbeitet von Travis am Di, Jan 11, 2005 23:43, insgesamt 6-mal bearbeitet

Last Anquav Hero

BeitragSo, Aug 22, 2004 9:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab noch nicht ausprobiert aber gehört das nicht eher ins Kotarchiv?
 

Blitzkrieg Bop

BeitragSo, Aug 22, 2004 12:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey, sieht cool aus! 8)

Zitat:

Hab noch nicht ausprobiert aber gehört das nicht eher ins Kotarchiv?


Laughing ...Ich glaub du meinst das Codearchiv. Lerne schreiben ... Very Happy
~ Hey Ho Let's Go ~
 

storzi

BeitragSo, Aug 22, 2004 12:55
Antworten mit Zitat
Benutzer-Profile anzeigen
kotarchiv Laughing

hier mein kot der letzten wochen Very Happy
so ein scheißhaufen Wink
http://www.splattergamez.de

Triton

BeitragSo, Aug 22, 2004 13:36
Antworten mit Zitat
Benutzer-Profile anzeigen
schöne Sache, verschoben ins codearchiv.

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group