Advertisement
Guest User

Untitled

a guest
Sep 29th, 2016
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.09 KB | None | 0 0
  1. // NBody_Simulation.cpp : Defines the entry point for the console application.
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include <iostream>
  6. #include <glut.h>
  7. #include <windows.h>
  8. #include <stdlib.h>
  9. #include <vector>
  10. #include <random>
  11. #include <cmath>
  12. #include <vector>
  13. #include <omp.h>
  14. #define GC 6.67408*pow(10,-11)
  15. #define TIMESTAMP 150
  16. #define INTERVAL 20
  17. #define DIMENSION 400
  18. #define SIZE 10
  19. #define ITERATION 1000
  20. #define SCALING_FACTOR 10000
  21.  
  22. using namespace std;
  23.  
  24. struct Particle {
  25. double x, y, mass;
  26. float ux, uy;
  27. unsigned char r, g, b, a;
  28. };
  29. vector<Particle> particles;
  30. vector<Particle> particlesToDisplay;
  31. vector<double> distTravelX;
  32. vector<double> distTravelY;
  33.  
  34. double distanceX(Particle p1, Particle p2) {
  35. return abs(p2.x - p1.x);
  36. }
  37. double distanceY(Particle p1, Particle p2) {
  38. return abs(p2.y - p1.y);
  39. }
  40.  
  41. int ROUND = 0;
  42. void timer(int value){
  43. for (size_t i = 0; i < particlesToDisplay.size()&& (ROUND*particlesToDisplay.size())<(ITERATION*SIZE); i++){
  44. particlesToDisplay[i].x += distTravelX[i+(ROUND*particlesToDisplay.size())] * SCALING_FACTOR;
  45. particlesToDisplay[i].y += distTravelY[i + (ROUND*particlesToDisplay.size())] * SCALING_FACTOR;
  46. }
  47. ++ROUND;
  48. glutPostRedisplay();
  49. glutTimerFunc(INTERVAL, timer, 1);
  50. }
  51.  
  52. void display(void){
  53. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  54.  
  55. glMatrixMode(GL_PROJECTION);
  56. glLoadIdentity();
  57. glOrtho(-DIMENSION, DIMENSION, -DIMENSION, DIMENSION, -1, 1);
  58.  
  59. glMatrixMode(GL_MODELVIEW);
  60. glLoadIdentity();
  61.  
  62. glColor3ub(255, 255, 255);
  63. glEnableClientState(GL_VERTEX_ARRAY);
  64. glEnableClientState(GL_COLOR_ARRAY);
  65. glVertexPointer(2, GL_DOUBLE, sizeof(Particle), &particlesToDisplay[0].x);
  66. glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(Particle), &particlesToDisplay[0].r);
  67. glPointSize(3.0);
  68. glDrawArrays(GL_POINTS, 0, particlesToDisplay.size());
  69. glDisableClientState(GL_VERTEX_ARRAY);
  70. glDisableClientState(GL_COLOR_ARRAY);
  71. glFlush();
  72. glutSwapBuffers();
  73. }
  74.  
  75. int main(int argc, char *argv[]){
  76. glutInit(&argc, argv);
  77. glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE);
  78.  
  79. glutInitWindowSize(1920, 1010);
  80. glutCreateWindow("NBody");
  81.  
  82. glutDisplayFunc(display);
  83. glutTimerFunc(INTERVAL, timer, 1);
  84.  
  85. int i, j;
  86. double distance;
  87. for (i = 0;i<SIZE;i++) {
  88. Particle pt;
  89. pt.x = -100 + (rand() % 100);
  90. pt.y = -100 + (rand() % 100);
  91. pt.mass = (rand() % 255) + 50;
  92. pt.ux = 0;
  93. pt.uy = 0;
  94. pt.r = rand() % 255;
  95. pt.g = rand() % 255;
  96. pt.b = rand() % 255;
  97. pt.a = 255;
  98. particles.push_back(pt);
  99. }
  100. //particles[3].mass = 10000;
  101. vector<double> ForcesX;
  102. vector<double> ForcesY;
  103. particlesToDisplay = particles;
  104. for (int k = 0;k < ITERATION;k++) {
  105. ForcesX.clear();
  106. ForcesY.clear();
  107.  
  108. double force = 0.0;
  109. for (i = 0;i < SIZE;i++) {
  110. force = 0.0;
  111. #pragma omp parallel for private(distance) reduction(+:force)
  112. for (j = 0;j < particles.size();j++) {
  113. if (i == j)
  114. continue;
  115. distance = distanceX(particles[i], particles[j]);
  116. force += (-1) * ((GC*(particles[i].mass*particles[j].mass)) / pow(distance, 2))*((particles[j].x - particles[i].x) / abs(particles[j].x - particles[i].x));
  117. }
  118. cout << force << endl;
  119. ForcesX.push_back(force);
  120. }
  121. cout << endl;
  122. for (i = 0;i < SIZE;i++) {
  123. force = 0.0;
  124. #pragma omp parallel for private(distance) reduction(+:force)
  125. for (j = 0;j < particles.size();j++) {
  126. if (i == j)
  127. continue;
  128. distance = distanceY(particles[i], particles[j]);
  129. force += (-1) * ((GC*(particles[i].mass*particles[j].mass)) / pow(distance, 2))*((particles[j].y - particles[i].y) / abs(particles[j].y - particles[i].y));
  130. }
  131. ForcesY.push_back(force);
  132. }
  133. for (i = 0;i < SIZE;i++) {
  134. double distX = (particles[i].ux*TIMESTAMP) + (0.5*(ForcesX[i] / particles[i].mass))*pow(TIMESTAMP, 2);
  135. distTravelX.push_back(distX);
  136. particles[i].x += distX;
  137. particles[i].ux = particles[i].ux + ((ForcesX[i] / particles[i].mass)*TIMESTAMP);
  138. }
  139. for (i = 0;i < SIZE;i++) {
  140. double distY = (particles[i].uy*TIMESTAMP) + (0.5*(ForcesY[i] / particles[i].mass))*pow(TIMESTAMP, 2);
  141. distTravelY.push_back(distY);
  142. particles[i].y += distY;
  143. particles[i].uy = particles[i].uy + ((ForcesY[i] / particles[i].mass)*TIMESTAMP);
  144. }
  145. }
  146. glutMainLoop();
  147. return 0;
  148. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement