diff -urN wf-/data.c wf/data.c --- wf-/data.c Mon Jan 4 00:00:00 2016 +++ wf/data.c Wed Jan 6 00:00:00 2016 @@ -18,6 +18,7 @@ CASE_RET(type_circle); CASE_RET(type_ball); CASE_RET(type_arc); + CASE_RET(type_octahedron); CASE_RET(type_arr); CASE_RET(type_op_data_set); CASE_RET(type_slice); @@ -33,6 +34,9 @@ CASE_RET(type_slide_way); CASE_RET(type_slide_way_liss); CASE_RET(type_rot_way); + CASE_RET(type_rdiv_way); + CASE_RET(type_rail_way); + CASE_RET(type_train_way); CASE_RET(type_copy); CASE_RET(type_copy_rot); CASE_RET(type_copy_point_symmetry); @@ -228,8 +232,8 @@ {-1,-1,-1},{1,-1,-1},{1,1,-1},{-1,1,-1}, {-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, &wk[8] } + 0,1,2,3,0,4,5,6,7,4,-1, + 1,5,-1, 2,6,-1, 3,7,-1, -1 }, wk, &wk[8] } }; data_draw(&data, prm); } @@ -301,6 +305,21 @@ } static void +octahedron_draw(prm_t *prm) +{ + d3_t wk[6*2]; + data_t data = { + type_wire_frame, + &(struct wire_frame){ + 6, + (pos_t[]){ {0,0,1},{1,0,0},{0,1,0},{-1,0,0},{0,-1,0},{0,0,-1} }, + (int[]){ 0,1,5,3,0,2,5,4,0,-1, 1,2,3,4,1,-1, -1 }, + wk, &wk[6] } + }; + data_draw(&data, prm); +} + +static void arr_draw(data_t *data, prm_t *prm) { for(; data->type!=type_end; data++){ @@ -362,6 +381,9 @@ case type_arc: arc_draw(data->p, prm); break; + case type_octahedron: + octahedron_draw(prm); + break; case type_arr: arr_draw(data->p, prm); @@ -531,6 +553,41 @@ } static void +op_data_rail_way(struct rail_way *rlw, data_t *data, prm_t *prm) +{ + struct way way = rlw->way; + pos_t p_f, p_r; + vec_t vy; + axis_t ax; + affin_t af; + + way_get_back_t(&way, prm->sec, rlw->len, &p_r); + p_f = way.ret_p; + + vec_set(&vy, &p_r, &p_f); + axis_set(&ax, &p_f, &vy); + + affin_axis_rconv(&af, &ax); + affin_compo(&prm->af, &prm->af, &af); + data_draw(data, prm); +} + +static void +op_data_train_way(struct train_way *tw, data_t *data, prm_t *prm) +{ + struct way way = tw->way; + struct rail_way rlw = { .len = tw->len, .way = tw->way }; + data_t op = { type_rail_way, &rlw }; + int i; + + for(i=0; in; i++){ + op_data_draw(&op, data, prm); + prm->sec = way_get_back_t(&way, prm->sec, tw->len, NULL); + prm->sec = way_get_back_t(&way, prm->sec, tw->len2, NULL); + } +} + +static void op_data_copy(struct copy *copy, data_t *data, prm_t *prm) { int x, y, z; @@ -663,6 +720,12 @@ break; case type_rdiv_way: op_data_rdiv_way(op->p, data, prm); + break; + case type_rail_way: + op_data_rail_way(op->p, data, prm); + break; + case type_train_way: + op_data_train_way(op->p, data, prm); break; case type_copy: diff -urN wf-/data.h wf/data.h --- wf-/data.h Mon Jan 4 00:00:00 2016 +++ wf/data.h Wed Jan 6 00:00:00 2016 @@ -20,6 +20,7 @@ #define type_circle 5 #define type_ball 6 #define type_arc 7 +#define type_octahedron 8 #define type_arr 10 #define type_op_data_set 11 @@ -39,6 +40,8 @@ #define type_slide_way_liss 121 #define type_rot_way 130 #define type_rdiv_way 131 +#define type_rail_way 132 +#define type_train_way 133 #define type_copy 200 #define type_copy_rot 201 @@ -122,6 +125,17 @@ struct rdiv_way{ int n; struct way rate_way; +}; + +struct rail_way{ + double len; + struct way way; +}; + +struct train_way{ + int n; + double len, len2; + struct way way; }; struct copy{ diff -urN wf-/way.c wf/way.c --- wf-/way.c Sun Jan 3 02:00:00 2016 +++ wf/way.c Wed Jan 6 00:00:00 2016 @@ -103,6 +103,47 @@ } } +double +way_get_back_t(struct way *way, double t, double len, pos_t *ret_back_pos) +{ + int n = way->n, idx, nxt; + double tmp = t, spd, back_sec, l, r; + struct way w; + + if(!way->ps) ERR("way->ps NULL"); + + way_get(way, t); + w = *way; + + idx = way_idx_rate(way->ts, n, &tmp); + do{ + while(way->ts[idx] <= 0) idx = (idx - 1 + n) % n; + nxt = (idx + 1) % n; + spd = pos_distance(&way->ps[idx], &way->ps[nxt]) / way->ts[idx]; + idx = nxt; + }while(spd == 0); + + tmp = t; + back_sec = len / spd; + do{ + tmp -= back_sec; + way_get(way, tmp); + }while(pos_distance(&w.ret_p, &way->ret_p) < len); + + l = tmp; + r = t; + while(r - l > 0.000001){ + tmp = (l + r) * 0.5; + way_get(way, tmp); + if(pos_distance(&w.ret_p, &way->ret_p) > len) l = tmp; + else r = tmp; + } + + if(ret_back_pos) *ret_back_pos = way->ret_p; + *way = w; + return tmp; +} + void way_liss_init(struct way_liss *wl, const pos_t *ps, const pos_t *pe, const d3_t *sec, const d3_t *init_sec) { diff -urN wf-/way.h wf/way.h --- wf-/way.h Sun Jan 3 02:00:00 2016 +++ wf/way.h Wed Jan 6 00:00:00 2016 @@ -34,6 +34,7 @@ int way_idx_rate(const double *ts, int n, double *t); void way_get(struct way *way, double t); +double way_get_back_t(struct way *way, double t, double len, pos_t *ret_back_pos); struct way_liss{ diff -urN wf-/wf_ex.c wf/wf_ex.c --- wf-/wf_ex.c Mon Jan 4 00:00:00 2016 +++ wf/wf_ex.c Wed Jan 6 00:00:00 2016 @@ -366,7 +366,7 @@ data_t *fireworks = &(data_t){ type_op_data_set, &(struct op_data_set){ .op = &(data_t){ type_arr, (data_t[]){ { type_copy_timeshift_rot, &(struct copy_timeshift_rot){ - .n=6, .init_sec=0, .step_sec=2, .l=LINE_Z, .init_deg=0, .step_deg=360/6 }}, + .n=3, .init_sec=0, .step_sec=2, .l=LINE_Z, .init_deg=0, .step_deg=360/3 }}, { type_copy_timeshift, &(struct copy_timeshift){ .n=3, .init_sec=0, .step_sec=-1, .init={200,0,0}, .step=D3_O }}, { type_slide_way, &(struct way){ @@ -384,6 +384,25 @@ { type_end } }}, .data = spin_ball }}; + double a = 10, b = a*2; + struct way *rail = &(struct way){ + .n=20, + .ps = (pos_t[]){ + {a,0,0},{a+b,0,0},{a+b+b,a,0},{a+b+b+b,a,0},{a+b+b+b+a,a+a,0},{a+b+b+b,a+a+a,0}, + {a+b+b,a+a+a,0},{a+b,a+a+a,a},{a,a+a+a,a},{0,a+a,a},{a,a,a}, + {a+b,a,a},{a+b+b,0,a},{a+b+b+b,0,a},{a+b+b+b+a,a,a},{a+b+b+b,a+a,a}, + {a+b+b,a+a,a},{a+b,a+a,0},{a,a+a,0},{0,a,0} }, + .ts=(double[]){ 3,4,3,1,1, 1,2,1,0.5,0.5, 3,4,3,1,1, 1,2,1,0.5,0.5 }, + .vs=NULL, .dg=3 }; + + data_t *train = &(data_t){ type_op_data_set, &(struct op_data_set){ + .op = &(data_t){ type_arr, (data_t[]){ + { type_slide, &(d3_t){0,-4*a,0} }, + { type_train_way, &(struct train_way){.n=6, .len=4, .len2=4, .way=*rail} }, + { type_zoom_and_slide, (d3_t[]){ {1,4,1},{0,-2,0} } }, + { type_end } }}, + .data = &(data_t){ type_cube } }}; + data.type = type_arr; data.p = (data_t[]){ *axyz, @@ -393,6 +412,7 @@ *exile, *lissajours, *half_pipe, *fireworks, + *train, { type_end } }; }