diff -urN wf-/data.c wf/data.c --- wf-/data.c 2015-12-21 00:00:00.000000000 +0900 +++ wf/data.c 2015-12-24 00:00:00.000000000 +0900 @@ -23,6 +23,7 @@ CASE_RET(type_point_symmetry); CASE_RET(type_mirror); CASE_RET(type_timeshift); + CASE_RET(type_rdiv); CASE_RET(type_slide_way); CASE_RET(type_rot_way); CASE_RET(type_copy); @@ -43,27 +44,112 @@ eye_update(eye); prm->eye = eye; affin_axis_conv(&prm->af, &eye->ax); + prm->sec = eye->sec; + prm->rdiv = NULL; + prm->skip_af = 0; } static void -wire_frame_draw(struct wire_frame *wf, prm_t *prm) +wf_calc_v_len(struct wire_frame *wf) { int i, *op = wf->odr; - if(!wf->t){ - if((wf->t = malloc(sizeof(*wf->t) * wf->n)) == NULL) ERR("No Mem"); + + for(i=0; in; i++){ + d3_set(&wf->v[i], 0,0,0); + } + + wf->sum_len = 0; + wf->line_n = 0; + while(op[0] >= 0 && op[1] >= 0){ + vec_t v; + double len; + + vec_set(&v, &wf->t[ op[0] ], &wf->t[ op[1] ]); + if((len = vec_len(&v)) == 0) ERR("vec_len() == 0"); + wf->sum_len += len; + wf->line_n++; + + vec_unit(&v); + d3_mul(&v, 1/len); + d3_add(&wf->v[ op[1] ], &v); + d3_sub(&wf->v[ op[0] ], &v); + + op++; + if(op[1] < 0) op += 2; } for(i=0; in; i++){ - wf->t[i] = wf->p[i]; - affin_conv(&prm->af, &wf->t[i]); + vec_unit(&wf->v[i]); } +} + +static void +wf_rdiv_draw(struct wire_frame *wf, prm_t *prm, int op0, int op1) +{ + prm_t bak = *prm; + const struct rdiv *rdiv = prm->rdiv; + pos_t *p2[2] = { &wf->t[ op0 ], &wf->t[ op1 ] }; + double len = pos_distance(p2[0], p2[1]); + int i, n = 2 + (int)(rdiv->n * len * wf->line_n / wf->sum_len); + d3_t np[256 * 3]; + int nodr[256 + 2]; + struct wire_frame nwf = { n, np, nodr, &np[n], &np[n*2] }; + data_t data = { type_wire_frame, &nwf }; + vec_t v, v2[2]; + line_t l; + double deg; + + if(n > 256) ERR("n>256"); + + vec_set(&v, p2[0], p2[1]); + vec_arot(&wf->v[op1], &v, &l, °); + deg = (deg < 180 ? 90 : 90*3) - deg; + pos_rot(&v, &l, deg * rdiv->rate); + v2[1] = v; + + vec_set(&v, p2[1], p2[0]); + vec_arot(&wf->v[op0], &v, &l, °); + deg = (deg < 180 ? 90 : 90*3) - deg; + pos_rot(&v, &l, deg * rdiv->rate); + d3_mul(&v, -1); + v2[0] = v; + + for(i=0; irdiv = NULL; + prm->skip_af = 1; + data_draw(&data, prm); + *prm = bak; +} + +static void +wire_frame_draw(struct wire_frame *wf, prm_t *prm) +{ + int i, *op = wf->odr; + + if(!wf->t) ERR("wf->t NULL"); + + if(!prm->skip_af){ + for(i=0; in; i++){ + wf->t[i] = wf->p[i]; + affin_conv(&prm->af, &wf->t[i]); + } + } + + if(prm->rdiv) wf_calc_v_len(wf); while(op[0] >= 0 && op[1] >= 0){ pos_t p2[2]; p2[0] = wf->t[ op[0] ]; p2[1] = wf->t[ op[1] ]; - if(eye_clip(prm->eye, &p2[0], &p2[1]) >= 0){ + if(prm->rdiv){ + wf_rdiv_draw(wf, prm, op[0], op[1]); + }else if(eye_clip(prm->eye, &p2[0], &p2[1]) >= 0){ int x[2], y[2]; eye_conv(prm->eye, &p2[0], &x[0], &y[0]); eye_conv(prm->eye, &p2[1], &x[1], &y[1]); @@ -79,10 +165,10 @@ static void bar_draw(pos_t *p2, prm_t *prm) { - pos_t wk[2]; + d3_t wk[2*2]; data_t data = { type_wire_frame, - &(struct wire_frame){ 2, p2, (int[]){ 0,1,-1, -1 }, wk } + &(struct wire_frame){ 2, p2, (int[]){ 0,1,-1, -1 }, wk, &wk[2] } }; data_draw(&data, prm); } @@ -110,13 +196,13 @@ static void square_draw(prm_t *prm) { - pos_t wk[4]; + pos_t wk[4*2]; data_t data = { type_wire_frame, &(struct wire_frame){ 4, (pos_t[]){ {-1,-1,0},{1,-1,0},{1,1,0},{-1,1,0} }, - (int[]){ 0,1,2,3,0,-1, -1 }, wk } + (int[]){ 0,1,2,3,0,-1, -1 }, wk, &wk[4] } }; data_draw(&data, prm); } @@ -124,7 +210,7 @@ static void cube_draw(prm_t *prm) { - pos_t wk[8]; + pos_t wk[8*2]; data_t data = { type_wire_frame, &(struct wire_frame){ @@ -134,7 +220,7 @@ {-1,-1,1},{1,-1,1},{1,1,1},{-1,1,1} }, (int[]){ 0,1,2,3,0,-1, 4,5,6,7,4,-1, - 0,4,-1, 1,5,-1, 2,6,-1, 3,7,-1, -1 }, wk } + 0,4,-1, 1,5,-1, 2,6,-1, 3,7,-1, -1 }, wk, &wk[8] } }; data_draw(&data, prm); } @@ -264,6 +350,13 @@ } static void +op_data_rdiv(struct rdiv *rdiv, data_t *data, prm_t *prm) +{ + prm->rdiv = rdiv; + data_draw(data, prm); +} + +static void op_data_slide_way(struct way *slide, data_t *data, prm_t *prm) { struct way way = *slide; @@ -288,6 +381,18 @@ } static void +op_data_rdiv_way(struct rdiv_way *rdw, data_t *data, prm_t *prm) +{ + struct way way = rdw->rate_way; + struct rdiv rdiv = { .n=rdw->n }; + data_t op = { type_rdiv, &rdiv }; + + way_get(&way, prm->sec); + rdiv.rate = way.ret_v; + op_data_draw(&op, data, prm); +} + +static void op_data_copy(struct copy *copy, data_t *data, prm_t *prm) { int x, y, z; @@ -384,6 +489,9 @@ case type_timeshift: op_data_timeshift(op->p, data, prm); break; + case type_rdiv: + op_data_rdiv(op->p, data, prm); + break; case type_slide_way: op_data_slide_way(op->p, data, prm); @@ -391,6 +499,9 @@ case type_rot_way: op_data_rot_way(op->p, data, prm); break; + case type_rdiv_way: + op_data_rdiv_way(op->p, data, prm); + break; case type_copy: op_data_copy(op->p, data, prm); @@ -414,3 +525,14 @@ } *prm = bak; } + +void +wf_init_work_alloc(struct wire_frame *wf, d3_t *t_and_v) +{ + if(t_and_v){ + wf->t = t_and_v; + }else{ + if((wf->t = malloc(sizeof(d3_t) * wf->n * 2)) == NULL) ERR("No Mem"); + } + wf->v = &wf->t[ wf->n ]; +} diff -urN wf-/data.h wf/data.h --- wf-/data.h 2015-12-20 00:00:00.000000000 +0900 +++ wf/data.h 2015-12-24 00:00:00.000000000 +0900 @@ -26,9 +26,11 @@ #define type_point_symmetry 104 #define type_mirror 105 #define type_timeshift 106 +#define type_rdiv 107 #define type_slide_way 120 #define type_rot_way 130 +#define type_rdiv_way 131 #define type_copy 200 #define type_copy_rot 201 @@ -44,6 +46,9 @@ /* work */ pos_t *t; + vec_t *v; + double sum_len; + int line_n; }; struct op_data_set{ @@ -65,6 +70,16 @@ d3_t slide; }; +struct rdiv{ + int n; + double rate; +}; + +struct rdiv_way{ + int n; + struct way rate_way; +}; + struct copy{ struct { int x, y, z; } n; d3_t init, step; @@ -88,10 +103,14 @@ affin_t af; const eye_t *eye; double sec; + + const struct rdiv *rdiv; + int skip_af; } prm_t; void prm_set_eye_update(prm_t *prm, eye_t *eye); void data_draw(data_t *data, prm_t *prm); void op_data_draw(data_t *op, data_t *data, prm_t *prm); +void wf_init_work_alloc(struct wire_frame *wf, d3_t *t_and_v); #endif diff -urN wf-/wf_ex.c wf/wf_ex.c --- wf-/wf_ex.c 2015-12-23 00:00:00.000000000 +0900 +++ wf/wf_ex.c 2015-12-24 00:00:00.000000000 +0900 @@ -160,10 +160,14 @@ sscanf(zoom_s, "%lf,%lf,%lf", &zoom.x, &zoom.y, &zoom.z); grp_read(&grp, fopen(fn, "r"), &zoom); grp_to_wf(&grp, &wf); - if((wf.t = malloc(sizeof(*wf.t) * wf.n)) == NULL) ERR("No Mem"); + wf_init_work_alloc(&wf, NULL); - data.type = type_wire_frame; - data.p = &wf; + data.type = type_op_data_set; + data.p = &(struct op_data_set){ + .op = &(data_t){ type_rdiv_way, &(struct rdiv_way){ + .n=4, + .rate_way={.n=2,.vs=(double[]){0,0.2},.ts=(double[]){3,3},.ps=NULL,.dg=3} }}, + .data = &(data_t){ type_wire_frame, &wf } }; } if(opt_idx("-demo", ac, av) > 0){ @@ -186,6 +190,12 @@ .n = {5*2+1,4*2+1,2*2+1}, .init = {-20*5,-30*4,-40*2}, .step = {20,30,40} }}, .data = &(data_t){ type_cross, (pos_t[]){{-4,0,0},{4,0,0}} } }}; + data_t *rcube = &(data_t){ type_op_data_set, &(struct op_data_set){ + .op = &(data_t){ type_rdiv_way, &(struct rdiv_way){ + .n=4, + .rate_way={ .n=2, .vs=(double[]){-0.5,1.0}, .ts=(double[]){3,3}, .ps=NULL, .dg=3 } } }, + .data = &(data_t){ type_cube } }}; + data_t *cube = &(data_t){ type_op_data_set, &(struct op_data_set){ .op = &(data_t){ type_slide_way, &(struct way){ .n = 4, .vs = NULL, @@ -198,7 +208,7 @@ .n = 4, .vs = NULL, .ps = (pos_t[]){{0,0,0},{0,10,0},{10,10,0},{10,0,0}}, .ts = (double[]){1,1,1,1}, .dg = 3 }}, - .data = &(data_t){ type_cube } }}; + .data = rcube }}; data_t *cube3 = &(data_t){ type_op_data_set, &(struct op_data_set){ .op = &(data_t){ type_copy_timeshift, &(struct copy_timeshift){ @@ -310,8 +320,6 @@ while(key_work(&eye, &mode) != EOF){ xclear(); - prm.sec = eye.sec; - if(mode % 2 == 1){ int x, y; for(y=0; y<2; y++){