-void
-draw_galaxy(ModeInfo * mi)
-{
- Display *display = MI_DISPLAY(mi);
- Window window = MI_WINDOW(mi);
- GC gc = MI_GC(mi);
- unistruct *gp = &universes[MI_SCREEN(mi)];
- double d; /* tmp */
- int i, j, k; /* more tmp */
-
- for (i = 0; i < gp->ngalaxies; ++i) {
- Galaxy *gt = &gp->galaxies[i];
-
- for (j = 0; j < gp->galaxies[i].nstars; ++j) {
- Star *st = >->stars[j];
-
- for (k = 0; k < gp->ngalaxies; ++k) {
- Galaxy *gtk = &gp->galaxies[k];
-
- gp->diff[0] = gtk->pos[0] - st->pos[0];
- gp->diff[1] = gtk->pos[1] - st->pos[1];
- gp->diff[2] = gtk->pos[2] - st->pos[2];
- d = gp->diff[0] * gp->diff[0] + gp->diff[1] * gp->diff[1] +
- gp->diff[2] * gp->diff[2];
- if (d < EPSILON)
- d = EPSILON;
- d = gt->mass / (d * sqrt(d)) * gp->f_deltat * QCONS;
- gp->diff[0] *= d;
- gp->diff[1] *= d;
- gp->diff[2] *= d;
- st->vel[0] += gp->diff[0];
- st->vel[1] += gp->diff[1];
- st->vel[2] += gp->diff[2];
- }
-
- st->color = COLORSTEP * gt->galcol + ((int) ((st->vel[0] * st->vel[0] +
- st->vel[1] * st->vel[1] + st->vel[2] * st->vel[2]) / 3.0)) % COLORSTEP;
-
- st->pos[0] += st->vel[0] * gp->f_deltat;
- st->pos[1] += st->vel[1] * gp->f_deltat;
- st->pos[2] += st->vel[2] * gp->f_deltat;
-
- if (st->px >= gp->clip.left &&
- st->px <= gp->clip.right - st->size &&
- st->py >= gp->clip.top &&
- st->py <= gp->clip.bottom - st->size) {
- XSetForeground(display, gc, MI_WIN_BLACK_PIXEL(mi));
- drawStar(st->px, st->py, st->size);
- }
- st->px = (int) (st->pos[0] * gp->scale) + gp->midx;
- st->py = (int) (st->pos[1] * gp->scale) + gp->midy;
-
-
-#ifdef WRAP
- if (st->px < gp->clip.left) {
- (void) printf("wrap l -> r\n");
- st->px = gp->clip.right;
- }
- if (st->px > gp->clip.right) {
- (void) printf("wrap r -> l\n");
- st->px = gp->clip.left;
- }
- if (st->py > gp->clip.bottom) {
- (void) printf("wrap b -> t\n");
- st->py = gp->clip.top;
- }
- if (st->py < gp->clip.top) {
- (void) printf("wrap t -> b\n");
- st->py = gp->clip.bottom;
- }
-#endif /*WRAP */
-
-
- if (st->px >= gp->clip.left &&
- st->px <= gp->clip.right - st->size &&
- st->py >= gp->clip.top &&
- st->py <= gp->clip.bottom - st->size) {
- if (MI_NPIXELS(mi) > 2)
- XSetForeground(display, gc, MI_PIXEL(mi, st->color));
- else
- XSetForeground(display, gc, MI_WIN_WHITE_PIXEL(mi));
- if (tracks)
- drawStar(st->px + 1, st->py, st->size);
- else
- drawStar(st->px, st->py, st->size);
- }
- }
-
- for (k = i + 1; k < gp->ngalaxies; ++k) {
- Galaxy *gtk = &gp->galaxies[k];
-
- gp->diff[0] = gtk->pos[0] - gt->pos[0];
- gp->diff[1] = gtk->pos[1] - gt->pos[1];
- gp->diff[2] = gtk->pos[2] - gt->pos[2];
- d = gp->diff[0] * gp->diff[0] + gp->diff[1] * gp->diff[1] +
- gp->diff[2] * gp->diff[2];
- if (d < EPSILON)
- d = EPSILON;
- d = gt->mass * gt->mass / (d * sqrt(d)) * gp->f_deltat * QCONS;
- gp->diff[0] *= d;
- gp->diff[1] *= d;
- gp->diff[2] *= d;
- gt->vel[0] += gp->diff[0] / gt->mass;
- gt->vel[1] += gp->diff[1] / gt->mass;
- gt->vel[2] += gp->diff[2] / gt->mass;
- gtk->vel[0] -= gp->diff[0] / gtk->mass;
- gtk->vel[1] -= gp->diff[1] / gtk->mass;
- gtk->vel[2] -= gp->diff[2] / gtk->mass;
- }
- gt->pos[0] += gt->vel[0] * gp->f_deltat;
- gt->pos[1] += gt->vel[1] * gp->f_deltat;
- gt->pos[2] += gt->vel[2] * gp->f_deltat;
- }
-
- gp->step++;
- if (gp->step > gp->f_hititerations * 4)
- startover(mi);