planeten und meteoriten

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Knartz

Betreff: planeten und meteoriten

BeitragSo, Sep 25, 2005 18:38
Antworten mit Zitat
Benutzer-Profile anzeigen
So hab ich mir es gedacht ...
ein paar meteoriten + planeten - die planeten üben ihre gravitation auf die meteoriten aus ...
und die meteoriten fliegen halt rum ... standart

und dann kam atan2 Shocked

hier meine 2 Probleme
#1 die anzeige des atan2 winkels ist "komisch"
#2 !achtung mathe! mit atan2 hab ich möchte ich jetzt errechnen in welche richtung die meteoriten abgelenkt werden, da brauch ich jetzt einen kleinen spoiler wie ich das dann mache. Ich bin nicht grade ein mathe-ass (... meine mathelehrer verzweifelten immer ...)

BlitzBasic: [AUSKLAPPEN]


Type meteorid
Field px#,py#
Field vx#,vy#
End Type

Type planet
Field px#,py#
Field size#
Field mass#
End Type

Graphics 800,600
SetBuffer BackBuffer()

p.planet = New planet
p\px = 400
p\py = 300
p\size = 10
p\mass = 10
m.meteorid = New meteorid
m\px = 100
m\py = 500
m\vx = 1
m\vy = 0
m.meteorid = New meteorid
m\px = 700
m\py = 100
m\vx = 0
m\vy = 0
Delay 1000
Repeat
Cls
For m.meteorid = Each meteorid
For p.planet = Each planet
Locate 0,0
Print ATan2(m\py-p\py,m\px-p\py)
Oval p\px-Int(p\size *0.5),p\py-Int(p\size *0.5),p\size,p\size
Next
m\px = m\px + m\vx
m\py = m\py + m\vy
Plot m\px,m\py
Next
Flip
Forever

End


danke für eure tips

SoNenTyp

BeitragSo, Sep 25, 2005 19:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Atan2 giebt einen winkel zwischen 180 und -180 zurück.

Aus der Onlinehilfe:

Um einen vollen Winkel im Bereich von 0° bis 360° auszurechnen, muss man nur diese Formel anwenden:
Winkel#=(ATAN2(y#,x#)+360) MOD 360





Ich hoffe dammit ist dir geholfen.
Gruss Der Typ.

User posted image
 

Knartz

BeitragMo, Sep 26, 2005 16:51
Antworten mit Zitat
Benutzer-Profile anzeigen
sorry, hab mich nicht richtig ausgedrückt -

ich wollte wissen wie ich mithilfe von atan2 herausbekommen kann um welche x und y einheiten ich die meteoriten verschieben muss.
also muss ich doch so rechnen :
x-vector oder y-vector = (gravitation / entfernung²) x dings berechnen - wobei dings jetzt irgendwas mit atan2 sein müsste, oder ?

ich hab mir gedacht , das ich auf diese weise einen nach dem anderen planeten auf den vektor aufaddiere und hinterher die bewegungsänderung erreiche. ich muss halt nur rausbekommen wie ich dann die x und y verschiebungen finde. z.b.:
g_planet1 ... ... n
x-vector = 4 - 2 - 5 - + 4 = 1

thx

*********************************************

eure antworten sind weiterhin willkommen
ich hatte eine idee ... war eigentlich ganz einfach
BlitzBasic: [AUSKLAPPEN]

y-vector = 0
For Each planet_obj
x-vector = x-vector + ((Cos obj_2\x-obj_1\x)*(ATan2(Cos obj_2\x-obj_1\x)*g)
y-vector = y-vector + ((Cos obj_2\y-obj_1\y)*(ATan2(Cos obj_2\y-obj_1\y)*g)
Next


hab bestimmt was falsch gemacht aber das teste ich später aus
Very Happy

tft

BeitragMo, Sep 26, 2005 21:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi....

warum machst du das so Kompliziert? Benutz doch das EntitySystem.
Oder hast du nur Blitz 2D? oder Blitz+
TFT
https://www.sourcemagic.ch
Monkey,HTML5,CSS3,W 10 64 Bit, 32 GB Ram, GTX Titan, W8 ist Müll !!!!!!

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDi, Sep 27, 2005 1:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi, habe sowas schon mal erstellt. Der Code ist allerdings etwas länger... Es lassen sich Animationssequenzen Speichern/Laden. Dies ist dann wichtig, wenn man beispielsweise 4000 oder mehr Planeten erstellt. Da jede Position mit jeder anderer berechnet werden muß, dauert es dann schon etwas länger bis eine Animation ausgerechnet wird. Habe das mal gemacht, da ich wissen wollte wie sich Spiralen im Universum bilden und habe im Code ein 'Gravitations-Doppler-Effekt' eingebaut. Spiralen bilden sich bei größerer Anzahl von Planeten. Allerdings siehts etwas komisch aus. Und es dauert etwa 10000 Animationssequenzen bis sich die Bewegungen stabilisiert haben. Dafür habe ich mein Rechner schon mal 36 Stunden rechnen lassen, um mir dann per Load das ganze anzuschauen... Very Happy Naja, lange Rede, kurzer Sinn. Um Gravitationseinwirkung zu berechnen braucht man kein Atan/Atan2! Die Gravitationsberechnungen werden in den Zeilen 57 bis 66 gemacht. Kein Atan!!!Code: [AUSKLAPPEN]
game$=Input$("[L]oad / [S]ave / [ENTER] : ")

q%=0
w%=0
dx#=0
dy#=0
sq#=0
xm#=0
ym#=0
xn#=0
yn#=0
zm#=1
px%=0
py%=0
fa%=0
fr%=0
st%=200

Dim xp#(st)
Dim yp#(st)
Dim xg#(st)
Dim yg#(st)




;ANIMATION SAVE/ANIM
If Not game$="l" Then

 Cls
 If game$="s" Then
  name$=Input$("Dateiname: ")
  file=WriteFile("data\"+name$)
  WriteShort(file,st)
  Graphics 1024,768,16,2
 Else
  Graphics 1024,768,16,1
 End If

 SetBuffer BackBuffer()
 Origin 512,384

 For q=1 To st
  wk#=(Rand(1,3)*100)+Rnd(0,20)
  ;xp(q)=Cos(wk)*Rnd(100,140)
  ;yp(q)=Sin(wk)*Rnd(100,140)
  xp(q)=Rnd(-40,40)+Rnd(-30,30)+Rnd(-20,20)
  yp(q)=Rnd(-40,40)+Rnd(-30,30)+Rnd(-20,20)
  xg(q)=(+yp(q)/20)
  yg(q)=(-xp(q)/20)
 Next

 While Not KeyHit(1)
  For q=1 To st
   For w=1 To st
    If Not q=w Then

     dx=xp(q)-xp(w)
     dy=yp(q)-yp(w)
     sq=Sqr(dx*dx+dy*dy)

     dx=xp(q)-(xp(w)-((xg(w)*sq)/(st/4)))
     dy=yp(q)-(yp(w)-((yg(w)*sq)/(st/4)))
     sq=1/(dx*dx+dy*dy)

     xg(q)=xg(q)-(dx*sq*0.02)
     yg(q)=yg(q)-(dy*sq*0.02)
    End If
   Next
  Next

  xm=0
  ym=0

  For q=1 To st
   xg(q)=xg(q)*0.999
   yg(q)=yg(q)*0.999
   xp(q)=xp(q)+xg(q)
   yp(q)=yp(q)+yg(q)
   xm=xm+xp(q)
   ym=ym+yp(q)
  Next

  Color 24,24,24
  Rect -720*(zm/2),-720*(zm/2),720*zm,720*zm,0

  For q=1 To st
   fa=Sqr((xg(q)^2)+(yg(q)^2))*5
   If fa>100 Then fa=100
   Color 150+fa,50+fa*2,100-fa/2
   ;If q=st Then Color 255,255,255
   ;If q=st-1 Then Color 255,255,255
   Plot (xp(q)*zm)-(xm/st*zm),(yp(q)*zm)-(ym/st*zm)

   If game$="s" Then
    WriteShort(file,Int(xp(q)+32767))
    WriteShort(file,Int(yp(q)+32767))
    WriteByte(file,Int(fa))
   End If
  Next

  If KeyDown(57) Then
  For q=1 To 41
  xp(q)=-200+q*10
  yp(q)=0
  xg(q)=0
  yg(q)=0
  Next
  End If

  If KeyDown(200) Then zm=zm+(zm/40):If zm>9999 Then zm=9999
  If KeyDown(208) Then zm=zm-(zm/20):If zm<0.01 Then zm=0.01
  fr=fr+1:Text -512,-370,fr
  Flip 0
  Cls
 Wend
End If




;ANIMATION LOAD
If game$="l" Then

 Cls
 name$=Input$("Dateiname: ")
 file=ReadFile("data\"+name$)
 st=ReadShort(file)

 Graphics 1024,768,16,1
 SetBuffer BackBuffer()
 Origin 512,384

 While Not Eof(file)

  Color 24,24,24
  Rect -720*(zm/2),-720*(zm/2),720*zm,720*zm,0

  xn=xm
  yn=ym
  xm=0
  ym=0

  For q=1 To st
   px=ReadShort(file)-32767
   py=ReadShort(file)-32767
   fa=ReadByte(file)
   Color 150+fa,50+fa*2,100-fa/2
   xm=xm+px
   ym=ym+py
   Plot (px*zm)-(xn/st*zm),(py*zm)-(yn/st*zm)
  Next

  If KeyDown(200) Then zm=zm+(zm/40):If zm>9999 Then zm=9999
  If KeyDown(208) Then zm=zm-(zm/20):If zm<0.01 Then zm=0.01
  If KeyHit(1) Then End
  fr=fr+1:Text -512,-370,fr
  Flip 1
  Cls
 Wend
End If




End

Wer das ganze mit mehr Partikeln ausprobieren möchte, sollte den Drehimpuls etwas reduzieren! Das geht mit den beiden Zeilen 48 und 49... /20 muß dann /200 stehen... Ausprobieren! Mit LOAD wird eine bereits gespeicherte Sequenz geladen und dargestellt. Mit SAVE wird eine Sequenz berechnet/dargestellt und abgespeichert. Mit ENTER wird nur berechnet und dargestellt. Mit Cursor hoch/runter kann man rein/raus-zoomen, Egal ob gerade gespeichert wird oder nicht. Die Berechnungen werden dadurch nicht beeinflusst.

Sorry wegen keiner Komentaren im Quelltext. Ist halt nur für mich gewesen, und habe immer wieder dran rumgebastellt... Aber hoffe das ich dir denoch helfen konnte...

Spikespine

BeitragDi, Sep 27, 2005 13:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
ich habe auch mal einen Code mit metorit und planet gemacht, vielleicht kannst du ihn ja gebrauchen....

Code: [AUSKLAPPEN]
Graphics 1024,768,32,2
SetBuffer BackBuffer()

Const grav# = .2

planet_x# = 512
planet_y# = 384

meteor_x# = 100
meteor_y# = 500
meteor_vx# = 0.0
meteor_vy# = 6.0

Repeat
   Cls
   
   entfernung# = Sqr((meteor_x#-planet_x#)^2 + (meteor_y#-planet_y#)^2)
   winkel# = (atan2(planet_x#-meteor_x,planet_y-meteor_y)+360)mod 360
      anziehung# = grav# * ((500-entfernung#)/100)
   
   
   meteor_vx# = meteor_vx# + sin(winkel) * anziehung ;Geschwindigkeit horizontal
   meteor_vy# = meteor_vy# + cos(winkel) * anziehung ;Geschwindigkeit vertikal
   
   meteor_x# = meteor_x# + meteor_vx#
   meteor_y# = meteor_y# + meteor_vy#
   
   Color 255,255,255
   Oval planet_x#-10,planet_y#-10,20,20
   
   Color 128,128,128
   Oval meteor_x#-5,meteor_y#-5,10,10
   
   Text 0,0,"Winkel: "+winkel
   Text 0,12,"Entfernung: "+entfernung
   Text 400,0,"anziehung: "+anziehung
   Text 400,12,"vx: "+meteor_vx
   Text 400,24,"vy: "+meteor_vy
   Text 400,36,"v: "+(sqr(meteor_vx^2+meteor_vy^2))
   
   Flip
Until KeyHit(1)
End


edit: die formel für anziehung# ist garantiert falsch. Smile
Athlon 64 3700+ | 1024 MB RAM | GeForce 7900 GT | Blitz2D, Blitz3D, BlitzPlus, BlitzMax
 

Knartz

BeitragDi, Sep 27, 2005 18:58
Antworten mit Zitat
Benutzer-Profile anzeigen
danke für die codes, sehr lehrreich

mir ist gestern abend als ich nicht einschlafen konnte folgendes eingefallen :

BlitzBasic: [AUSKLAPPEN]


alpha = ATan2(\"insert bla here\") ; um den winkel zu bekommen
If alpha <= 180 Then x_mod = alpha/90
If alpha > 180 Then x_mod = Abs(alpha-360)/90
x_grav = (1-x_mod)*g_mod



zuerst benutzt man atan2() um den winkel zu bekommen
dann den winkel / 90 um eine zahl zwischen 0 und 2 zu bekommen.
z.B.: 0° = 0 45° = 1/2 90° = 1 ... 180° = 2
1 - wert , ergibt jetzt den anteil den die gravitation auf die x-bewegung ausübt...
z.B.:
45° = 1/2 = 1-1/2 = 1/2 * g

soweit so gut ... oder ?

@tft
ich hab b3d - aber wie meinst du jetzt, dass das entity system die berechnung ersetzt/verkürzt ?

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group