diff -urN wf-/data.c wf/data.c --- wf-/data.c 2016-01-03 00:00:00.000000000 +0900 +++ wf/data.c 2016-01-03 02:00:00.000000000 +0900 @@ -20,6 +20,7 @@ CASE_RET(type_arc); CASE_RET(type_arr); CASE_RET(type_op_data_set); + CASE_RET(type_slice); CASE_RET(type_slide); CASE_RET(type_zoom); CASE_RET(type_zoom_and_slide); @@ -312,6 +313,14 @@ } static void +slice_draw(struct slice *sl, prm_t *prm) +{ + double sec = prm->sec; + int i = way_idx_rate(sl->ts, sl->n, &sec); + data_draw(&sl->ds[i], prm); +} + +static void test_conv_draw(pos_t *p, prm_t *prm) { if(!prm->skip_af){ @@ -358,6 +367,9 @@ case type_op_data_set: op_data_set_draw(data->p, prm); break; + case type_slice: + slice_draw(data->p, prm); + break; case type_test_conv: test_conv_draw(data->p, prm); @@ -383,6 +395,14 @@ } static void +op_data_slice(struct slice *sl, data_t *data, prm_t *prm) +{ + double sec = prm->sec; + int i = way_idx_rate(sl->ts, sl->n, &sec); + op_data_draw(&sl->ds[i], data, prm); +} + +static void op_data_slide(d3_t *slide, data_t *data, prm_t *prm) { affin_t af; @@ -575,6 +595,9 @@ case type_arr: op_data_arr(op->p, data, prm); break; + case type_slice: + op_data_slice(op->p, data, prm); + break; case type_slide: op_data_slide(op->p, data, prm); diff -urN wf-/data.h wf/data.h --- wf-/data.h 2016-01-03 00:00:00.000000000 +0900 +++ wf/data.h 2016-01-03 02:00:00.000000000 +0900 @@ -23,6 +23,7 @@ #define type_arr 10 #define type_op_data_set 11 +#define type_slice 12 #define type_slide 100 #define type_zoom 101 @@ -79,6 +80,12 @@ data_t *op, *data; }; +struct slice{ + int n; + data_t *ds; + double *ts; /* way ts */ +}; + struct slide_way_liss{ pos_t ps, pe; d3_t sec, init_sec; diff -urN wf-/nt.c wf/nt.c --- wf-/nt.c 2016-01-03 00:00:00.000000000 +0900 +++ wf/nt.c 2016-01-03 02:00:00.000000000 +0900 @@ -4,7 +4,7 @@ fz(double sec, int ac, char **av) { double r = 30; - double sky_deg = 10; + double sky_deg = 40; pos_t p = {0,0,-r}; data_t data = { type_op_data_set, &(struct op_data_set){ .op = &(data_t){ type_rot_way, &(struct rot_way){ @@ -31,7 +31,8 @@ int main(int ac, char **av) { - double l_sec = 0, r_sec = 5, sec = 2.5; + double l_sec = 0, r_sec = 5, sec = (l_sec + r_sec) * 0.5; + double pipe_sec = 2; while(r_sec - l_sec > 5*0.0000001){ sec = (l_sec + r_sec) * 0.5; @@ -39,6 +40,6 @@ else l_sec = sec; } printf("sec=%f,5-sec=%f\n", sec, 5-sec); - printf("%f:%f=%f:5\n", sec, 5-sec, sec*5/(5-sec)); + printf("%f:%f=%f:%f\n", sec, 5-sec, sec*pipe_sec/(5-sec), pipe_sec); return 0; } diff -urN wf-/way.c wf/way.c --- wf-/way.c 2015-12-30 00:00:00.000000000 +0900 +++ wf/way.c 2016-01-03 02:00:00.000000000 +0900 @@ -8,8 +8,8 @@ return ts[ n-1 ] >= 0; } -static int -t_idx_rate(const double *ts, int n, double *t) +int +way_idx_rate(const double *ts, int n, double *t) { /* t --> 0..1 , return idx */ @@ -48,7 +48,7 @@ { int n = way->n; const double *ts = way->ts; - int idx = t_idx_rate(ts, n, &t); + int idx = way_idx_rate(ts, n, &t); int nxt = (idx + 1) % n; if(way->dg == 1){ diff -urN wf-/way.h wf/way.h --- wf-/way.h 2016-01-03 00:00:00.000000000 +0900 +++ wf/way.h 2016-01-03 02:00:00.000000000 +0900 @@ -32,6 +32,7 @@ #define WAY_V2(v1,v2,t1,t2,dg_) { .n=2, .vs=(double[]){v1,v2}, .ts=(double[]){t1,t2}, .ps=NULL, .dg=dg_ } +int way_idx_rate(const double *ts, int n, double *t); void way_get(struct way *way, double t); diff -urN wf-/wf_ex.c wf/wf_ex.c --- wf-/wf_ex.c 2016-01-03 00:00:00.000000000 +0900 +++ wf/wf_ex.c 2016-01-03 02:00:00.000000000 +0900 @@ -309,6 +309,11 @@ }}; double r = 30; + double sky_deg = 40; + double sky_sec = 1.966005, pipe_sec = 2, half_sec = (sky_sec + pipe_sec) * 2; + data_t spin = { type_rot_way, &(struct rot_way){ + .l={D3_O,D3_I}, .deg_way=WAY_V2(0,360*4, sky_sec,sky_sec, 3) }}; + data_t *half_pipe = &(data_t){ type_op_data_set, &(struct op_data_set){ .op = &(data_t){ type_zoom_and_slide, (d3_t[]){{0.1,0.1,0.1},{-30,-30,-10}} }, .data = &(data_t){ type_arr, (data_t[]){ @@ -321,6 +326,21 @@ { type_copy_rot, &(struct copy_rot){ .n=5, .l=LINE_Y, .init_deg=-90+30, .step_deg=30 } }, { type_end } }}, .data = &(data_t){ type_cross, (pos_t[]){{-1,0,-r},{1,0,-r}} } }}, + { type_op_data_set, &(struct op_data_set){ + .op = &(data_t){ type_arr, (data_t[]){ + { type_copy_timeshift, &(struct copy_timeshift){ + .n=40, .init_sec=0, .step_sec=-1, .init=D3_O, .step=D3_O }}, + { type_rot_way, &(struct rot_way){ + .l=LINE_Z, .deg_way=WAY_V2(0,360, 60,0, 1) }}, + { type_slide, &(d3_t){r*4,0,0} }, + { type_rot_way, &(struct rot_way){ + .l=LINE_Y, .deg_way=WAY_V2(-90-sky_deg,90+sky_deg, half_sec,half_sec, 3) }}, + { type_slide, &(d3_t){0,0,-r} }, + { type_slice, &(struct slice){ + .n=3, .ds=(data_t[]){ { type_none }, spin, { type_none } }, + .ts=(double[]){ sky_sec+pipe_sec*2, sky_sec*2, pipe_sec*2+sky_sec} }}, + { type_end } }}, + .data = &(data_t){ type_square } }}, { type_end } }} }}; data.type = type_arr;