diff -urN wf-/eye.c wf/eye.c --- wf-/eye.c 2015-12-12 00:00:00.000000000 +0900 +++ wf/eye.c 2015-12-13 00:00:00.000000000 +0900 @@ -63,15 +63,21 @@ } void -eye_move(eye_t *e, int mode, int h_v, int dir) +eye_move(eye_t *e, int mode, int h_v, int v) { line_t l; - if(mode == 2){ /* zoom */ - double t = 1 - e->zoom_rate; - - line_set(&l, &e->t, &e->p); - line_pos(&l, dir > 0 ? t : 1 / t, &e->p); + if(mode / 2 == 1){ /* zoom */ + int abs_v = v < 0 ? -v : v; + double t = 1 - e->zoom_rate * abs_v; + + if(mode == 2){ + line_set(&l, &e->t, &e->p); + line_pos(&l, v > 0 ? t : 1 / t, &e->p); + }else{ + line_set(&l, &e->p, &e->t); + line_pos(&l, v > 0 ? t : 1 / t, &e->t); + } return; } @@ -81,5 +87,19 @@ if(h_v == 'v') d3_mul(&l.v, -1); l.p = mode == 0 ? e->t : e->p; - pos_rot(mode == 0 ? &e->p : &e->t, &l, e->move_deg * dir); + pos_rot(mode == 0 ? &e->p : &e->t, &l, e->move_deg * v); +} + +void +eye_set_div4(eye_t *e, int x, int y) +{ + int w = e->w / 2; + int h = e->h / 2; + + e->sx = w * x; + e->ey = h * y; + e->ex = e->sx + w - 1; + e->sy = e->ey + h - 1; } + + diff -urN wf-/eye.h wf/eye.h --- wf-/eye.h 2015-12-12 00:00:00.000000000 +0900 +++ wf/eye.h 2015-12-13 00:00:00.000000000 +0900 @@ -14,10 +14,13 @@ axis_t ax; } eye_t; +#define EYE_MOVE_MODE_N 4 + void eye_init(eye_t *e, int w, int h); void eye_update(eye_t *e); int eye_conv(const eye_t *e, const pos_t *p, int *rx, int *ry); int eye_clip(const eye_t *e, pos_t *a, pos_t *b); -void eye_move(eye_t *e, int mode, int h_v, int dir); +void eye_move(eye_t *e, int mode, int h_v, int v); +void eye_set_div4(eye_t *e, int x, int y); #endif diff -urN wf-/wf_ex.c wf/wf_ex.c --- wf-/wf_ex.c 2015-12-13 00:00:00.000000000 +0900 +++ wf/wf_ex.c 2015-12-13 00:00:00.000000000 +0900 @@ -11,7 +11,10 @@ return EOF; case ' ': case CUI_KEY_ENTER: - *mode = (*mode + 1) % 3; + *mode = (*mode + 1) % EYE_MOVE_MODE_N; + break; + case CUI_KEY_BS: + *mode = (*mode - 1 + EYE_MOVE_MODE_N) % EYE_MOVE_MODE_N; break; case CUI_KEY_UP: eye_move(e, *mode, 'v', 1); @@ -47,36 +50,6 @@ xline(x[0], y[0], x[1], y[1]); } -void -draw_pyramid_sample(const eye_t *e, int n, int mode) -{ - pos_t p[5], add; - int i; - - d3_set(&p[0], -1, -1, 0); - d3_set(&p[1], 1, -1, 0); - d3_set(&p[2], 1, 1, 0); - d3_set(&p[3], -1, 1, 0); - d3_set(&p[4], 0, 0, 1 - mode); - - n--; - d3_set(&add, n*0.5, n*0.5, n*0.2); - for(i=0; i<5; i++){ - d3_mul(&p[i], n*0.2); - d3_add(&p[i], &add); - } - for(i=0; i<4; i++){ - pos_t p2[2]; - - p2[0] = p[i]; - p2[1] = p[(i+1)%4]; - draw_line(e, p2); - - p2[1] = p[4]; - draw_line(e, p2); - } -} - struct grp{ int w, h; pos_t *p; @@ -132,13 +105,14 @@ int main(int ac, char **av) { - int w, h, i, n = opt_int("-n", ac, av, 10); + int w, h; eye_t eye; int mode = 0; char *fn = opt_str("-fn", ac, av, NULL); char *zoom_s = opt_str("-zoom", ac, av, "1,1,1"); d3_t zoom; struct grp grp; + double t; if(!fn) ERR("-fn filename"); sscanf(zoom_s, "%lf,%lf,%lf", &zoom.x, &zoom.y, &zoom.z); @@ -152,15 +126,31 @@ if(opt_idx("-ximg", ac, av) > 0) ximg_curr = ximg_alloc(); eye_init(&eye, w, h); - d3_set(&eye.p, 0, -n, n); - d3_set(&eye.t, n/2, n/2, 0); + t = grp.h * zoom.y; + d3_set(&eye.p, 0, -t, t); + d3_set(&eye.t, t/2, t/2, 0); while(key_work(&eye, &mode) != EOF){ eye_update(&eye); xclear(); - draw_pyramid_sample(&eye, n, mode); - draw_grp(&eye, &grp); + + if(mode % 2 == 1){ + int x, y; + for(y=0; y<2; y++){ + for(x=0; x<2; x++){ + eye_t e = eye; + eye_set_div4(&e, x, y); + if(y == 0) eye_move(&e, 0, 'v', 45 / e.move_deg); + if(x != 0) eye_move(&e, 0, 'h', 45 / e.move_deg); + eye_update(&e); + draw_grp(&e, &grp); + } + } + }else{ + draw_grp(&eye, &grp); + } + if(mode / 2 == 1) xrect(1, 1, w-2, h-2); xflush(); if(ximg_curr) ximg_put(); diff -urN wf-/x.c wf/x.c --- wf-/x.c 2015-12-10 00:00:00.000000000 +0900 +++ wf/x.c 2015-12-13 00:00:00.000000000 +0900 @@ -122,6 +122,15 @@ } void +xrect(int sx, int sy, int ex, int ey) +{ + xline(sx, sy, ex, sy); + xline(sx, ey, ex, ey); + xline(sx, sy+1, sx, ey-1); + xline(ex, sy+1, ex, ey-1); +} + +void xflush(void) { if(ximg_curr) return; diff -urN wf-/x.h wf/x.h --- wf-/x.h 2015-12-10 00:00:00.000000000 +0900 +++ wf/x.h 2015-12-13 00:00:00.000000000 +0900 @@ -7,6 +7,7 @@ void xfini(void); void xclear(void); void xline(int sx, int sy, int ex, int ey); +void xrect(int sx, int sy, int ex, int ey); void xflush(void); extern void *ximg_curr;