home *** CD-ROM | disk | FTP | other *** search
/ AMOS PD CD / amospdcd.iso / sourcecode / various / galaxies.amos / galaxies.amosSourceCode
AMOS Source Code  |  1990-04-07  |  6KB  |  196 lines

  1. Rem Colliding Galaxies 
  2. Rem Algorithm by Andrew Rankin 1989  
  3. Rem Amiga conversion by Jeff Tullin 1991 
  4. '
  5. Set Buffer 80
  6. Screen Open 1,640,320,4,Hires
  7. Ink 0 : Paper 0 : Pen 0 : Print : Curs Off 
  8. Screen Open 0,640,320,4,Hires
  9. Ink 0 : Paper 0 : Pen 0 : Print : Curs Off 
  10. Dim X#(1000),Y#(1000),Z#(1000),U#(1000),V#(1000),W#(1000)
  11. Global GALC,A$
  12. Hide On 
  13. '
  14. Repeat 
  15.    Repeat 
  16.       Gosub SETUP
  17.       Locate 5,26 : Print "Setup complete - select (A)lter setup , (R)un simulation , (E)xit  [   ]"
  18.       Locate 74,26 : Clear Key : Repeat : A$=Upper$(Inkey$) : Until(A$="A") or(A$="R") or(A$="E") : Print A$
  19.    Until A$<>"A"
  20. If A$="R" Then Gosub SIMULATION
  21. Until A$="E"
  22. End 
  23. '
  24. SETUP:
  25. Screen 0
  26. Cls 0 : Paper 0 : Pen 2
  27. GALR#=30 : GALM#=5 : GALRI#=10 : GALC=12 : MZ=2
  28. Locate 13,0 : Print "Colliding Galaxies Simulation. Amiga version 1.0"
  29. Print 
  30. Print "This program simulates the passing of two galaxies in close proximity."
  31. Print "To simplify calculations of star positions it is assumed that all of the"
  32. Print "galactic mass is at the centre, and ignores the gravitational effects of any"
  33. Print "surrounding stars. It is also assumed that the effect of forces other than "
  34. Print "gravity are negligible. The target galaxy is taken to be a disk of stars in"
  35. Print "stable circular orbit with zero drift velocity, while the intruder is taken as"
  36. Print "a point of comparable mass."
  37. Locate 1,12 : Print "SET UP:" : Locate 1,13 : Print "In the target galaxy:"
  38. Locate 10,14 : Input "How many rings of stars are required? ";RINGS
  39. Locate 10,15 : Input "How many stars per ring are required? ";STPR
  40. If RINGS=1 Then Inc RINGS
  41. STARS=STPR*RINGS : DR#=(GALR#-GALRI#)/(RINGS-1)
  42. Print " The target galaxy is located at coordinates (0,0,0) with zero drift velocity,"
  43. Print " and mass 5.0 units."; : Print STARS;" stars rotate in orbits of 10 to 30 units."
  44. Locate 1,19 : Print "For the intruder galaxy:"
  45. Locate 10,20 : Input "Mass as a fraction (%) of target galaxy? ";MASSFR#
  46. Locate 10,21 : Print "Distance from target galaxy:"
  47. Locate 10,22 : Input "X (-70 to 70) ? ";D#
  48. Locate 33,22 : Input "Y (-70 to 70) ? ";E#
  49. Locate 56,22 : Input "Z (-35 to 35) ? ";F#
  50. Locate 10,23 : Print "Velocity components:"
  51. Locate 10,24 : Input "X ? ";R#
  52. Locate 33,24 : Input "Y ? ";S#
  53. Locate 56,24 : Input "Z ? ";T#
  54. Screen Copy 0 To 1
  55. Return 
  56. '  
  57. SIMULATION:
  58. Screen 0 : Cls 0
  59. Curs Off 
  60. M#=GALM#
  61. N#=M#*MASSFR#/100
  62. A#=150 : B#=100 : C#=0 : D#=A#+D# : E#=E#+B# : F#=F#+C#
  63. O#=0 : P#=0 : Q#=0
  64. T=0 : I=0 : SF#=2
  65. Locate 14,0 : Print "Colliding Galaxies Simulation. Amiga version 1.0"
  66. Locate 15,1 : Print "--------Target Galaxy--------"
  67. Locate 49,1 : Print "-------Intruder Galaxy-------"
  68. Locate 17,2 : Print "- start:"
  69. Locate 35,2 : Print "- now:"
  70. Locate 51,2 : Print "- start:"
  71. Locate 69,2 : Print "- now:"
  72. Locate 1,3 : Print "Mass" : Locate 15,3 : Print M# : Locate 31,3 : Print M#
  73. Locate 49,3 : Print N# : Locate 65,3 : Print N#
  74. Print " X coordinate"
  75. Print " Y coordinate"
  76. Print " Z coordinate"
  77. Print " Velocity (X)"
  78. Print " Velocity (Y)"
  79. Print " Velocity (Z)"
  80. Print : Print " X-Y plane                              X-Z plane (Z shown * 2)      Time"
  81. Locate 15,4 : Print A# : Locate 49,4 : Print D# : Locate 15,5 : Print B# : Locate 49,5 : Print E#
  82. Locate 15,6 : Print C# : Locate 49,6 : Print F# : Locate 15,7 : Print O# : Locate 49,7 : Print R#
  83. Locate 15,8 : Print P# : Locate 49,8 : Print S# : Locate 15,9 : Print Q# : Locate 49,9 : Print T# : Locate 75,11 : Print T
  84. For J=0 To RINGS-1
  85.    RAD#=J*DR#+GALRI#
  86.    VEL#=Sqr(M#/RAD#)
  87.    THETA#=0.5*VEL#/RAD#
  88.    If J=0 Then VEL#=0.9*VEL#
  89.    For K=0 To STPR-1
  90.       G#=K*2*Pi#/STPR
  91.       X#(I)=RAD#*Cos(G#)+150
  92.       Y#(I)=RAD#*Sin(G#)+100
  93.       Z#(I)=0
  94.       W#(I)=0
  95.       V#(I)=VEL#*Cos(G#-THETA#)
  96.       U#(I)=-VEL#*Sin(G#-THETA#)
  97.       Inc I
  98.    Next 
  99. Next 
  100. Screen Copy 0 To 1
  101. Repeat 
  102.    Screen 1
  103.    Gosub PL0TGALAXIES
  104.    Screen Copy 1 To 0
  105.    For I=0 To STARS-1
  106.       F1#=M#/((X#(I)-A#)^2+(Y#(I)-B#)^2+(Z#(I)-C#)^2+SF#)^1.5
  107.       F2#=N#/((X#(I)-D#)^2+(Y#(I)-E#)^2+(Z#(I)-F#)^2+SF#)^1.5
  108.       AX#=F1#*(A#-X#(I))+F2#*(D#-X#(I))
  109.       AY#=F1#*(B#-Y#(I))+F2#*(E#-Y#(I))
  110.       AZ#=F1#*(C#-Z#(I))+F2#*(F#-Z#(I))
  111.       U#(I)=U#(I)+AX#
  112.       V#(I)=V#(I)+AY#
  113.       W#(I)=W#(I)+AZ#
  114.       X#(I)=X#(I)+U#(I)
  115.       Y#(I)=Y#(I)+V#(I)
  116.       Z#(I)=Z#(I)+W#(I)
  117.    Next 
  118.    RAD#=((A#-D#)^2+(B#-E#)^2+(C#-F#)^2+SF#)^1.5
  119.    AX#=(D#-A#)/RAD#
  120.    AY#=(E#-B#)/RAD#
  121.    AZ#=(F#-C#)/RAD#
  122.    O#=N#*AX#+O#
  123.    P#=N#*AY#+P#
  124.    Q#=N#*AZ#+Q#
  125.    R#=R#-M#*AX#
  126.    S#=S#-M#*AY#
  127.    T#=T#-M#*AZ#
  128.    A#=A#+O#
  129.    B#=B#+P#
  130.    C#=C#+Q#
  131.    D#=D#+R#
  132.    E#=E#+S#
  133.    F#=F#+T#
  134.    Inc T
  135.    If Inkey$<>""
  136.       Proc KEEPRESS
  137.    End If 
  138. Until Param=2
  139. Proc NUL
  140. Return 
  141. '
  142. PL0TGALAXIES:
  143. Pen 2
  144. Locate 31,4 : Print A# : Locate 65,4 : Print D#
  145. Locate 31,5 : Print B# : Locate 65,5 : Print E#
  146. Locate 31,6 : Print C# : Locate 65,6 : Print F#
  147. Locate 31,7 : Print O# : Locate 65,7 : Print R#
  148. Locate 31,8 : Print P# : Locate 65,8 : Print S#
  149. Locate 31,9 : Print Q# : Locate 65,9 : Print T#
  150. Locate 75,11 : Print T
  151. Ink 1 : Box 0,100 To 639,256 : Clip 0,100 To 639,256
  152. G#=(M#*A#+N#*D#)/(M#+N#)
  153. H#=(M#*B#+N#*E#)/(M#+N#)
  154. I#=(M#*C#+N#*F#)/(M#+N#)
  155. '
  156. MZ=1
  157. Ink 0
  158. Bar 1,101 To 638,255
  159. Ink 2
  160. Proc D[(D#-G#)*4.267+320,320-((H#-E#)*4.267)]
  161. Proc D[(D#-G#)*4.267+960,640-((I#-F#)*4.267*MZ+310)]
  162. '
  163. For I=0 To STARS-1
  164.    Proc PLT[(X#(I)-G#)*4.267+320,H#-Y#(I)*4.267+320]
  165.    Proc PLT[(X#(I)-G#)*4.267+960,(I#-Z#(I))*MZ*4.267]
  166. Next 
  167. Return 
  168. Procedure D[A,B]
  169.    Circle A/2,B/2,2
  170. End Proc
  171. Procedure PLT[X,Y]
  172.    Y=640-Y
  173.    X=X/2 : Y=Y/4
  174.    Plot X,Y
  175. End Proc
  176. Procedure KEEPRESS
  177.    Q$=""
  178.    Clear Key 
  179.    Screen Open 2,640,20,4,Hires
  180.    Cls 1 : Paper 1 : Screen Display 2,,200,,
  181.    Centre "Program halted. Save screen / Restart / Continue (S/R/C)?"
  182.    Repeat : Q$=Upper$(Inkey$)
  183.       F$=""
  184.       If Q$="S"
  185.          F$=(Fsel$(":","","Choose a filename","for this screenshot"))
  186.       End If 
  187.       If F$<>""
  188.          Screen 0 : Save Iff(F$)
  189.       End If 
  190.    Until(Q$="S") or(Q$="R") or(Q$="C")
  191.    Screen Close 2
  192.    Repeat : Until Inkey$=""
  193.    If Q$="R" Then L=2
  194. End Proc[L]
  195. Procedure NUL
  196. End Proc[0]