|
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 |
|