Blame simple/neural/test-matrix.c

Ivan Mahonin 025224
Ivan Mahonin 025224
#include <string.h>
Ivan Mahonin 025224
#include <stdlib.h>
Ivan Mahonin 025224
Ivan Mahonin 025224
#include <helianthus.h>
Ivan Mahonin 025224
Ivan Mahonin 025224
Ivan Mahonin 025224
#define WIDTH   64
Ivan Mahonin 025224
#define HEIGHT  48
Ivan Mahonin 025224
#define COUNT   256
Ivan Mahonin 025224
#define CELL    16
Ivan Mahonin 025224
Ivan Mahonin 025224
Ivan Mahonin 025224
typedef struct {
Ivan Mahonin 025224
  int x, y, r;
Ivan Mahonin 025224
} Point;
Ivan Mahonin 025224
Ivan Mahonin 025224
Ivan Mahonin 025224
int matrix[HEIGHT][WIDTH];
Ivan Mahonin 025224
Point order[ (HEIGHT*2 - 1)*(WIDTH*2 - 1) ];
Ivan Mahonin 025224
Ivan Mahonin 025224
Ivan Mahonin 025224
void initOrder() {
Ivan Mahonin 025224
  for(int y = 1-HEIGHT; y < HEIGHT; ++y) {
Ivan Mahonin 025224
    for(int x = 1-WIDTH; x < WIDTH; ++x) {
Ivan Mahonin 025224
      Point *p = &order[(y + HEIGHT - 1)*(WIDTH*2 - 1) + x + WIDTH - 1];
Ivan Mahonin 025224
      p->x = x;
Ivan Mahonin 025224
      p->y = y;
Ivan Mahonin 025224
Ivan Mahonin 025224
      int sector = x >= 0 && y > 0 ? 1
Ivan Mahonin 025224
                 : y >= 0 && x < 0 ? 2
Ivan Mahonin 025224
                 : x <= 0 && y < 0 ? 3
Ivan Mahonin 025224
                 : y <= 0 && x > 0 ? 4
Ivan Mahonin 025224
                 : 0;
Ivan Mahonin 025224
      int subsector = sector % 2 ? abs(x) >= abs(y) : abs(y) >= abs(x);
Ivan Mahonin 025224
Ivan Mahonin 025224
      p->r = (x*x + y*y)*10 + sector*2 + subsector;
Ivan Mahonin 025224
    }
Ivan Mahonin 025224
  }
Ivan Mahonin 025224
Ivan Mahonin 025224
  int size = sizeof(order)/sizeof(*order);
Ivan Mahonin 025224
  Point p;
Ivan Mahonin 025224
  while(1) {
Ivan Mahonin 025224
    int found = 0;
Ivan Mahonin 025224
    for(int i = 1; i < size; ++i) {
Ivan Mahonin 025224
      Point *p1 = &order[i], *p0 = p1 - 1;
Ivan Mahonin 025224
      if (p0->r > p1->r) {
Ivan Mahonin 025224
        memcpy(&p, p0, sizeof(p));
Ivan Mahonin 025224
        memcpy(p0, p1, sizeof(p));
Ivan Mahonin 025224
        memcpy(p1, &p, sizeof(p));
Ivan Mahonin 025224
        found = 1;
Ivan Mahonin 025224
      }
Ivan Mahonin 025224
    }
Ivan Mahonin 025224
    if (!found) break;
Ivan Mahonin 025224
  }
Ivan Mahonin 025224
}
Ivan Mahonin 025224
Ivan Mahonin 025224
Ivan Mahonin 025224
void prepareMatrix(int x, int y) {
Ivan Mahonin 025224
  if (x < 0) x = 0;
Ivan Mahonin 025224
  if (x >= WIDTH) x = WIDTH-1;
Ivan Mahonin 025224
  if (y < 0) y = 0;
Ivan Mahonin 025224
  if (y >= HEIGHT) y = HEIGHT-1;
Ivan Mahonin 025224
  memset(matrix, 0, sizeof(matrix));
Ivan Mahonin 025224
  Point *p = order;
Ivan Mahonin 025224
  for(int i = 0; i < COUNT; ++i) {
Ivan Mahonin 025224
    int xx, yy;
Ivan Mahonin 025224
    do {
Ivan Mahonin 025224
      xx = x + p->x;
Ivan Mahonin 025224
      yy = y + p->y;
Ivan Mahonin 025224
      ++p;
Ivan Mahonin 025224
    } while(xx < 0 || yy < 0 || xx >= WIDTH || yy >= HEIGHT);
Ivan Mahonin 025224
    matrix[yy][xx] = 1;
Ivan Mahonin 025224
  }
Ivan Mahonin 025224
}
Ivan Mahonin 025224
Ivan Mahonin 025224
Ivan Mahonin 025224
void init() {
Ivan Mahonin 025224
  initOrder();
Ivan Mahonin 025224
  windowSetSize(CELL*WIDTH, CELL*HEIGHT);
Ivan Mahonin 025224
}
Ivan Mahonin 025224
Ivan Mahonin 025224
Ivan Mahonin 025224
void draw() {
Ivan Mahonin 025224
  noStroke();
Ivan Mahonin 025224
  prepareMatrix(mouseX()/CELL, mouseY()/CELL);
Ivan Mahonin 025224
  for(int y = 0; y < HEIGHT; ++y) {
Ivan Mahonin 025224
    for(int x = 0; x < WIDTH; ++x) {
Ivan Mahonin 025224
      fill( matrix[y][x] ? COLOR_BLUE : COLOR_LIGHTBLUE );
Ivan Mahonin 025224
      rect(CELL*(x + 0.1), CELL*(y + 0.1), CELL*0.8, CELL*0.8);
Ivan Mahonin 025224
    }
Ivan Mahonin 025224
  }
Ivan Mahonin 025224
}
Ivan Mahonin 025224
Ivan Mahonin 025224
Ivan Mahonin 025224
int main() {
Ivan Mahonin 025224
  windowSetVariableFrameRate(TRUE);
Ivan Mahonin 025224
  windowSetInit(&init);
Ivan Mahonin 025224
  windowSetDraw(&draw);
Ivan Mahonin 025224
  windowRun();
Ivan Mahonin 025224
  return 0;
Ivan Mahonin 025224
}
Ivan Mahonin 025224