diff -urN rt_v18/cross.py rt_v19/cross.py --- rt_v18/cross.py 2018-04-07 23:36:02.000000000 +0900 +++ rt_v19/cross.py 2018-04-12 09:39:53.000000000 +0900 @@ -61,21 +61,6 @@ crs['xy_cond_f'] = lambda x, y: x+y<=1 and -x+y<=1 and y>=0 return plane_z0_xy_cond(crs) -def poly_n(crs): - n = d.get('n', 3) - deg = 360.0 / n - rad = mt.deg_to_rad( deg * 0.5 ) - h = math.cos(rad) - w = math.sin(rad) - for i in range(n): - axi = ax.slide_y(-1).compo( ax.zoom([w,h,1]) ).compo( ax.rot_z(i*deg) ) - #crs_ = { 'l': axi.tr( 'g2l', crs.get('l') ), 'd': crs.get('d') } - crs_ = { 'l': axi.tr_line( 'g2l', crs.get('l') ), 'd': crs.get('d') } - if triangle(crs_): - crs['t'] = crs_.get('t') - return True - return False - def ball(crs): # r = 1, c = zero # l = p + v t @@ -88,6 +73,10 @@ c = np.dot( l.p, l.p ) - 1 ts = mt.quadratic_formula(a, b, c) + if not ts: + return False + if len(ts) > 1 and crs.get('eq_d'): + ts = sorted( ts, key=abs )[-1:] ts = sorted( filter( lambda v: v > 0, ts ) ) if not ts: return False @@ -129,6 +118,10 @@ c = px*px + py*py - 1 ts = mt.quadratic_formula(a, b, c) + if not ts: + return False + if len(ts) > 1 and crs.get('eq_d'): + ts = sorted( ts, key=abs )[-1:] ts = sorted( filter( lambda v: v > 0, ts ) ) if not ts: return False @@ -186,6 +179,10 @@ c = px*px + py*py - pz*pz + 2*pz - 1 ts = mt.quadratic_formula(a, b, c) + if not ts: + return False + if len(ts) > 1 and crs.get('eq_d'): + ts = sorted( ts, key=abs )[-1:] ts = sorted( filter( lambda v: v > 0, ts ) ) if not ts: return False @@ -210,8 +207,13 @@ crs['nv'] = v.unit(p) def cross(crs): - l_g = crs.get('l_g') d = crs.get('d') + kind = d.get('kind') + + if crs.get('eq_d') and kind in [ 'square', 'circle', 'triangle' ]: + return False + + l_g = crs.get('l_g') l2g = d.get('l2g') #crs['l'] = lstx.tr( l2g, 'g2l', l_g ) crs['l'] = lstx.tr_line( l2g, 'g2l', l_g ) @@ -220,12 +222,11 @@ 'square': square, 'circle': circle, 'triangle': triangle, - 'poly_n': poly_n, 'ball': ball, 'pipe_side': pipe_side, 'cone_side': cone_side, } - f = dic.get( d.get('kind') ) + f = dic.get(kind) if not f: return False return f(crs) @@ -241,7 +242,6 @@ 'square': plane_z0_nv, 'circle': plane_z0_nv, 'triangle': plane_z0_nv, - 'poly_n': plane_z0_nv, 'ball': ball_nv, 'pipe_side': pipe_side_nv, 'cone_side': cone_side_nv, diff -urN rt_v18/rt.py rt_v19/rt.py --- rt_v18/rt.py 2018-04-07 23:33:23.000000000 +0900 +++ rt_v19/rt.py 2018-04-12 09:39:53.000000000 +0900 @@ -41,25 +41,21 @@ ref_rate = ut.arg_f('ref_rate', 0.001) -def get_col(data, lights, l_g, video, nest_rate=1.0, ref_len=None): +def get_col(data, lights, l_g, video, nest_rate=1.0, prev_d=None): if nest_rate < 0.01: return [] - lst = map( lambda d: { 'l_g': l_g, 'd': d }, data ) + lst = map( lambda d: { 'l_g': l_g, 'd': d, 'eq_d': d == prev_d }, data ) lst = ut.filter_lst( lambda crs: cross.cross(crs), lst ) if not lst: return [] - if ref_len: - lst = ut.filter_lst( lambda crs: crs.get('t') > ref_len * ref_rate, lst ) - if not lst: - return [] - crs = min( lst, key=lambda crs: crs.get('t') ) cross.nv(crs) - rtd = crs.get('d').get('rtd', {}) + d = crs.get('d') + rtd = d.get('rtd', {}) base = rtd.get('base', 0.3) crst = crs.get('t') @@ -106,7 +102,7 @@ return [] ref_v = nv * ( 2 * ang_nv_eyev_nega ) + eyev ref_l = line.new( crsp, ref_v ) - col = get_col( data, lights, ref_l, video, nest_rate * reflect, crst ) + col = get_col( data, lights, ref_l, video, nest_rate * reflect, d ) return col * reflect if col != [] else [] col_ = reflect_col() @@ -134,7 +130,7 @@ return [] ref_v = reflact_v() ref_l = line.new( crsp, ref_v ) - col = get_col( data, lights, ref_l, video, nest_rate * reflact, crst ) + col = get_col( data, lights, ref_l, video, nest_rate * reflact, d ) return col * reflact if col != [] else [] col_ = reflact_col()