annotate main.cbc @ 1:09e774f4433f

main_GL is runnable.
author kent
date Fri, 30 May 2008 00:00:49 +0900
parents 249965d0a68f
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
249965d0a68f GL is no finish.
kent
parents:
diff changeset
1 #include<stdio.h>
249965d0a68f GL is no finish.
kent
parents:
diff changeset
2 #include<stdlib.h>
249965d0a68f GL is no finish.
kent
parents:
diff changeset
3 #include<unistd.h>
249965d0a68f GL is no finish.
kent
parents:
diff changeset
4 #include<time.h>
249965d0a68f GL is no finish.
kent
parents:
diff changeset
5 #include<SDL.h>
249965d0a68f GL is no finish.
kent
parents:
diff changeset
6 #include<float.h>
249965d0a68f GL is no finish.
kent
parents:
diff changeset
7
249965d0a68f GL is no finish.
kent
parents:
diff changeset
8 #define DEBUGlog(f, args...) \
1
09e774f4433f main_GL is runnable.
kent
parents: 0
diff changeset
9 fprintf(stderr, "in %s: "f, __FUNCTION__, ## args)
0
249965d0a68f GL is no finish.
kent
parents:
diff changeset
10
249965d0a68f GL is no finish.
kent
parents:
diff changeset
11 #define W_HEIGHT 480
249965d0a68f GL is no finish.
kent
parents:
diff changeset
12 #define W_WIDTH 640
249965d0a68f GL is no finish.
kent
parents:
diff changeset
13
249965d0a68f GL is no finish.
kent
parents:
diff changeset
14 /*
249965d0a68f GL is no finish.
kent
parents:
diff changeset
15 N body problem
249965d0a68f GL is no finish.
kent
parents:
diff changeset
16 */
249965d0a68f GL is no finish.
kent
parents:
diff changeset
17
249965d0a68f GL is no finish.
kent
parents:
diff changeset
18 static int NUM_BODY = 3;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
19 //static float Gravitation = 6.67e-11 ;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
20 //static float delta = 100;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
21 //static float FIELD = 2e11;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
22 static float Gravitation = 1.0f; // ?
249965d0a68f GL is no finish.
kent
parents:
diff changeset
23 static float delta = 0.05f; //
249965d0a68f GL is no finish.
kent
parents:
diff changeset
24 static float FIELD = 400.0f; // -100 ~ 100
1
09e774f4433f main_GL is runnable.
kent
parents: 0
diff changeset
25 static const float eps = 15.0f;
0
249965d0a68f GL is no finish.
kent
parents:
diff changeset
26
249965d0a68f GL is no finish.
kent
parents:
diff changeset
27 typedef struct
249965d0a68f GL is no finish.
kent
parents:
diff changeset
28 {
249965d0a68f GL is no finish.
kent
parents:
diff changeset
29 /* star's parameter. */
249965d0a68f GL is no finish.
kent
parents:
diff changeset
30 float weight;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
31 float a[3]; /* acceleration */
249965d0a68f GL is no finish.
kent
parents:
diff changeset
32 float v[3]; /* velocity */
249965d0a68f GL is no finish.
kent
parents:
diff changeset
33 float r[3]; /* position */
249965d0a68f GL is no finish.
kent
parents:
diff changeset
34 /* for SDL. */
249965d0a68f GL is no finish.
kent
parents:
diff changeset
35 SDL_Rect rect;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
36 } body;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
37 body *stars_old, *stars_new;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
38
249965d0a68f GL is no finish.
kent
parents:
diff changeset
39 void start(void);
249965d0a68f GL is no finish.
kent
parents:
diff changeset
40 __code initialize(int num);
249965d0a68f GL is no finish.
kent
parents:
diff changeset
41 __code randomInit(SDL_Surface *screen, int num);
249965d0a68f GL is no finish.
kent
parents:
diff changeset
42 __code starsInit(SDL_Surface *screen, int num);
249965d0a68f GL is no finish.
kent
parents:
diff changeset
43 __code loop(int count, SDL_Surface *screen, int num);
249965d0a68f GL is no finish.
kent
parents:
diff changeset
44 __code compute(int count, SDL_Surface *screen, int num);
249965d0a68f GL is no finish.
kent
parents:
diff changeset
45 __code nextTurn(int count, SDL_Surface *screen, int num);
249965d0a68f GL is no finish.
kent
parents:
diff changeset
46 __code moveCenter(int count, SDL_Surface *screen, int num);
249965d0a68f GL is no finish.
kent
parents:
diff changeset
47 __code CenteringVelocity(int count, SDL_Surface *screen, int num);
249965d0a68f GL is no finish.
kent
parents:
diff changeset
48
249965d0a68f GL is no finish.
kent
parents:
diff changeset
49 int main(int argc, char **argv)
249965d0a68f GL is no finish.
kent
parents:
diff changeset
50 {
249965d0a68f GL is no finish.
kent
parents:
diff changeset
51 int ch;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
52 while ((ch = getopt(argc, argv, "s:g:")) != -1) {
249965d0a68f GL is no finish.
kent
parents:
diff changeset
53 switch (ch) {
249965d0a68f GL is no finish.
kent
parents:
diff changeset
54 case 's':
249965d0a68f GL is no finish.
kent
parents:
diff changeset
55 delta = atof(optarg);
249965d0a68f GL is no finish.
kent
parents:
diff changeset
56 break;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
57 case 'g':
249965d0a68f GL is no finish.
kent
parents:
diff changeset
58 Gravitation = atof(optarg);
249965d0a68f GL is no finish.
kent
parents:
diff changeset
59 break;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
60 case '?':
249965d0a68f GL is no finish.
kent
parents:
diff changeset
61 default:
249965d0a68f GL is no finish.
kent
parents:
diff changeset
62 break;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
63 }
249965d0a68f GL is no finish.
kent
parents:
diff changeset
64 }
249965d0a68f GL is no finish.
kent
parents:
diff changeset
65 start();
249965d0a68f GL is no finish.
kent
parents:
diff changeset
66 return 0;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
67 }
249965d0a68f GL is no finish.
kent
parents:
diff changeset
68 void start()
249965d0a68f GL is no finish.
kent
parents:
diff changeset
69 {
249965d0a68f GL is no finish.
kent
parents:
diff changeset
70 goto initialize(NUM_BODY);
249965d0a68f GL is no finish.
kent
parents:
diff changeset
71 }
249965d0a68f GL is no finish.
kent
parents:
diff changeset
72
249965d0a68f GL is no finish.
kent
parents:
diff changeset
73 __code finish(int ret)
249965d0a68f GL is no finish.
kent
parents:
diff changeset
74 {
249965d0a68f GL is no finish.
kent
parents:
diff changeset
75 DEBUGlog("Gravity = %e\n", Gravitation);
249965d0a68f GL is no finish.
kent
parents:
diff changeset
76 DEBUGlog("FLT_MAX = %e\n", FLT_MAX);
249965d0a68f GL is no finish.
kent
parents:
diff changeset
77 DEBUGlog("FLT_MAX_EXP = %d\n", FLT_MAX_EXP);
249965d0a68f GL is no finish.
kent
parents:
diff changeset
78 DEBUGlog("FLT_MIN = %e\n", FLT_MIN);
249965d0a68f GL is no finish.
kent
parents:
diff changeset
79 DEBUGlog("FLT_MIN_EXP = %d\n", FLT_MIN_EXP);
249965d0a68f GL is no finish.
kent
parents:
diff changeset
80 DEBUGlog("FLT_EPSILON = %e\n", FLT_EPSILON);
249965d0a68f GL is no finish.
kent
parents:
diff changeset
81 free(stars_old);
249965d0a68f GL is no finish.
kent
parents:
diff changeset
82 free(stars_new);
249965d0a68f GL is no finish.
kent
parents:
diff changeset
83 exit(ret);
249965d0a68f GL is no finish.
kent
parents:
diff changeset
84 }
249965d0a68f GL is no finish.
kent
parents:
diff changeset
85
249965d0a68f GL is no finish.
kent
parents:
diff changeset
86
249965d0a68f GL is no finish.
kent
parents:
diff changeset
87 __code initialize(int num)
249965d0a68f GL is no finish.
kent
parents:
diff changeset
88 {
249965d0a68f GL is no finish.
kent
parents:
diff changeset
89 SDL_Surface *screen;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
90
249965d0a68f GL is no finish.
kent
parents:
diff changeset
91 /* malloc. */
249965d0a68f GL is no finish.
kent
parents:
diff changeset
92 stars_old = malloc( sizeof(body)*num );
249965d0a68f GL is no finish.
kent
parents:
diff changeset
93 stars_new = malloc( sizeof(body)*num );
249965d0a68f GL is no finish.
kent
parents:
diff changeset
94 if (stars_old==NULL||stars_new==NULL){
249965d0a68f GL is no finish.
kent
parents:
diff changeset
95 perror("malloc");
249965d0a68f GL is no finish.
kent
parents:
diff changeset
96 goto finish(1);
249965d0a68f GL is no finish.
kent
parents:
diff changeset
97 }
249965d0a68f GL is no finish.
kent
parents:
diff changeset
98
249965d0a68f GL is no finish.
kent
parents:
diff changeset
99 /* SDL initialization. */
249965d0a68f GL is no finish.
kent
parents:
diff changeset
100 if(SDL_Init(SDL_INIT_VIDEO) < 0){ //Could we start SDL_VIDEO?
249965d0a68f GL is no finish.
kent
parents:
diff changeset
101 fprintf(stderr,"Couldn't init SDL"); //Nope, output to stderr and quit
249965d0a68f GL is no finish.
kent
parents:
diff changeset
102 exit(1);
249965d0a68f GL is no finish.
kent
parents:
diff changeset
103 }
249965d0a68f GL is no finish.
kent
parents:
diff changeset
104 screen = SDL_SetVideoMode(W_WIDTH, W_HEIGHT, 32, SDL_HWSURFACE | SDL_RESIZABLE); //Create a 640x480x32 resizable window
249965d0a68f GL is no finish.
kent
parents:
diff changeset
105 atexit(SDL_Quit); //Now that we're enabled, make sure we cleanup
249965d0a68f GL is no finish.
kent
parents:
diff changeset
106
249965d0a68f GL is no finish.
kent
parents:
diff changeset
107 goto starsInit(screen, num);
249965d0a68f GL is no finish.
kent
parents:
diff changeset
108 }
249965d0a68f GL is no finish.
kent
parents:
diff changeset
109
249965d0a68f GL is no finish.
kent
parents:
diff changeset
110 __code starsInit0(SDL_Surface *screen, int num)
249965d0a68f GL is no finish.
kent
parents:
diff changeset
111 {
249965d0a68f GL is no finish.
kent
parents:
diff changeset
112 int i;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
113 srandom(time(NULL));
249965d0a68f GL is no finish.
kent
parents:
diff changeset
114 for (i=0; i<num; i++){ // this loop should be split into few code segment..
249965d0a68f GL is no finish.
kent
parents:
diff changeset
115 stars_old[i].weight = random()/(RAND_MAX+1.0)*5+5;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
116 stars_old[i].v[0] = random()/(RAND_MAX+1.0)*5+5;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
117 stars_old[i].v[1] = random()/(RAND_MAX+1.0)*5+5;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
118 stars_old[i].v[2] = random()/(RAND_MAX+1.0)*5+5;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
119 stars_old[i].r[0] = random()/(RAND_MAX+1.0)*5+5;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
120 stars_old[i].r[1] = random()/(RAND_MAX+1.0)*5+5;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
121 stars_old[i].r[2] = random()/(RAND_MAX+1.0)*5+5;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
122 stars_new[i].weight = stars_old[i].weight;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
123 }
249965d0a68f GL is no finish.
kent
parents:
diff changeset
124
249965d0a68f GL is no finish.
kent
parents:
diff changeset
125 goto loop(0, screen, num);
249965d0a68f GL is no finish.
kent
parents:
diff changeset
126 }
249965d0a68f GL is no finish.
kent
parents:
diff changeset
127 __code starsInit(SDL_Surface *screen, int num)
249965d0a68f GL is no finish.
kent
parents:
diff changeset
128 {
249965d0a68f GL is no finish.
kent
parents:
diff changeset
129 int i;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
130 #if 0
249965d0a68f GL is no finish.
kent
parents:
diff changeset
131 /* */
249965d0a68f GL is no finish.
kent
parents:
diff changeset
132 stars_old[0].weight = 110;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
133 stars_old[0].v[0] = 0.0;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
134 stars_old[0].v[1] = -1.0;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
135 stars_old[0].v[2] = 0.0;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
136 stars_old[0].r[0] = 100.0;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
137 stars_old[0].r[1] = 0.0;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
138 stars_old[0].r[2] = 0.0;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
139 /* */
249965d0a68f GL is no finish.
kent
parents:
diff changeset
140 stars_old[1].weight = 110;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
141 stars_old[1].v[0] = 0.0;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
142 stars_old[1].v[1] = -1.0;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
143 stars_old[1].v[2] = 0.0;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
144 stars_old[1].r[0] = -100.0;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
145 stars_old[1].r[1] = 0.0;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
146 stars_old[1].r[2] = 0.0;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
147 /* */
249965d0a68f GL is no finish.
kent
parents:
diff changeset
148 stars_old[2].weight = 110;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
149 stars_old[2].v[0] = -1.0;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
150 stars_old[2].v[1] = 0.0;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
151 stars_old[2].v[2] = 0.0;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
152 stars_old[2].r[0] = 0.0;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
153 stars_old[2].r[1] = 0.0;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
154 stars_old[2].r[2] = -70.0;
1
09e774f4433f main_GL is runnable.
kent
parents: 0
diff changeset
155 #elif 0
0
249965d0a68f GL is no finish.
kent
parents:
diff changeset
156 /* */
1
09e774f4433f main_GL is runnable.
kent
parents: 0
diff changeset
157 stars_old[0].weight = 1000;
09e774f4433f main_GL is runnable.
kent
parents: 0
diff changeset
158 stars_old[0].v[0] = 0.0;
0
249965d0a68f GL is no finish.
kent
parents:
diff changeset
159 stars_old[0].v[1] = 0.0;
1
09e774f4433f main_GL is runnable.
kent
parents: 0
diff changeset
160 stars_old[0].v[2] = 0.0;
09e774f4433f main_GL is runnable.
kent
parents: 0
diff changeset
161 stars_old[0].r[0] = 0.0;
0
249965d0a68f GL is no finish.
kent
parents:
diff changeset
162 stars_old[0].r[1] = 0.0;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
163 stars_old[0].r[2] = 0.0;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
164 /* */
1
09e774f4433f main_GL is runnable.
kent
parents: 0
diff changeset
165 stars_old[1].weight = 5;
09e774f4433f main_GL is runnable.
kent
parents: 0
diff changeset
166 stars_old[1].v[0] = 0.1;
09e774f4433f main_GL is runnable.
kent
parents: 0
diff changeset
167 stars_old[1].v[1] = 5.0;
09e774f4433f main_GL is runnable.
kent
parents: 0
diff changeset
168 stars_old[1].v[2] = 0.0;
09e774f4433f main_GL is runnable.
kent
parents: 0
diff changeset
169 stars_old[1].r[0] = 10.0;
0
249965d0a68f GL is no finish.
kent
parents:
diff changeset
170 stars_old[1].r[1] = 0.0;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
171 stars_old[1].r[2] = 0.0;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
172 /* */
1
09e774f4433f main_GL is runnable.
kent
parents: 0
diff changeset
173 stars_old[2].weight = 5;
09e774f4433f main_GL is runnable.
kent
parents: 0
diff changeset
174 stars_old[2].v[0] = 0.0;
09e774f4433f main_GL is runnable.
kent
parents: 0
diff changeset
175 stars_old[2].v[1] = -5.0;
09e774f4433f main_GL is runnable.
kent
parents: 0
diff changeset
176 stars_old[2].v[2] = 0.1;
09e774f4433f main_GL is runnable.
kent
parents: 0
diff changeset
177 stars_old[2].r[0] = -10.0;
0
249965d0a68f GL is no finish.
kent
parents:
diff changeset
178 stars_old[2].r[1] = 0.0;
1
09e774f4433f main_GL is runnable.
kent
parents: 0
diff changeset
179 stars_old[2].r[2] = 0.0;
09e774f4433f main_GL is runnable.
kent
parents: 0
diff changeset
180 #elif 1
09e774f4433f main_GL is runnable.
kent
parents: 0
diff changeset
181 /* */
09e774f4433f main_GL is runnable.
kent
parents: 0
diff changeset
182 stars_old[0].weight = 1000;
09e774f4433f main_GL is runnable.
kent
parents: 0
diff changeset
183 stars_old[0].v[0] = 0.0;
09e774f4433f main_GL is runnable.
kent
parents: 0
diff changeset
184 stars_old[0].v[1] = 0.0;
09e774f4433f main_GL is runnable.
kent
parents: 0
diff changeset
185 stars_old[0].v[2] = 0.0;
09e774f4433f main_GL is runnable.
kent
parents: 0
diff changeset
186 stars_old[0].r[0] = 0.0;
09e774f4433f main_GL is runnable.
kent
parents: 0
diff changeset
187 stars_old[0].r[1] = 0.0;
09e774f4433f main_GL is runnable.
kent
parents: 0
diff changeset
188 stars_old[0].r[2] = 0.0;
09e774f4433f main_GL is runnable.
kent
parents: 0
diff changeset
189 /* */
09e774f4433f main_GL is runnable.
kent
parents: 0
diff changeset
190 stars_old[1].weight = 5;
09e774f4433f main_GL is runnable.
kent
parents: 0
diff changeset
191 stars_old[1].v[0] = 0.1;
09e774f4433f main_GL is runnable.
kent
parents: 0
diff changeset
192 stars_old[1].v[1] = 5.0;
09e774f4433f main_GL is runnable.
kent
parents: 0
diff changeset
193 stars_old[1].v[2] = 0.0;
09e774f4433f main_GL is runnable.
kent
parents: 0
diff changeset
194 stars_old[1].r[0] = 100.0;
09e774f4433f main_GL is runnable.
kent
parents: 0
diff changeset
195 stars_old[1].r[1] = 0.0;
09e774f4433f main_GL is runnable.
kent
parents: 0
diff changeset
196 stars_old[1].r[2] = 0.0;
09e774f4433f main_GL is runnable.
kent
parents: 0
diff changeset
197 /* */
09e774f4433f main_GL is runnable.
kent
parents: 0
diff changeset
198 stars_old[2].weight = 5;
09e774f4433f main_GL is runnable.
kent
parents: 0
diff changeset
199 stars_old[2].v[0] = 0.0;
09e774f4433f main_GL is runnable.
kent
parents: 0
diff changeset
200 stars_old[2].v[1] = -5.0;
09e774f4433f main_GL is runnable.
kent
parents: 0
diff changeset
201 stars_old[2].v[2] = 0.1;
09e774f4433f main_GL is runnable.
kent
parents: 0
diff changeset
202 stars_old[2].r[0] = -100.0;
09e774f4433f main_GL is runnable.
kent
parents: 0
diff changeset
203 stars_old[2].r[1] = 0.0;
09e774f4433f main_GL is runnable.
kent
parents: 0
diff changeset
204 stars_old[2].r[2] = 0.0;
0
249965d0a68f GL is no finish.
kent
parents:
diff changeset
205 #endif
249965d0a68f GL is no finish.
kent
parents:
diff changeset
206
249965d0a68f GL is no finish.
kent
parents:
diff changeset
207 for( i=0; i<num; i++){
249965d0a68f GL is no finish.
kent
parents:
diff changeset
208 stars_new[i].weight = stars_old[i].weight;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
209 stars_new[i].rect.h = 5, stars_new[i].rect.w = 5;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
210 stars_old[i].rect.h = 5, stars_old[i].rect.w = 5;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
211 }
249965d0a68f GL is no finish.
kent
parents:
diff changeset
212
249965d0a68f GL is no finish.
kent
parents:
diff changeset
213 goto loop(0, screen, num);
249965d0a68f GL is no finish.
kent
parents:
diff changeset
214 }
249965d0a68f GL is no finish.
kent
parents:
diff changeset
215
249965d0a68f GL is no finish.
kent
parents:
diff changeset
216 __code starsInit1(SDL_Surface *screen, int num)
249965d0a68f GL is no finish.
kent
parents:
diff changeset
217 {
249965d0a68f GL is no finish.
kent
parents:
diff changeset
218 int i;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
219 /* Sun */
249965d0a68f GL is no finish.
kent
parents:
diff changeset
220 stars_old[0].weight = 1.9891e30; // 1.9891*10^30
249965d0a68f GL is no finish.
kent
parents:
diff changeset
221 stars_old[0].v[0] = 0.0;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
222 stars_old[0].v[1] = 0.0;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
223 stars_old[0].v[2] = 0.0;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
224 stars_old[0].r[0] = 0.0;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
225 stars_old[0].r[1] = 0.0;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
226 stars_old[0].r[2] = 0.0;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
227 /* Venus */
249965d0a68f GL is no finish.
kent
parents:
diff changeset
228 stars_old[1].weight = 4.869e24; // 4.869*10^24
249965d0a68f GL is no finish.
kent
parents:
diff changeset
229 stars_old[1].v[0] = 0.0;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
230 stars_old[1].v[1] = 3.50214e4; // 35.0214 km/s
249965d0a68f GL is no finish.
kent
parents:
diff changeset
231 stars_old[1].v[2] = 0.0;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
232 stars_old[1].r[0] = 1.08e11; // 108,208,930 km
249965d0a68f GL is no finish.
kent
parents:
diff changeset
233 stars_old[1].r[1] = 0.0;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
234 stars_old[1].r[2] = 0.0;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
235 /* Earth */
249965d0a68f GL is no finish.
kent
parents:
diff changeset
236 stars_old[2].weight = 5.9742e24; // 5.9742*10^24
249965d0a68f GL is no finish.
kent
parents:
diff changeset
237 stars_old[2].v[0] = 0.0;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
238 stars_old[2].v[1] = 2.97859e4; // 29.7859 km/s
249965d0a68f GL is no finish.
kent
parents:
diff changeset
239 stars_old[2].v[2] = 0.0;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
240 stars_old[2].r[0] = 1.49e11; // 149,597,870km
249965d0a68f GL is no finish.
kent
parents:
diff changeset
241 stars_old[2].r[1] = 0.0;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
242 stars_old[2].r[2] = 0.0;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
243
249965d0a68f GL is no finish.
kent
parents:
diff changeset
244 for( i=0; i<num; i++){
249965d0a68f GL is no finish.
kent
parents:
diff changeset
245 stars_new[i].weight = stars_old[i].weight;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
246 stars_new[i].rect.h = 5, stars_new[i].rect.w = 5;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
247 stars_old[i].rect.h = 5, stars_old[i].rect.w = 5;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
248 }
249965d0a68f GL is no finish.
kent
parents:
diff changeset
249
249965d0a68f GL is no finish.
kent
parents:
diff changeset
250 goto loop(0, screen, num);
249965d0a68f GL is no finish.
kent
parents:
diff changeset
251 }
249965d0a68f GL is no finish.
kent
parents:
diff changeset
252
249965d0a68f GL is no finish.
kent
parents:
diff changeset
253 __code loop(int count, SDL_Surface *screen, int num)
249965d0a68f GL is no finish.
kent
parents:
diff changeset
254 {
249965d0a68f GL is no finish.
kent
parents:
diff changeset
255 SDL_Event event;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
256
249965d0a68f GL is no finish.
kent
parents:
diff changeset
257 /* check SDL event. */
249965d0a68f GL is no finish.
kent
parents:
diff changeset
258 while(SDL_PollEvent(&event)){ //Poll events
249965d0a68f GL is no finish.
kent
parents:
diff changeset
259 switch(event.type){ //Check event type
249965d0a68f GL is no finish.
kent
parents:
diff changeset
260 case SDL_QUIT: //User hit the X (or equivelent)
249965d0a68f GL is no finish.
kent
parents:
diff changeset
261 goto finish(1);
249965d0a68f GL is no finish.
kent
parents:
diff changeset
262 //case SDL_VIDEORESIZE: //User resized window
249965d0a68f GL is no finish.
kent
parents:
diff changeset
263 //screen = SDL_SetVideoMode(event.resize.w, event.resize.h, 32,
249965d0a68f GL is no finish.
kent
parents:
diff changeset
264 //SDL_HWSURFACE | SDL_RESIZABLE); // Create new window
249965d0a68f GL is no finish.
kent
parents:
diff changeset
265 //break; //Event handled, fetch next :)
249965d0a68f GL is no finish.
kent
parents:
diff changeset
266 case SDL_KEYDOWN:
249965d0a68f GL is no finish.
kent
parents:
diff changeset
267 if (event.key.keysym.sym==SDLK_UP && event.key.state==SDL_PRESSED)
249965d0a68f GL is no finish.
kent
parents:
diff changeset
268 FIELD *= 2.0;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
269 else if (event.key.keysym.sym==SDLK_DOWN && event.key.state==SDL_PRESSED)
249965d0a68f GL is no finish.
kent
parents:
diff changeset
270 FIELD /= 2.0;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
271 else if (event.key.keysym.sym==SDLK_r && event.key.state==SDL_PRESSED)
249965d0a68f GL is no finish.
kent
parents:
diff changeset
272 goto moveCenter(count, screen, num);
249965d0a68f GL is no finish.
kent
parents:
diff changeset
273 else if (event.key.keysym.sym==SDLK_v && event.key.state==SDL_PRESSED)
249965d0a68f GL is no finish.
kent
parents:
diff changeset
274 goto CenteringVelocity(count, screen, num);
249965d0a68f GL is no finish.
kent
parents:
diff changeset
275 break;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
276 default:
249965d0a68f GL is no finish.
kent
parents:
diff changeset
277 break;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
278 } //Finished with current event
249965d0a68f GL is no finish.
kent
parents:
diff changeset
279 } //Done with all events for now
249965d0a68f GL is no finish.
kent
parents:
diff changeset
280
249965d0a68f GL is no finish.
kent
parents:
diff changeset
281 if ( count<num ){
249965d0a68f GL is no finish.
kent
parents:
diff changeset
282 DEBUGlog("count %d, goto commpute().\n", count);
249965d0a68f GL is no finish.
kent
parents:
diff changeset
283 goto compute(count, screen, num);
249965d0a68f GL is no finish.
kent
parents:
diff changeset
284 }else{
249965d0a68f GL is no finish.
kent
parents:
diff changeset
285 DEBUGlog("count %d, goto nextTurn()\n", count);
249965d0a68f GL is no finish.
kent
parents:
diff changeset
286 goto nextTurn(count, screen, num);
249965d0a68f GL is no finish.
kent
parents:
diff changeset
287 }
249965d0a68f GL is no finish.
kent
parents:
diff changeset
288 }
249965d0a68f GL is no finish.
kent
parents:
diff changeset
289
249965d0a68f GL is no finish.
kent
parents:
diff changeset
290 __code CenteringVelocity(int count, SDL_Surface *screen, int num)
249965d0a68f GL is no finish.
kent
parents:
diff changeset
291 {
249965d0a68f GL is no finish.
kent
parents:
diff changeset
292 int i;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
293 float v0,v1,v2;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
294 v0=v1=v2=0.0;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
295
249965d0a68f GL is no finish.
kent
parents:
diff changeset
296 for (i=0; i<num; i++){
249965d0a68f GL is no finish.
kent
parents:
diff changeset
297 v0 += stars_old[i].v[0];
249965d0a68f GL is no finish.
kent
parents:
diff changeset
298 v1 += stars_old[i].v[1];
249965d0a68f GL is no finish.
kent
parents:
diff changeset
299 v2 += stars_old[i].v[2];
249965d0a68f GL is no finish.
kent
parents:
diff changeset
300 }
249965d0a68f GL is no finish.
kent
parents:
diff changeset
301 v0/=(float)num; v1/=(float)num; v2/=(float)num;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
302 for (i=0; i<num; i++){
249965d0a68f GL is no finish.
kent
parents:
diff changeset
303 stars_old[i].v[0] -= v0;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
304 stars_old[i].v[1] -= v1;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
305 stars_old[i].v[2] -= v2;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
306 }
249965d0a68f GL is no finish.
kent
parents:
diff changeset
307
249965d0a68f GL is no finish.
kent
parents:
diff changeset
308 goto loop(0, screen, num);
249965d0a68f GL is no finish.
kent
parents:
diff changeset
309 }
249965d0a68f GL is no finish.
kent
parents:
diff changeset
310 __code moveCenter(int count, SDL_Surface *screen, int num)
249965d0a68f GL is no finish.
kent
parents:
diff changeset
311 {
249965d0a68f GL is no finish.
kent
parents:
diff changeset
312 int i;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
313 float m0,m1,m2;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
314 m0=m1=m2=0.0;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
315
249965d0a68f GL is no finish.
kent
parents:
diff changeset
316 for (i=0; i<num; i++){
249965d0a68f GL is no finish.
kent
parents:
diff changeset
317 m0 += stars_old[i].r[0];
249965d0a68f GL is no finish.
kent
parents:
diff changeset
318 m1 += stars_old[i].r[1];
249965d0a68f GL is no finish.
kent
parents:
diff changeset
319 m2 += stars_old[i].r[2];
249965d0a68f GL is no finish.
kent
parents:
diff changeset
320 }
249965d0a68f GL is no finish.
kent
parents:
diff changeset
321 m0/=(float)num; m1/=(float)num; m2/=(float)num;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
322 for (i=0; i<num; i++){
249965d0a68f GL is no finish.
kent
parents:
diff changeset
323 stars_old[i].r[0] -= m0;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
324 stars_old[i].r[1] -= m1;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
325 stars_old[i].r[2] -= m2;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
326 }
249965d0a68f GL is no finish.
kent
parents:
diff changeset
327
249965d0a68f GL is no finish.
kent
parents:
diff changeset
328 goto loop(0, screen, num);
249965d0a68f GL is no finish.
kent
parents:
diff changeset
329 }
249965d0a68f GL is no finish.
kent
parents:
diff changeset
330
249965d0a68f GL is no finish.
kent
parents:
diff changeset
331 /*
249965d0a68f GL is no finish.
kent
parents:
diff changeset
332 * next x = x+dx
249965d0a68f GL is no finish.
kent
parents:
diff changeset
333 * dx = v*dt => dx/dt = v
249965d0a68f GL is no finish.
kent
parents:
diff changeset
334 * dv = a*dt => dv/dt = a
249965d0a68f GL is no finish.
kent
parents:
diff changeset
335 * a = F/m;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
336 * F = F1 + F2 + ... + Fn
249965d0a68f GL is no finish.
kent
parents:
diff changeset
337 * Fi = G m1m2/r^2
249965d0a68f GL is no finish.
kent
parents:
diff changeset
338 *
249965d0a68f GL is no finish.
kent
parents:
diff changeset
339 */
249965d0a68f GL is no finish.
kent
parents:
diff changeset
340 __code compute(int count, SDL_Surface *screen, int num)
249965d0a68f GL is no finish.
kent
parents:
diff changeset
341 {
249965d0a68f GL is no finish.
kent
parents:
diff changeset
342 int i;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
343 /* a is accel this planet receive now. */
249965d0a68f GL is no finish.
kent
parents:
diff changeset
344 stars_old[count].a[0]=stars_old[count].a[1]=stars_old[count].a[2]=0.0f;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
345 DEBUGlog("count=%d\n", count);
249965d0a68f GL is no finish.
kent
parents:
diff changeset
346 for (i=0; i<num; i++){ // this loop should be split to few code segment..
249965d0a68f GL is no finish.
kent
parents:
diff changeset
347 //float F;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
348 float d0, d1, d2, d;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
349 float a;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
350 //body *o, *m;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
351 //o = &stars_old[i]; m = &stars_old[count];
249965d0a68f GL is no finish.
kent
parents:
diff changeset
352
249965d0a68f GL is no finish.
kent
parents:
diff changeset
353 /* skip compute with itself. */
249965d0a68f GL is no finish.
kent
parents:
diff changeset
354 if ( i==count ) continue;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
355 /* compute distance between two i-th planet and itself. */
249965d0a68f GL is no finish.
kent
parents:
diff changeset
356 d0 = stars_old[i].r[0] - stars_old[count].r[0];
249965d0a68f GL is no finish.
kent
parents:
diff changeset
357 d1 = stars_old[i].r[1] - stars_old[count].r[1];
249965d0a68f GL is no finish.
kent
parents:
diff changeset
358 d2 = stars_old[i].r[2] - stars_old[count].r[2];
249965d0a68f GL is no finish.
kent
parents:
diff changeset
359 d = ( d0*d0+d1*d1+d2*d2+eps*eps );
249965d0a68f GL is no finish.
kent
parents:
diff changeset
360 /* compute force it receive from i-th planet. */
249965d0a68f GL is no finish.
kent
parents:
diff changeset
361 //F = Gravitation * stars_old[i].weight * stars_old[count].weight / d;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
362 /* and accel. */
249965d0a68f GL is no finish.
kent
parents:
diff changeset
363 //a = F/stars_old[count].weight;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
364 a = Gravitation/d * stars_old[i].weight ;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
365 stars_old[count].a[0] += a*d0/sqrt(d);
249965d0a68f GL is no finish.
kent
parents:
diff changeset
366 stars_old[count].a[1] += a*d1/sqrt(d);
249965d0a68f GL is no finish.
kent
parents:
diff changeset
367 stars_old[count].a[2] += a*d2/sqrt(d);
249965d0a68f GL is no finish.
kent
parents:
diff changeset
368 DEBUGlog("a=%e, d=%e, d0=%e\n", a, d, d0);
249965d0a68f GL is no finish.
kent
parents:
diff changeset
369 DEBUGlog("g*w=%e\n", Gravitation*stars_old[i].weight);
249965d0a68f GL is no finish.
kent
parents:
diff changeset
370 }
249965d0a68f GL is no finish.
kent
parents:
diff changeset
371
249965d0a68f GL is no finish.
kent
parents:
diff changeset
372 stars_new[count].v[0] = stars_old[count].v[0]+stars_old[count].a[0]*delta;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
373 stars_new[count].v[1] = stars_old[count].v[1]+stars_old[count].a[1]*delta;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
374 stars_new[count].v[2] = stars_old[count].v[2]+stars_old[count].a[2]*delta;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
375 stars_new[count].r[0] = stars_old[count].r[0]+stars_new[count].v[0]*delta/*+stars_old[count].a[0]*delta*delta/2.0*/;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
376 stars_new[count].r[1] = stars_old[count].r[1]+stars_new[count].v[1]*delta/*+stars_old[count].a[1]*delta*delta/2.0*/;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
377 stars_new[count].r[2] = stars_old[count].r[2]+stars_new[count].v[2]*delta/*+stars_old[count].a[2]*delta*delta/2.0*/;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
378
249965d0a68f GL is no finish.
kent
parents:
diff changeset
379 stars_new[count].rect.x = (stars_new[count].r[0]*(float)W_HEIGHT/FIELD/2)+(W_WIDTH/2);
249965d0a68f GL is no finish.
kent
parents:
diff changeset
380 stars_new[count].rect.y = (stars_new[count].r[1]*(float)W_HEIGHT/FIELD/2)+(W_HEIGHT/2);
249965d0a68f GL is no finish.
kent
parents:
diff changeset
381 DEBUGlog("x = %e, x=%d\n", stars_new[count].r[0], stars_new[count].rect.x);
249965d0a68f GL is no finish.
kent
parents:
diff changeset
382 DEBUGlog("y = %e, y=%d\n", stars_new[count].r[1], stars_new[count].rect.y);
249965d0a68f GL is no finish.
kent
parents:
diff changeset
383 DEBUGlog("z = %e\n", stars_new[count].r[2]);
249965d0a68f GL is no finish.
kent
parents:
diff changeset
384 DEBUGlog("vx = %e\n", stars_new[count].v[0]);
249965d0a68f GL is no finish.
kent
parents:
diff changeset
385 DEBUGlog("vy = %e\n", stars_new[count].v[1]);
249965d0a68f GL is no finish.
kent
parents:
diff changeset
386 DEBUGlog("vz = %e\n", stars_new[count].v[2]);
249965d0a68f GL is no finish.
kent
parents:
diff changeset
387 DEBUGlog("a0=%e,a1=%e,a2=%e\n", stars_new[count].a[0], stars_new[count].a[1], stars_new[count].a[2]);
249965d0a68f GL is no finish.
kent
parents:
diff changeset
388 DEBUGlog("x=%d,y=%d,h=%d,w=%d\n",stars_old[count].rect.x,stars_old[count].rect.y,stars_old[count].rect.h,stars_old[count].rect.w);
249965d0a68f GL is no finish.
kent
parents:
diff changeset
389 SDL_FillRect(screen, &stars_old[count].rect, SDL_MapRGB(screen->format, 0x00,0x00,0x00));
249965d0a68f GL is no finish.
kent
parents:
diff changeset
390 SDL_FillRect(screen, &stars_new[count].rect, SDL_MapRGB(screen->format, 0xff,0x88,0x33));
249965d0a68f GL is no finish.
kent
parents:
diff changeset
391 //SDL_BlitSurface(screen, &stars_old[count].rect, screen, &stars_new[count].rect);
249965d0a68f GL is no finish.
kent
parents:
diff changeset
392
249965d0a68f GL is no finish.
kent
parents:
diff changeset
393 goto loop(++count, screen, num);
249965d0a68f GL is no finish.
kent
parents:
diff changeset
394 }
249965d0a68f GL is no finish.
kent
parents:
diff changeset
395
249965d0a68f GL is no finish.
kent
parents:
diff changeset
396 /* it is executed after all bodies parameter is computed. */
249965d0a68f GL is no finish.
kent
parents:
diff changeset
397 __code nextTurn(int count, SDL_Surface *screen, int num)
249965d0a68f GL is no finish.
kent
parents:
diff changeset
398 {
249965d0a68f GL is no finish.
kent
parents:
diff changeset
399 body *tmp;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
400 tmp = stars_old;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
401 stars_old = stars_new;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
402 stars_new = tmp;
249965d0a68f GL is no finish.
kent
parents:
diff changeset
403 SDL_UpdateRect(screen, 0, 0, 0, 0);
249965d0a68f GL is no finish.
kent
parents:
diff changeset
404
249965d0a68f GL is no finish.
kent
parents:
diff changeset
405 goto loop(0, screen, num);
249965d0a68f GL is no finish.
kent
parents:
diff changeset
406 }
249965d0a68f GL is no finish.
kent
parents:
diff changeset
407
249965d0a68f GL is no finish.
kent
parents:
diff changeset
408
249965d0a68f GL is no finish.
kent
parents:
diff changeset
409
249965d0a68f GL is no finish.
kent
parents:
diff changeset
410 /*
249965d0a68f GL is no finish.
kent
parents:
diff changeset
411 +--------+-----------+
249965d0a68f GL is no finish.
kent
parents:
diff changeset
412 | v |
249965d0a68f GL is no finish.
kent
parents:
diff changeset
413 | +-----------+ |
249965d0a68f GL is no finish.
kent
parents:
diff changeset
414 | | loop | |
249965d0a68f GL is no finish.
kent
parents:
diff changeset
415 | +-----+-----+ |
249965d0a68f GL is no finish.
kent
parents:
diff changeset
416 | | |
249965d0a68f GL is no finish.
kent
parents:
diff changeset
417 | +-----v-----+ |
249965d0a68f GL is no finish.
kent
parents:
diff changeset
418 | + compute +-----+
249965d0a68f GL is no finish.
kent
parents:
diff changeset
419 | +-----+-----+ count++
249965d0a68f GL is no finish.
kent
parents:
diff changeset
420 | |
249965d0a68f GL is no finish.
kent
parents:
diff changeset
421 | | count==num
249965d0a68f GL is no finish.
kent
parents:
diff changeset
422 | +-----v-----+
249965d0a68f GL is no finish.
kent
parents:
diff changeset
423 | | nextTurn |
249965d0a68f GL is no finish.
kent
parents:
diff changeset
424 | +-----+-----+
249965d0a68f GL is no finish.
kent
parents:
diff changeset
425 | | count=0
249965d0a68f GL is no finish.
kent
parents:
diff changeset
426 +--------+
249965d0a68f GL is no finish.
kent
parents:
diff changeset
427 */
249965d0a68f GL is no finish.
kent
parents:
diff changeset
428
249965d0a68f GL is no finish.
kent
parents:
diff changeset
429
249965d0a68f GL is no finish.
kent
parents:
diff changeset
430