diff -urN rt_v49/area.c rt_v50/area.c --- rt_v49/area.c 2018-06-08 23:52:17.000000000 +0900 +++ rt_v50/area.c 2018-06-11 21:52:11.000000000 +0900 @@ -131,13 +131,16 @@ } void -area_show(struct area *a) +area_show(struct area *a, char *tail) { struct node *p = a->p; int v = a->v; + if(!tail){ + tail = ""; + } if(!p){ - fprintf(stderr, "all %d\n", v); + fprintf(stderr, "all %d%s", v, tail); return; } @@ -146,7 +149,7 @@ p = p->next; v = !v; } - fprintf(stderr, "%s\n", v ? "###" : "..."); + fprintf(stderr, "%s%s", v ? "###" : "...", tail); } /* EOF */ diff -urN rt_v49/area.h rt_v50/area.h --- rt_v49/area.h 2018-06-08 23:52:17.000000000 +0900 +++ rt_v50/area.h 2018-06-11 21:52:16.000000000 +0900 @@ -30,7 +30,7 @@ void area_op(int op, struct area *a, struct area *b, struct area *r); void area_op_eq(int op, struct area *dst, struct area *src); -void area_show(struct area *a); +void area_show(struct area *a, char *tail); int area_is_all(struct area *a, int v); #endif diff -urN rt_v49/cross.c rt_v50/cross.c --- rt_v49/cross.c 2018-06-10 20:14:51.000000000 +0900 +++ rt_v50/cross.c 2018-06-11 23:11:26.000000000 +0900 @@ -267,6 +267,18 @@ return 0; } +static int +is_plane(int kind) +{ + switch(kind){ + case KIND_SQUARE: + case KIND_CIRCLE: + case KIND_TRIANGLE: + return 1; + } + return 0; +} + int cross_cross_one(int kind_idx, struct lstx *l2g, int eq_d, struct line *l_g, struct cross_ret *ret) { @@ -316,7 +328,6 @@ case KIND_SQUARE: case KIND_CIRCLE: case KIND_TRIANGLE: - v_set(nv, v_z1); break; case KIND_BALL: unit(ret->p, nv); @@ -341,30 +352,26 @@ break; } - if(rev){ - v_neg(nv, nv); + if(is_plane(kind_idx)){ + struct line x, y;; + lstx_tr_line(l2g, L2G, &line_x1, &x); + lstx_tr_line(l2g, L2G, &line_y1, &y); + cross_product_unit(x.v, y.v, ret->l_nv_g.v); + lstx_tr_p(l2g, L2G, ret->p, ret->l_nv_g.p); + }else{ + line_new(&l_nv, ret->p, nv); + lstx_tr_line(l2g, L2G, &l_nv, &ret->l_nv_g); } - line_new(&l_nv, ret->p, nv); - lstx_tr_line(l2g, L2G, &l_nv, &ret->l_nv_g); + if(rev){ + v_neg(ret->l_nv_g.v, ret->l_nv_g.v); + } unit(ret->l_nv_g.v, ret->nv); unit(l_g->v, ret->eyev); ret->ang_nv_eyev = dot( ret->nv, ret->eyev ); } static int -is_plane(int kind) -{ - switch(kind){ - case KIND_SQUARE: - case KIND_CIRCLE: - case KIND_TRIANGLE: - return 1; - } - return 0; -} - -static int kind_to_op(int kind) { switch(kind){ @@ -416,8 +423,9 @@ } static int -cross_op(struct line *l_g, int prev_idx, struct data *data, int p_i, struct data_one *pd, struct area *ret_a) +cross_op(struct line *l_g, int prev_idx, struct data *data, int p_i, struct area *ret_a) { + struct data_one *pd = &data->lst[p_i]; int op = kind_to_op(pd->kind); int i, j, k, n; int v = op == AREA_OP_AND ? 1 : 0; @@ -436,7 +444,7 @@ d = &data->lst[j]; if( is_op(d->kind) ){ - cross_op(l_g, prev_idx, data, j, d, &a); + cross_op(l_g, prev_idx, data, j, &a); }else{ struct cross_ret r; @@ -453,8 +461,8 @@ }else if(n == 1){ r.t = r.ts[0]; line_on_line_p(&r.l, r.t, r.p); - area_ins(&a, r.t, &r, sizeof(r)); cross_get_nv( d->kind, &d->l2g, l_g, 0, &r ); + area_ins(&a, r.t, &r, sizeof(r)); if(r.ang_nv_eyev > 0){ area_not(&a); } @@ -516,7 +524,7 @@ ret_.idx = -1; if(is_op(d->kind)){ struct area a; - if( !cross_op( l_g, prev_idx, data, i, d, &a ) ){ + if( !cross_op( l_g, prev_idx, data, i, &a ) ){ continue; } if( !my_area_sel(&a, &ret_) ){ diff -urN rt_v49/dat.c rt_v50/dat.c --- rt_v49/dat.c 2018-06-07 23:39:31.000000000 +0900 +++ rt_v50/dat.c 2018-06-11 21:52:43.000000000 +0900 @@ -104,6 +104,7 @@ bp = COPY_FROM_BP(bp, d->kind); bp = unpack_lx(bp, &d->l2g); bp = COPY_FROM_BP_ARR(bp, d->def_col); + bp = COPY_FROM_BP_ARR(bp, d->def_col_r); bp = unpack_maps(bp, &d->maps); bp = unpack_rtd(bp, &d->rtd); bp = COPY_FROM_BP(bp, d->not); diff -urN rt_v49/dat.h rt_v50/dat.h --- rt_v49/dat.h 2018-06-08 23:52:22.000000000 +0900 +++ rt_v50/dat.h 2018-06-11 21:52:48.000000000 +0900 @@ -38,6 +38,7 @@ int kind; struct lstx l2g; int def_col[3]; + int def_col_r[3]; struct maps maps; struct rtd rtd; int not; diff -urN rt_v49/dat.py rt_v50/dat.py --- rt_v49/dat.py 2018-06-10 20:16:27.000000000 +0900 +++ rt_v50/dat.py 2018-06-11 22:57:03.000000000 +0900 @@ -126,6 +126,11 @@ kind = d.get('kind') if kind == 'poly_n': + if in_op: + d_ = d_copy(d) + d_['kind'] = 'circle' + return d_setup( d_, in_op ) + n = d.get('n', 3) deg = 360.0 / n rad = mt.deg_to_rad(deg/2) @@ -157,6 +162,8 @@ return ret_lst(lst, f) if kind == 'tri_prism_side': + f = for_op_not() + d0 = d_copy(d) d0['kind'] = 'square' d0['l2m'] = [ ax.rot_x(90) ] + d0.get( 'l2m', [] ) @@ -170,7 +177,7 @@ d2['kind'] = 'square' d2['l2m'] = [ ax.rot_x(-90), ax.slide_x(1), ax.zoom_x(zm), ax.rot_z(45), ax.slide_x(-1) ] + d2.get( 'l2m', [] ) - return sum( map( d_setup, [d0,d1,d2] ), [] ) + return ret_lst( [d0,d1,d2], f ) if kind == 'tri_prism': f = for_op_not() @@ -184,11 +191,13 @@ d2 = d_copy(d) d2['kind'] = 'triangle' - d2['l2m'] = [ ax.slide_z(1), ax.zoom_z(-1) ] + d2.get( 'l2m', [] ) + d2['l2m'] = [ ax.slide_z(1), ax.rot_y(180) ] + d2.get( 'l2m', [] ) return ret_lst( [d0,d1,d2], f ) if kind == 'poly_n_prism_side': + f = for_op_not() + n = d.get('n', 3) deg = 360.0 / n rad = mt.deg_to_rad(deg/2) @@ -199,9 +208,10 @@ d_ = d_copy(d) d_['kind'] = 'square' d_['l2m'] = [ ax.rot_x(90), ax.zoom_x(b), ax.slide_y(-h), ax.rot_z(deg*i) ] + d_.get( 'l2m', [] ) - return d_setup( d_ ) + return d_ - return sum( map( poly_n_prism_side_f, range(n) ), [] ) + lst = ut.map_lst( poly_n_prism_side_f, range(n) ) + return ret_lst(lst, f) if kind == 'poly_n_prism': f = for_op_not() @@ -215,11 +225,13 @@ d2 = d_copy(d) d2['kind'] = 'poly_n' - d2['l2m'] = [ ax.slide_z(1), ax.zoom_z(-1) ] + d2.get( 'l2m', [] ) + d2['l2m'] = [ ax.slide_z(1), ax.rot_y(180) ] + d2.get( 'l2m', [] ) return ret_lst( [d0,d1,d2], f ) if kind == 'four_pyramid_side': + f = for_op_not() + n = 4 zm = math.sqrt(2) @@ -227,9 +239,10 @@ d_ = d_copy(d) d_['kind'] = 'triangle' d_['l2m'] = [ ax.zoom_y(zm), ax.rot_x(45), ax.slide_y(-1), ax.rot_z(90*i) ] + d_.get( 'l2m', [] ) - return d_setup( d_ ) + return d_ - return sum( map( four_pyramid_side_f, range(n) ), [] ) + lst = ut.map_lst( four_pyramid_side_f, range(n) ) + return ret_lst(lst, f) if kind == 'four_pyramid': f = for_op_not() @@ -239,11 +252,13 @@ d1 = d_copy(d) d1['kind'] = 'square' - d1['l2m'] = [ ax.zoom_z(-1) ] + d1.get( 'l2m', [] ) + d1['l2m'] = [ ax.rot_y(180) ] + d1.get( 'l2m', [] ) return ret_lst( [d0,d1], f ) if kind == 'tri_pyramid_side': + f = for_op_not() + d0 = d_copy(d) d0['kind'] = 'triangle' d0['l2m'] = [ ax.rot_x(90) ] + d0.get( 'l2m', [] ) @@ -260,7 +275,7 @@ d2['kind'] = 'triangle' d2['l2m'] = [ ax.zoom([b,h,1]), ax.rot_x(deg), ax.rot_z(-90-45), ax.slide([-0.5,0.5,0]) ] + d2.get( 'l2m', [] ) - return sum( map( d_setup, [d0,d1, d2] ), [] ) + return ret_lst( [d0,d1,d2], f ) if kind == 'tri_pyramid': f = for_op_not() @@ -270,11 +285,13 @@ d1 = d_copy(d) d1['kind'] = 'triangle' - d1['l2m'] = [ ax.zoom_z(-1) ] + d1.get( 'l2m', [] ) + d1['l2m'] = [ ax.rot_y(180) ] + d1.get( 'l2m', [] ) return ret_lst( [d0,d1], f ) if kind == 'poly_n_pyramid_side': + f = for_op_not() + n = d.get('n', 3) deg = 360.0 / n rad = mt.deg_to_rad(deg/2) @@ -287,9 +304,10 @@ d_ = d_copy(d) d_['kind'] = 'triangle' d_['l2m'] = [ ax.zoom([b,h2,1]), ax.rot_x(deg2), ax.slide_y(-h), ax.rot_z(deg*i) ] + d_.get( 'l2m', [] ) - return d_setup( d_ ) + return d_ - return sum( map( poly_n_pyramid_side_f, range(n) ), [] ) + lst = ut.map_lst( poly_n_pyramid_side_f, range(n) ) + return ret_lst(lst, f) if kind == 'poly_n_pyramid': f = for_op_not() @@ -299,7 +317,7 @@ d1 = d_copy(d) d1['kind'] = 'poly_n' - d1['l2m'] = [ ax.zoom_z(-1) ] + d1.get( 'l2m', [] ) + d1['l2m'] = [ ax.rot_y(180) ] + d1.get( 'l2m', [] ) return ret_lst( [d0,d1], f ) @@ -315,7 +333,7 @@ d2 = d_copy(d) d2['kind'] = 'circle' - d2['l2m'] = [ ax.slide_z(1), ax.zoom_z(-1) ] + d2.get( 'l2m', [] ) + d2['l2m'] = [ ax.slide_z(1), ax.rot_y(180) ] + d2.get( 'l2m', [] ) return ret_lst( [d0,d1,d2], f ) @@ -327,7 +345,7 @@ d1 = d_copy(d) d1['kind'] = 'circle' - d1['l2m'] = [ ax.zoom_z(-1) ] + d1.get( 'l2m', [] ) + d1['l2m'] = [ ax.rot_y(180) ] + d1.get( 'l2m', [] ) return ret_lst( [d0,d1], f ) ### @@ -338,6 +356,8 @@ if 'def_col' not in d: d['def_col'] = [128,128,128] + if 'def_col_r' not in d: + d['def_col_r'] = d.get('def_col') if 'maps' not in d: d['maps'] = [] @@ -421,7 +441,7 @@ typ_map = '{xyz2g:lx,fn:i4,fn_r:i4,wh2xyz:lx,rep:(i4,i4)}' typ_ids = 'id:i4,parent:i4,children:[i4]' -typ_d = '{{kind:i4,l2g:lx,def_col:col,maps:[{}],rtd:rtd,not:bool,{}}}'.format(typ_map, typ_ids) +typ_d = '{{kind:i4,l2g:lx,def_col:col,def_col_r:col,maps:[{}],rtd:rtd,not:bool,{}}}'.format(typ_map, typ_ids) typ_data = '[{}]'.format(typ_d) def setup(sec): diff -urN rt_v49/rt.c rt_v50/rt.c --- rt_v49/rt.c 2018-05-29 21:41:28.000000000 +0900 +++ rt_v50/rt.c 2018-06-11 22:28:29.000000000 +0900 @@ -49,7 +49,7 @@ int sum_col[3] = {-1,-1,-1}; if(d->maps.n <= 0){ - copy_col(ret_col, d->def_col); + copy_col(ret_col, rev ? d->def_col_r : d->def_col); return; } @@ -83,7 +83,7 @@ } } if(is_no_col(sum_col)){ - copy_col(ret_col, d->def_col); + copy_col(ret_col, rev ? d->def_col_r : d->def_col); return; } col_max_255(sum_col, ret_col); diff -urN rt_v49/rt.py rt_v50/rt.py --- rt_v49/rt.py 2018-05-18 21:28:17.000000000 +0900 +++ rt_v50/rt.py 2018-06-11 22:28:48.000000000 +0900 @@ -24,7 +24,8 @@ def map_col(idx, l_nv_g, rev, sec): d = data_one_get(idx) - def_col = mt.arr( d.get('def_col') ) + col_k = 'def_col_r' if rev else 'def_col' + def_col = mt.arr( d.get(col_k) ) if 'maps' not in d: return def_col diff -urN rt_v49/v.c rt_v50/v.c --- rt_v49/v.c 2018-05-01 23:19:45.000000000 +0900 +++ rt_v50/v.c 2018-06-11 21:54:09.000000000 +0900 @@ -90,4 +90,16 @@ unit(r, r); } +void +v_show(char *head, double *v, char *tail) +{ + if(!head){ + head = ""; + } + if(!tail){ + tail = ""; + } + fprintf(stderr, "%s(%f %f %f)%s", head, v[0], v[1], v[2], tail); +} + /* EOF */ diff -urN rt_v49/v.h rt_v50/v.h --- rt_v49/v.h 2018-05-01 23:19:45.000000000 +0900 +++ rt_v50/v.h 2018-06-11 21:54:09.000000000 +0900 @@ -1,6 +1,7 @@ #ifndef __V_H__ #define __V_H__ 1 +#include #include "mt.h" extern double v_x1[3]; @@ -19,4 +20,6 @@ void cross_product(double *a, double *b, double *r); void cross_product_unit(double *a, double *b, double *r); +void v_show(char *head, double *v, char *tail); + #endif diff -urN rt_v49/way.py rt_v50/way.py --- rt_v49/way.py 2018-05-08 20:47:52.000000000 +0900 +++ rt_v50/way.py 2018-06-11 23:39:01.000000000 +0900 @@ -68,6 +68,10 @@ # r: default 0 # t: default 1.0 (sec) +# if exists +# 'ep=[-20,-20,-20],[20,20,20],[3,4,5],-2.5' +# 'et=[-20,-20,-20],[20,20,20],[3,4,5],2.5' + def p_r_t(key): lst = [ [0,0,0],0,1 ] lst_ = eval( '[' + ut.arg_s(key) + ']' ) @@ -82,10 +86,15 @@ t3 = (t, t*4/3, t*5/3) return liss(ps, pe, t3) - f_p = liss_get('eyep') - f_t = liss_get('eyet') + def f(k): + s = ut.arg_s('e'+k) + if s: + (ps, pe, t3, add_t) = eval( '[' + s + ']' ) + return lambda t, itp3=True: liss(ps, pe, t3)(t + add_t, itp3) + return liss_get('eye'+k) + init_sec = ut.arg_f('init_sec', 0.0) - return lambda t, itp3=True: line.new_p2( f_p(t+init_sec, itp3), f_t(t+init_sec, itp3) ) + return lambda t, itp3=True: line.new_p2( f('p')(t+init_sec, itp3), f('t')(t+init_sec, itp3) ) def test(lst, itp3=False, end_t=4, stp_t=0.25): print( lst, 'itp3=', itp3 )