Blame projects/jigsaw/line.c

Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
#include "line.h"
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
void lineTranspose(Vertex *l, int cols) {
Ivan Mahonin fdbd7d
  int cnt = cols*LN_SEGS+1;
Ivan Mahonin fdbd7d
  for(int i = 0; i < cnt; ++i) {
Ivan Mahonin fdbd7d
    Vertex *v = &l[i];
Ivan Mahonin fdbd7d
    v->p = vtranspose(v->p);
Ivan Mahonin fdbd7d
    v->t = vtranspose(v->t);
Ivan Mahonin fdbd7d
  }
Ivan Mahonin fdbd7d
}
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
void lineGenH(Vertex *l, int cols, double y, double cellw, double cellh, double jitter, double depth) {
Ivan Mahonin fdbd7d
  if (cols <= 0) return;
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
  double kx = cellh < cellw ? cellh/cellw : 1.0;
Ivan Mahonin fdbd7d
  double ky = cellw < cellh ? cellw/cellh : 1.0;
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
  int cnt = cols*LN_SEGS+1;
Ivan Mahonin fdbd7d
  for(int i = 0; i < cnt; ++i)
Ivan Mahonin fdbd7d
    l[i] = (Vertex){ {i*cellw/LN_SEGS, y}, {}, 1 };
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
  if (jitter) for(int i = 1; i < cnt-1; ++i) {
Ivan Mahonin fdbd7d
    l[i].p.x += randTwo()*kx*jitter*cellw/2;
Ivan Mahonin fdbd7d
    l[i].p.y += randTwo()*ky*jitter*cellh;
Ivan Mahonin fdbd7d
    l[i].w   += randOne()*0.25;
Ivan Mahonin fdbd7d
  }
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
  for(int c = 0; c < cols; ++c) {
Ivan Mahonin fdbd7d
    double j = jitter ? randTwo()*(1-kx)/3 : 0;
Ivan Mahonin fdbd7d
    l[c*LN_SEGS+1].p.x += ( 0.3 - kx/6 + j)*cellw;
Ivan Mahonin fdbd7d
    l[c*LN_SEGS+2].p.x += ( 0.1 - kx/6 + j)*cellw;
Ivan Mahonin fdbd7d
    l[c*LN_SEGS+3].p.x += (-0.1 + kx/6 + j)*cellw;
Ivan Mahonin fdbd7d
    l[c*LN_SEGS+4].p.x += (-0.3 + kx/6 + j)*cellw;
Ivan Mahonin fdbd7d
    double d = randSign()*depth*ky*cellh;
Ivan Mahonin fdbd7d
    l[c*LN_SEGS+2].p.y += d;
Ivan Mahonin fdbd7d
    l[c*LN_SEGS+3].p.y += d;
Ivan Mahonin fdbd7d
  }
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
  Vec b = l[0].p, e = l[cnt-1].p;
Ivan Mahonin fdbd7d
  b.x -= 1/3.0; e.x += 1/3.0;
Ivan Mahonin fdbd7d
  for(int i = 0; i < cnt; ++i) {
Ivan Mahonin fdbd7d
    Vertex *v = &l[i];
Ivan Mahonin fdbd7d
    Vec p0 = i       ? (v-1)->p : b;
Ivan Mahonin fdbd7d
    Vec p1 = i+1<cnt ? (v+1)->p : e;
Ivan Mahonin fdbd7d
    v->t = vmul(vsub(p1, p0), v->w/2);
Ivan Mahonin fdbd7d
  }
Ivan Mahonin fdbd7d
}
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
void lineGenV(Vertex *l, int rows, double x, double cellw, double cellh, double jitter, double depth) {
Ivan Mahonin fdbd7d
  lineGenH(l, rows, x, cellh, cellw, jitter, depth);
Ivan Mahonin fdbd7d
  lineTranspose(l, rows);
Ivan Mahonin fdbd7d
}
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
void linePut(Vertex *l, int cells, int levels) {
Ivan Mahonin fdbd7d
  int cnt = cells*LN_SEGS;
Ivan Mahonin fdbd7d
  if (cnt > 0) {
Ivan Mahonin fdbd7d
    for(int i = 1; i <= cnt; ++i) {
Ivan Mahonin fdbd7d
      Vertex v0 = l[i-1];
Ivan Mahonin fdbd7d
      Vertex v1 = l[i];
Ivan Mahonin fdbd7d
      cubicto(
Ivan Mahonin fdbd7d
        v0.p.x, v0.p.y,
Ivan Mahonin fdbd7d
        v0.p.x + v0.t.x/3, v0.p.y + v0.t.y/3,
Ivan Mahonin fdbd7d
        v1.p.x - v1.t.x/3, v1.p.y - v1.t.y/3,
Ivan Mahonin fdbd7d
        v1.p.x, v1.p.y,
Ivan Mahonin fdbd7d
        levels );
Ivan Mahonin fdbd7d
    }
Ivan Mahonin fdbd7d
  } else {
Ivan Mahonin fdbd7d
    for(int i = -1; i >= cnt; --i) {
Ivan Mahonin fdbd7d
      Vertex v0 = l[i+1];
Ivan Mahonin fdbd7d
      Vertex v1 = l[i];
Ivan Mahonin fdbd7d
      cubicto(
Ivan Mahonin fdbd7d
        v0.p.x, v0.p.y,
Ivan Mahonin fdbd7d
        v0.p.x - v0.t.x/3, v0.p.y - v0.t.y/3,
Ivan Mahonin fdbd7d
        v1.p.x + v1.t.x/3, v1.p.y + v1.t.y/3,
Ivan Mahonin fdbd7d
        v1.p.x, v1.p.y,
Ivan Mahonin fdbd7d
        levels );
Ivan Mahonin fdbd7d
    }
Ivan Mahonin fdbd7d
  }
Ivan Mahonin fdbd7d
}
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d
void lineDraw(Vertex *l, int cells, int levels) {
Ivan Mahonin fdbd7d
  if (!cells) return;
Ivan Mahonin fdbd7d
  moveTo(l->p.x, l->p.y);
Ivan Mahonin fdbd7d
  linePut(l, cells, levels);
Ivan Mahonin fdbd7d
  strokePath();
Ivan Mahonin fdbd7d
}
Ivan Mahonin fdbd7d
Ivan Mahonin fdbd7d