Guest User

Untitled

a guest
Jul 25th, 2018
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Type Vector_2D
  2.     As Single X, Y
  3. End Type
  4.  
  5. Type Planet_t
  6.     As Planet_t Ptr nachPlanet
  7.     As Planet_t Ptr vorPlanet
  8.     As Vector_2D Pos, Vel, Scrn
  9.     As Single Mass
  10.     As single Grav_Param
  11.     As single Density
  12.     As Single Radius
  13.     As Integer Col
  14.     As Ubyte Life_State
  15.     As UInteger ID
  16. End Type
  17. Dim As Vector_2D Dist, Scrn_Center
  18. Const Pi = 4*Atn(1), TwoPi = Pi*2, Gravity = 6.67e-11
  19. Dim As Ubyte Red, Grn, Blu
  20. Dim As Short a, b, FPS, FPS_Counter, Num_Planets, Num_Asteroids, num_moons
  21. dim Shared As Integer Screen_X, Screen_Y, Screen_Rate, Mouse_X, Mouse_Y, _
  22. Mouse_X_old, Mouse_Y_old, wheel, wheel_old, Mouse_Button, Mouse_Button_Old, _
  23. Screen_X_Mid, Screen_Y_Mid, Scroll_factor,lebende,tode
  24. Dim Shared As Single Spawn_Angle, Spawn_Distance, Distance, Dist_Sqared, MinDist, _
  25. Vel_Mag, zoom_scale, zoom_scale_old, Inv_Zoom_Scale, Time_Scale, FPS_timer, _
  26. Scroll_Rate, Screen_Update
  27.  
  28. '  screen settings
  29. ScreenInfo Screen_X, Screen_Y,,,,Screen_Rate
  30. screen_update = 1/screen_rate
  31. Screen_X_Mid = Screen_X\2
  32. Screen_Y_Mid = Screen_Y\2
  33. ScreenRes screen_x, screen_y, 32,2',1 ', Screen_Rate
  34. Color RGB(32, 255, 32)
  35.  
  36. '  program settings
  37. Scroll_Factor = 400
  38. Zoom_Scale = 1/8
  39. Time_Scale = 10
  40. Num_Planets = 10
  41. Num_Asteroids = 1000'5000
  42. lebende =5000
  43. Dim As Planet_t Body(0 to Num_Planets+Num_Asteroids)
  44.  
  45. Randomize Timer
  46. CONST NIL = 0
  47.  
  48. Declare Sub MakePlanetStart(id As UInteger,mass As Single,dens As Single,Posi As Vector_2D,vel As Vector_2D,col As UInteger)
  49. Declare Sub MakePlanetEnde(id As UInteger,mass As Single,dens As Single,Posi As Vector_2D,vel As Vector_2D, col As UInteger)
  50. Declare Sub DeletePlanetStart( id As UInteger)
  51. Declare Sub DeletePlanetMitte( id As UInteger)
  52. Declare Sub DeletePlanetEnde( id As UInteger)
  53.  
  54. Dim Shared PlanetStart As Planet_t Ptr
  55. Dim Shared PlanetEnde As Planet_t Ptr
  56.  
  57.  
  58. SUB MakePlanetStart(id As UInteger,mass As Single,dens As Single,Posi As Vector_2D,vel As Vector_2D,col As UInteger)
  59.     If PlanetStart = 0 Then 'Falls die Liste leer ist: Anlegen!
  60.         PlanetStart = ALLOCATE(SIZEOF(Planet_t))
  61.         PlanetStart->vorPlanet = 0
  62.         PlanetStart->nachPlanet = 0                                                                                                                                                                     '!!!
  63.         PlanetStart->Mass=mass
  64.         PlanetStart->Grav_Param=mass*Gravity
  65.         PlanetStart->Density=dens
  66.         PlanetStart->Radius=((mass/dens)/((4/3)*pi))^(1/3)
  67.         PlanetStart->Pos.X=Posi.X
  68.         PlanetStart->Pos.Y=Posi.Y
  69.         PlanetStart->Vel.X=vel.X
  70.         PlanetStart->Vel.Y=vel.Y
  71.         PlanetStart->ID=id
  72.         PlanetStart->Col=col
  73.         PlanetEnde=PlanetStart
  74.  
  75.     Else       '...falls nicht: Neues Element anlegen und
  76.         'Liste daran anhängen!
  77.         Dim Neu As Planet_t PTR
  78.         Neu = ALLOCATE(SIZEOF(Planet_t))    'Speicher
  79.         'alloziieren
  80.         Neu->Mass=mass
  81.         Neu->Grav_Param=mass*Gravity
  82.         Neu->Density=dens
  83.         Neu->Radius=((mass/dens)/((4/3)*pi))^(1/3)
  84.         Neu->Pos.X=Posi.X
  85.         Neu->Pos.Y=Posi.Y
  86.         Neu->Vel.X=vel.X
  87.         Neu->Vel.Y=vel.Y
  88.         Neu->Col=col
  89.         Neu->ID=id
  90.         Neu->vorPlanet = 0
  91.         Neu->nachPlanet = PlanetStart   'Ehem. Listenanfang als
  92.         '"Nächstes" definieren
  93.         PlanetStart->vorPlanet = Neu                                                                                                                                                                            '!!!
  94.         PlanetStart = Neu                                                       'Listenanfang auf das neue Element
  95.         'setzen
  96.     End If
  97. END Sub
  98. Sub MakePlanetEnde (id As UInteger,mass As Single,dens As Single,Posi As Vector_2D,vel As Vector_2D,col As UInteger)
  99.     If PlanetEnde = 0 Then   'Falls die Liste leer ist: Anlegen!
  100.         PlanetEnde = ALLOCATE(SIZEOF(Planet_t))
  101.         PlanetEnde->vorPlanet= 0
  102.         PlanetEnde->nachPlanet = 0
  103.         PlanetEnde->Mass=mass
  104.         PlanetEnde->Grav_Param=mass*Gravity
  105.         PlanetEnde->Density=dens
  106.         PlanetEnde->Pos.X=Posi.X
  107.         PlanetEnde->Pos.Y=Posi.Y
  108.         PlanetEnde->Vel.X=vel.X
  109.         PlanetEnde->Vel.Y=vel.Y
  110.         PlanetEnde->Radius=((mass/dens)/((4/3)*pi))^(1/3)
  111.         PlanetEnde->Col=col
  112.         PlanetEnde->ID=id
  113.         PlanetStart=PlanetEnde
  114.     Else              '...falls nicht: Neues Element anlegen
  115.         'und anhängen!
  116.         Dim Element As Planet_t PTR
  117.         Dim Neu As Planet_t PTR
  118.         Neu = ALLOCATE(SIZEOF(Planet_t))    'Speicher
  119.         'alloziieren
  120.         Neu->Mass=mass
  121.         Neu->Grav_Param=mass*Gravity
  122.         Neu->Density=dens
  123.         Neu->Radius=((mass/dens)/((4/3)*pi))^(1/3)
  124.         Neu->Pos.X=Posi.X
  125.         Neu->Pos.Y=Posi.Y
  126.         Neu->Vel.X=vel.X
  127.         Neu->Vel.Y=vel.Y
  128.         Neu->Col=col
  129.         Neu->nachPlanet = 0
  130.         Neu->vorPlanet = PlanetEnde
  131.         Neu->ID=id
  132.  
  133.         PlanetEnde->nachPlanet = Neu                                                                                                                                                                    '!!!
  134.         PlanetEnde=Neu
  135.     End If
  136. END Sub
  137. Sub DeletePlanetStart (id As UInteger)
  138.  
  139.     If PlanetStart = 0 Then
  140.         Print "Fehler: Die Liste ist leer!"
  141.         Exit Sub
  142.     End If
  143.     Dim Element As Planet_t Ptr
  144.  
  145.     Element = PlanetStart
  146.     While Element <> 0
  147.  
  148.  
  149.         If Element->ID = id Then
  150.             If Element = PlanetStart And Element = PlanetEnde Then
  151.                 PlanetStart = 0
  152.                 PlanetEnde = 0
  153.             ElseIf Element = PlanetStart Then
  154.                 PlanetStart = Element->nachPlanet
  155.                 PlanetStart->vorPlanet = 0
  156.             ElseIf Element = PlanetEnde Then
  157.                 PlanetEnde = Element->vorPlanet
  158.                 PlanetEnde->nachPlanet = 0
  159.             Else
  160.                 Element->vorPlanet->nachPlanet = Element->nachPlanet
  161.                 Element->nachPlanet->vorPlanet = Element->vorPlanet
  162.             EndIf
  163.             DeAllocate Element
  164.             Exit Sub
  165.         End If
  166.  
  167.         Element = Element->nachPlanet
  168.  
  169.     Wend
  170. End Sub
  171. Sub DeletePlanetEnde (id As UInteger)
  172.  
  173.     If PlanetEnde = 0 Then
  174.         Print "Fehler: Die Liste ist leer!"
  175.         Exit Sub
  176.     End If
  177.     Dim Element As Planet_t Ptr
  178.  
  179.     Element = PlanetEnde
  180.  
  181.     While Element <> 0
  182.  
  183.         If Element->ID = id Then
  184.             If Element = PlanetStart And Element = PlanetEnde Then
  185.                 PlanetStart = 0
  186.                 PlanetEnde = 0
  187.             ElseIf Element = PlanetStart Then
  188.                 PlanetStart = Element->nachPlanet
  189.                 PlanetStart->vorPlanet = 0
  190.             ElseIf Element = PlanetEnde Then
  191.                 PlanetEnde = Element->vorPlanet
  192.                 PlanetEnde->nachPlanet = 0
  193.             Else
  194.                 Element->vorPlanet->nachPlanet = Element->nachPlanet
  195.                 Element->nachPlanet->vorPlanet = Element->vorPlanet
  196.             EndIf
  197.             DeAllocate Element
  198.             Exit Sub
  199.         End If
  200.  
  201.         Element = Element->vorPlanet
  202.     Wend
  203. End Sub
  204. Sub Calc()
  205.     Dim Element_o As Planet_t Ptr
  206.     Dim Element_i As Planet_t Ptr
  207.     Dim helper As Planet_t Ptr
  208.  
  209.     Element_o = PlanetStart
  210.     While (Element_o <> 0)
  211.         'If Element_o = PlanetStart And Element_o = PlanetEnde Then Exit sub
  212.         Element_i = Element_o->nachPlanet
  213.         While (Element_i <> 0)
  214.             'If Element_i = PlanetStart And Element_i = PlanetEnde Then Exit sub
  215.             Dim As Single DistX = Element_o->Pos.X-Element_i->Pos.X
  216.             Dim As Single DistY = Element_o->Pos.Y-Element_i->Pos.Y
  217.             Dim As Single Dist_Sqared = DistX^2+DistY^2
  218.             Dim As Single Distance = Sqr(Dist_Sqared)
  219.             Dim As Single MinDist = Element_o->Radius+Element_i->Radius
  220.             If Distance < MinDist Then
  221.                 If Element_i->Mass < Element_o->Mass Then
  222.                     Element_o->Mass+=Element_i->Mass
  223.                     Element_o->Density=(Element_o->Density+Element_i->Density)/2
  224.                     Element_o->Radius=(Element_o->Mass/Element_o->Density)/((4/3)*pi)^(1/3)
  225.                     Element_o->Vel.X+=Element_i->Vel.X/Element_o->Mass
  226.                     Element_o->Vel.Y+=Element_i->Vel.Y/Element_o->Mass
  227.                     Element_o->Grav_Param=Element_o->Mass*Gravity
  228.                     If Element_o->ID>Element_i->ID Then
  229.                         helper=Element_i->nachPlanet
  230.                         DeletePlanetStart(Element_i->ID)
  231.                         Element_i=helper'->nachPlanet
  232.                         'Element_i=Element_i->nachPlanet
  233.                         tode+=1
  234.                         'Continue While
  235.                     Else
  236.                         helper=Element_i->nachPlanet
  237.                         DeletePlanetEnde(Element_i->ID)
  238.                         Element_i=helper'->nachPlanet
  239.                         'Element_i=Element_i->nachPlanet
  240.                         tode+=1
  241.                         'continue while
  242.                     EndIf
  243.                 Else
  244.                     Element_o->Life_State = 2'Dist_Sqared = MinDist^2
  245.                     Element_i->Mass+=Element_o->Mass
  246.                     Element_i->Density=(Element_i->Density+Element_o->Density)/2
  247.                     Element_i->Radius=((Element_i->Mass/Element_i->Density)/((4/3)*pi))^(1/3)
  248.                     Element_i->Vel.X+=Element_o->Vel.X/Element_i->Mass
  249.                     Element_i->Vel.Y+=Element_o->Vel.Y/Element_i->Mass
  250.                     Element_i->Grav_Param=Element_i->Mass*Gravity
  251.                     If Element_o->ID>Element_i->ID Then
  252.                         helper=Element_o->nachPlanet
  253.                         DeletePlanetEnde(Element_o->ID)
  254.                         Element_o=helper'->nachPlanet
  255.                         tode+=1
  256.                     Else
  257.                         helper=Element_o->nachPlanet
  258.                         DeletePlanetStart(Element_o->ID)
  259.                         Element_o=helper'->nachPlanet
  260.                         tode+=1
  261.                     EndIf
  262.                 EndIf
  263.             Else
  264.                 Dim As Single Vel_Mag = (Element_i->Grav_Param/Dist_Sqared)*Time_Scale
  265.                 Element_o->Vel.X -= (DistX/Distance)*Vel_Mag
  266.                 Element_o->Vel.Y -= (DistY/Distance)*Vel_Mag
  267.                 Vel_Mag = (Element_o->Grav_Param/Dist_Sqared)*Time_Scale
  268.                 Element_i->Vel.X += (DistX/Distance)*Vel_Mag
  269.                 Element_i->Vel.Y += (DistY/Distance)*Vel_Mag
  270.                 Element_i = Element_i->nachPlanet
  271.             EndIf
  272.         Wend
  273.         Element_o->Pos.X += Element_o->Vel.X*Time_Scale
  274.         Element_o->Pos.Y += Element_o->Vel.Y*Time_Scale
  275.         Element_o = Element_o->nachPlanet
  276.         'Element_i = PlanetStart
  277.     Wend
  278. End Sub
  279. Sub ListeAusgeben()
  280.     If PlanetStart = 0 THEN
  281.         PRINT "Fehler: Die Liste ist leer!"
  282.         EXIT SUB
  283.     END IF
  284.     DIM Element As Planet_t PTR
  285.     Element = PlanetStart                        'Zeiger auf
  286.     'If Element = PlanetStart And Element = PlanetEnde Then Exit Sub
  287.     'den Anfang setzen.
  288.     Do
  289.         Color Element->Col
  290.         Print Using "#### #######.# ######.# #####.# +####.# +####.# +####.# +####.# ####";Element->ID;Element->Mass;Element->Grav_Param;Element->Radius;Element->Pos.X;Element->Pos.Y;Element->Vel.X;Element->Vel.Y;tode
  291.         If Element->nachPlanet <> 0 Then    'Listenende noch
  292.             'nicht erreicht?
  293.             Element = Element->nachPlanet   'Dann ein Element
  294.             'weitergehen!
  295.         Else
  296.             Exit Do                        'Ansonsten Schleife
  297.             'verlassen.
  298.         End If
  299.     Loop
  300. END SUB
  301.  
  302. Dim Posi As Vector_2D
  303. Dim vel As Vector_2D
  304. vel.X=0
  305. vel.Y=0
  306. posi.X=0
  307. posi.Y=0
  308.  
  309. MakePlanetStart(0,1e13,55000,Scrn_Center,vel,RGBA(48+Rnd*208, 48+Rnd*208, 48+Rnd*208, 48+Rnd*208))
  310. For i As Integer=1 To 60
  311.     Dim As Single Spawn_Angle = Rnd*TwoPi
  312.     Dim As Single Spawn_Distance = (((1e13/55000)/((4/3)*pi))^(1/3)) + 400 + Rnd*5200'400+(Rnd*4000)
  313.     Dim As Single Mass = 1e6+(Rnd*19e6^(1/6))^6
  314.     dim as single Grav_Param = Mass*Gravity
  315.     Dim As Single Density = 25000'+Rnd*3500
  316.     Dim As Single Radius = ((Mass/Density)/((4/3)*pi))^(1/3)
  317.     Dim As UByte Red = 64+Rnd*191
  318.     Dim As UByte Grn = Red-32+Rnd*32
  319.     Dim As UByte Blu = Grn-32+Rnd*32
  320.     Dim As UInteger Col = RGB(Red, Grn, Blu)
  321.     Posi.X = Scrn_Center.X-Spawn_Distance*Sin(Spawn_Angle)
  322.     Posi.Y = Scrn_Center.Y-Spawn_Distance*Cos(Spawn_Angle)
  323.     Vel.X = sqr(1e13*Gravity/Spawn_Distance)*Cos(Spawn_Angle)
  324.     Vel.Y = sqr(1e13*Gravity/Spawn_Distance)*Sin(-Spawn_Angle)
  325.     If Int(Rnd*10) = 0 Then
  326.         Vel.X = -Vel.X
  327.         Vel.Y = -Vel.Y
  328.     EndIf
  329.  
  330.     MakePlanetEnde(i,Mass,Density,Posi,vel,Col)
  331. Next
  332.  
  333.  
  334. 'ListeAusgeben()
  335. While InKey=""
  336.     Calc()
  337.     Locate 1,1
  338.     ScreenLock
  339.     Line(0,0)-(Screen_X,Screen_Y),0,BF
  340.     ListeAusgeben()
  341.     ScreenUnLock
  342. Wend
  343.  
  344. For i As Integer=0 To 60
  345.     DeletePlanetStart(i)
  346. next
  347. end
Add Comment
Please, Sign In to add comment