Advertisement
Guest User

Untitled

a guest
Jan 29th, 2020
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.59 KB | None | 0 0
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>Capture 1.0.2</title>
  5. <meta charset="UTF-8"/>
  6. <style>
  7. </style>
  8. </head>
  9. <body>
  10. <canvas id="canvas" width="1000" height="800" style="border:1px solid #d3d3d3;"></canvas>
  11. <p id="hud">Ready...</p>
  12. <script>
  13.  
  14. var theCanvas = document.getElementById("canvas");
  15. var ctx = theCanvas.getContext("2d");
  16.  
  17. var n = 100; // n-body physics
  18. var s = 1000;
  19. var x = []; // x-coordinate
  20. var y = []; // y-coordinate
  21. var xv = []; // x-velocity
  22. var yv = []; // y-velocity
  23. var m = []; // mass
  24. var halfPi = Math.PI / 2;
  25.  
  26. // random floating point
  27. function randfloat(min, max) {
  28. return Math.random() * (max - min) + min; // min inclusive, max excluded
  29. }
  30.  
  31. // random integer
  32. function randint(min, max) {
  33. min = Math.ceil(min);
  34. max = Math.floor(max);
  35. return Math.floor(Math.random() * (max - min + 1)) + min; // min and max inclusive
  36. }
  37.  
  38. function init() {
  39.  
  40. // A main star
  41. x[0] = 500;
  42. y[0] = 400;
  43. xv[0] = 0;
  44. yv[0] = 0;
  45. m[0] = 1; // try mass 100, 1000, and other values
  46.  
  47. // Satellites starting in nearly circular orbits around main star
  48. var min = 50;
  49. var max = 400;
  50.  
  51. for (var i = 1; i < s; i++) {
  52. var theta = randfloat(0, halfPi * 4); // Direction from star
  53. var radius = randfloat(min, max); // Distance from star
  54.  
  55. var equation = (radius - min) / (max - min); // Even distribution away from central focus.
  56. if (equation < Math.random()) {
  57. radius = max - radius + min;
  58. }
  59.  
  60. x[i] = x[0]+Math.sin(theta) * radius; // Locate on grid
  61. y[i] = y[0]+Math.cos(theta) * radius;
  62. xv[i] = Math.sin(theta + halfPi) * (.0012 * radius); // Circular orbit within distributed disk.
  63. yv[i] = Math.cos(theta + halfPi) * (.0012 * radius);
  64. // xv[i] = Math.sin(theta + halfPi) * Math.pow(m[0] / radius, 0.5); // Circular orbit around dominant center.
  65. // yv[i] = Math.cos(theta + halfPi) * Math.pow(m[0] / radius, 0.5);
  66. m[i] = 0;
  67. if (i < n) {
  68. m[i] = 1;
  69. }
  70. }
  71.  
  72. /*
  73. // Set planet 1.
  74. var theta = halfPi * 0;
  75. var radius = 100;
  76. x[1] = x[0]+Math.sin(theta) * radius;
  77. y[1] = y[0]+Math.cos(theta) * radius;
  78. xv[1] = Math.sin(theta + halfPi) * Math.pow(m[0] / radius, 0.5);
  79. yv[1] = Math.cos(theta + halfPi) * Math.pow(m[0] / radius, 0.5);
  80. m[1] = 10;
  81.  
  82. // Set planet 2.
  83. var theta = halfPi * 2/3;
  84. var radius = 100;
  85. x[2] = x[0]+Math.sin(theta) * radius;
  86. y[2] = y[0]+Math.cos(theta) * radius;
  87. xv[2] = Math.sin(theta + halfPi) * Math.pow(m[0] / radius, 0.5);
  88. yv[2] = Math.cos(theta + halfPi) * Math.pow(m[0] / radius, 0.5);
  89. m[2] = 1;
  90.  
  91. let xa = 0;
  92. let ya = 0;
  93. let tm = 0;
  94. for (var i = 0; i < n; i++) { // Average mass velocities.
  95. xa += xv[i]*m[i];
  96. ya += yv[i]*m[i];
  97. tm += m[i];
  98. }
  99. for (var i = 0; i < n; i++) { // Correct mass velocities to zero average.
  100. xv[i] += -xa/tm;
  101. yv[i] += -ya/tm;
  102. }
  103. */
  104. }
  105. init();
  106.  
  107. function mainloop() {
  108.  
  109. for (let i = 0; i < s; i++) { // Accelerate all bodies.
  110. for (let j = 0; j < n; j++) { // But only test effects of n bodies (with mass).
  111. if (i != j) {
  112. let xd = x[j] - x[i];
  113. let yd = y[j] - y[i];
  114. let hyp2 = (xd * xd) + (yd * yd);
  115. if (hyp2 > 16) {
  116. iFact = (m[j] / hyp2) / Math.sqrt(hyp2);
  117. xv[i] += xd * iFact;
  118. yv[i] += yd * iFact;
  119. }
  120. else {
  121. iFact = m[j]*0.015625;
  122. xv[i] = (xv[j]*m[j]+xv[i]*m[i])/(m[j]+m[i]);
  123. yv[i] = (yv[j]*m[j]+yv[i]*m[i])/(m[j]+m[i]);
  124. xv[j] = xv[i];
  125. yv[j] = yv[i];
  126. xv[i] += xd * iFact;
  127. yv[i] += yd * iFact;
  128. }
  129. }
  130. }
  131. xv[i] -= .02*xv[i]*(Math.abs(500-x[i])>450)*(((500-x[i])>0)==(xv[i]<0)); // slam on brakes before escape
  132. yv[i] -= .02*yv[i]*(Math.abs(400-y[i])>350)*(((400-y[i])>0)==(yv[i]<0));
  133. }
  134. // xv[0] += (500-x[0])*.00001-xv[0]*.005; // centering ballast with viscosity
  135. // yv[0] += (400-y[0])*.00001-yv[0]*.005;
  136. for (let i = 0; i < s; i++) {
  137. //let pd = Math.ceil(Math.pow(m[i],(1/3))*3+3.01);
  138.  
  139. //ctx.clearRect(x[i]-pd/2, y[i]-pd/2, pd*2, pd*2);
  140.  
  141. autoFade++;
  142. if (autoFade > 10000 / x.length) {
  143. autoFade = 0;
  144. ctx.fillStyle = "rgba(0, 0, 0, " + (50 * 0.002) + ")";
  145. ctx.fillRect(0, 0, theCanvas.width, theCanvas.height);
  146. }
  147.  
  148. x[i] += xv[i];
  149. y[i] += yv[i];
  150. if (Math.floor(i / 2) == i / 2) {
  151. ctx.fillStyle = "yellow";
  152. }
  153. else {
  154. ctx.fillStyle = "white";
  155. }
  156. ctx.fillRect(x[i], y[i], 3, 3);
  157. }
  158. }
  159. var autoFade = 0;
  160.  
  161. var start = setInterval(mainloop, 10);
  162.  
  163. </script>
  164. </body>
  165. </html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement