Blame onefile/stars.c

Ivan Mahonin 261920
Ivan Mahonin 261920
#include <math.h>
Ivan Mahonin 261920
#include <string.h>
Ivan Mahonin 261920
#include <helianthus.h>
Ivan Mahonin 261920
Ivan Mahonin 261920
Ivan Mahonin 261920
#define MAXCOUNT 10000
Ivan Mahonin 261920
#define STEP     1.001
Ivan Mahonin 261920
#define SPEED    2000
Ivan Mahonin 261920
Ivan Mahonin 261920
Ivan Mahonin 261920
typedef struct Star {
Ivan Mahonin 261920
  double cx, cy;
Ivan Mahonin 261920
  double dx, dy;
Ivan Mahonin 261920
  double r;
Ivan Mahonin 261920
  int visible;
Ivan Mahonin 261920
} Star;
Ivan Mahonin 261920
Ivan Mahonin 261920
Star stars[MAXCOUNT];
Ivan Mahonin 261920
double step;
Ivan Mahonin 261920
Ivan Mahonin 261920
Ivan Mahonin 261920
void updateStar(Star *s, double k, double w, double h) {
Ivan Mahonin 261920
  s->dx *= k;
Ivan Mahonin 261920
  s->dy *= k;
Ivan Mahonin 261920
  s->r *= k;
Ivan Mahonin 261920
  s->visible = fabs(s->dx + s->cx) + s->r < w/2
Ivan Mahonin 261920
            && fabs(s->dy + s->cy) + s->r < h/2;
Ivan Mahonin 261920
}
Ivan Mahonin 261920
Ivan Mahonin 261920
Ivan Mahonin 261920
void update(double dt, double mx, double my, double w, double h) {
Ivan Mahonin 261920
  step += SPEED*dt;
Ivan Mahonin 261920
  while(step > 1) {
Ivan Mahonin 261920
    int found = 0;
Ivan Mahonin 261920
    for(int i = 0; i < MAXCOUNT; ++i) {
Ivan Mahonin 261920
      if (stars[i].visible) updateStar(&stars[i], STEP, w, h);
Ivan Mahonin 261920
Ivan Mahonin 261920
      if (!found && !stars[i].visible) {
Ivan Mahonin 261920
        stars[i].cx = mx;
Ivan Mahonin 261920
        stars[i].cy = my;
Ivan Mahonin 261920
        stars[i].dx = (randomFloat() - 0.5)*w - mx;
Ivan Mahonin 261920
        stars[i].dy = (randomFloat() - 0.5)*h - my;
Ivan Mahonin 261920
        stars[i].r = 0.25*pow(STEP, randomFloat());
Ivan Mahonin 261920
        stars[i].visible = TRUE;
Ivan Mahonin 261920
        found = 1;
Ivan Mahonin 261920
      }
Ivan Mahonin 261920
    }
Ivan Mahonin 261920
    step -= 1;
Ivan Mahonin 261920
  }
Ivan Mahonin 261920
Ivan Mahonin 261920
  double k = pow(STEP, step);
Ivan Mahonin 261920
  for(int i = 0; i < MAXCOUNT; ++i)
Ivan Mahonin 261920
    if (stars[i].visible) updateStar(&stars[i], k, w, h);
Ivan Mahonin 261920
}
Ivan Mahonin 261920
Ivan Mahonin 261920
Ivan Mahonin 261920
void init() {
Ivan Mahonin 261920
  background(COLOR_BLACK);
Ivan Mahonin 261920
}
Ivan Mahonin 261920
Ivan Mahonin 261920
Ivan Mahonin 261920
void draw() {
Ivan Mahonin 261920
  double w = windowGetWidth();
Ivan Mahonin 261920
  double h = windowGetHeight();
Ivan Mahonin 261920
  saveState();
Ivan Mahonin 261920
  translate(w/2, h/2);
Ivan Mahonin 261920
Ivan Mahonin 261920
  update(windowGetFrameTime(), mouseTransformedX(), mouseTransformedY(), w, h);
Ivan Mahonin 261920
Ivan Mahonin 261920
  noStroke();
Ivan Mahonin 261920
  fill(COLOR_WHITE);
Ivan Mahonin 261920
  for(int i = 0; i < MAXCOUNT; ++i)
Ivan Mahonin 261920
    if (stars[i].visible)
Ivan Mahonin 261920
      circle(stars[i].cx + stars[i].dx, stars[i].cy + stars[i].dy, stars[i].r);
Ivan Mahonin 261920
Ivan Mahonin 261920
  restoreState();
Ivan Mahonin 261920
}
Ivan Mahonin 261920
Ivan Mahonin 261920
Ivan Mahonin 261920
int main() {
Ivan Mahonin 261920
  windowSetResizable(TRUE);
Ivan Mahonin 261920
  windowSetVariableFrameRate();
Ivan Mahonin 261920
  windowSetInit(&init);
Ivan Mahonin 261920
  windowSetDraw(&draw);
Ivan Mahonin 261920
  windowRun();
Ivan Mahonin 261920
}