11 glxy.a = calloc(5, sizeof(Body));
13 sysfatal("could not allocate glxy: %r");
23 if(glxy.l == glxy.max) {
25 glxy.a = realloc(glxy.a, sizeof(Body) * glxy.max);
27 sysfatal("could not realloc glxy: %r");
29 b = glxy.a + glxy.l++;
40 pos.x = b->x / scale + orig.x;
41 pos.y = b->y / scale + orig.y;
43 fillellipse(screen, pos, s, s, b->col, ZP);
44 v.x = b->v.x/scale*10;
45 v.y = b->v.y/scale*10;
46 if(v.x != 0 || v.y != 0)
47 line(screen, pos, addpt(pos, v), Enddisc, Endarrow, 0, b->col, ZP);
48 flushimage(display, 1);
59 return (Vector){0, 0};
61 gc.x = gc.y = gcv.x = gcv.y = mass = 0;
62 for(b = glxy.a; b < glxy.a+glxy.l; b++) {
63 gc.x += b->x * b->mass;
64 gc.y += b->y * b->mass;
65 gcv.x += b->v.x * b->mass;
66 gcv.y += b->v.y * b->mass;
73 for(b = glxy.a; b < glxy.a+glxy.l; b++) {
88 b = va_arg(f->args, Body*);
90 r = fmtprint(f, "MKBODY %g %g ", b->x, b->y);
94 r = fmtprint(f, "%g %g ", b->v.x, b->v.y);
98 return fmtprint(f, "%g", b->size);
113 static char *cmds[] = {
122 for(cmd = 0; cmd < nelem(cmds); cmd++) {
123 if(strcmp(l, cmds[cmd]) == 0)
126 sysfatal("getcmd: no such command %s", l);
140 Binit(&bin, fd, OREAD);
142 line = Brdline(&bin, ' ');
143 len = Blinelen(&bin);
147 sysfatal("load: malformed command");
153 line = Brdline(&bin, '\n');
156 sysfatal("load: malformed command");
157 sysfatal("load: read error: %r");
159 len = Blinelen(&bin);
165 b->x = strtod(line, &line);
166 b->y = strtod(line, &line);
167 b->v.x = strtod(line, &line);
168 b->v.y = strtod(line, &line);
169 b->size = strtod(line, nil);
170 b->mass = b->size*b->size*b->size;
175 orig.x = strtol(line, &line, 10);
176 orig.y = strtol(line, nil, 10);
179 dt = strtod(line, nil);
183 scale = strtod(line, nil);
186 G = strtod(line, nil);
199 Binit(&bout, fd, OWRITE);
201 Bprint(&bout, "ORIG %d %d\n", orig.x, orig.y);
202 Bprint(&bout, "SCALE %g\n", scale);
203 Bprint(&bout, "DT %g\n", dt);
204 Bprint(&bout, "GRAV %g\n", G);
206 for(b = glxy.a; b < glxy.a + glxy.l; b++)
207 Bprint(&bout, "%B\n", b);