diff -urN rt_v1/cg.py rt_v2/cg.py --- rt_v1/cg.py 2018-03-16 21:06:29.000000000 +0900 +++ rt_v2/cg.py 2018-03-17 19:20:42.000000000 +0900 @@ -13,6 +13,7 @@ import img import way import wf +import rt if __name__ == "__main__": @@ -24,6 +25,7 @@ 'l2g': [ ax.zoom_all(50) ], },{ 'kind': 'ball', + 'def_col': [128,0,0], 'l2g': [ ax.zoom_all(20) ], } ] @@ -53,7 +55,10 @@ eye2g = ax.new_line( eye_f( cnt.cur_sec() ) ) - wf.draw(data, eye2g, wh2eye, sc_sz, video) + f = rt.draw + if 'wf' in sys.argv: + f = wf.draw + f(data, eye2g, wh2eye, sc_sz, video) video.add_img() fn = ( name if n == 1 else name+'0000{}'.format(i)[-5:] ) + '.jpg' diff -urN rt_v1/cross.py rt_v2/cross.py --- rt_v1/cross.py 1970-01-01 09:00:00.000000000 +0900 +++ rt_v2/cross.py 2018-03-16 20:38:43.000000000 +0900 @@ -0,0 +1,111 @@ +#!/usr/bin/env python + +import math +import mt +import v +import line +import ax +import lstx + +# return dic keys 't', 'p', 'nv' + +def plane_z0(l, d): + # z=0 (x-y) + + (vx, vy, vz) = l.v + (px, py, pz) = l.p + + if vz == 0: + return {} + + t = -float(pz) / vz + if t <= 0: + return {} + + p = l.on_line_p(t) + return { 't': t, 'nv': v.z1, 'p': p } + +def plane_z0_xy_cond(l, d): + xy_cond_f = d.get( 'xy_cond_f', lambda x, y: True ) + r = plane_z0(l, d) + if not r: + return {} + (x, y, _) = r.get('p') + return r if xy_cond_f(x, y) else {} + +def square(l, d): + # [-1,-1,0] --- [1,1,0] + d['xy_cond_f'] = lambda x, y: abs(x) <= 1 and abs(y) <= 1 + return plane_z0_xy_cond(l, d) + +def circle(l, d): + # center zero, r=1, z=0 + d['xy_cond_f'] = lambda x, y: x*x + y*y <= 1 + return plane_z0_xy_cond(l, d) + +def triangle(l, d): + # (0,1,0),(-1,0,0),(1,0,0) + d['xy_cond_f'] = lambda x, y: x+y<=1 and -x+y<=1 and y>=0 + return plane_z0_xy_cond(l, d) + +def poly_n(l, d): + 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) ) + r = triangle( axi.tr('g2l', l), d ) + if r: + return r + return {} + +def ball(l, d): + # r = 1, c = zero + # l = p + v t + # v^2 t^2 + 2 v p t + p^2 = 1^2 + a = sum( v.op2('*', l.v, l.v) ) + b = 2 * sum( v.op2('*', l.v, l.p) ) + c = sum( v.op2('*', l.p, l.p) ) - 1 + ts = mt.quadratic_formula(a, b, c) + ts = sorted( filter( lambda v: v > 0, ts ) ) + if not ts: + return {} + t = ts[0] + p = l.on_line_p(t) + nv = v.unit(p) + return { 't': t, 'nv': nv, 'p': p } + +def cross(l, d): + dic = { + 'square': square, + 'circle': circle, + 'triangle': triangle, + 'poly_n': poly_n, + 'ball': ball, + } + f = dic.get( d.get('kind') ) + if not f: + return {} + crs = f(l, d) + if not crs: + return {} + if 'p' not in crs: + crs['p'] = l.on_line_p( crs.get('t') ) + if 'l' not in crs: + crs['l'] = line.new( crs.get('p'), crs.get('nv') ) + return crs + +def cross_g(l_g, d): + l2g = d.get('l2g') + l = lstx.tr( l2g, 'g2l', l_g ) + crs = cross(l, d) + if not crs: + return {} + crs['l'] = nvl_g = lstx.tr( l2g, 'l2g', crs.get('l') ) + crs['p'] = nvl_g.p + crs['nv'] = nvl_g.v + return crs + +# EOF diff -urN rt_v1/rt.py rt_v2/rt.py --- rt_v1/rt.py 1970-01-01 09:00:00.000000000 +0900 +++ rt_v2/rt.py 2018-03-17 19:19:33.000000000 +0900 @@ -0,0 +1,32 @@ +#!/usr/bin/env python + +import ut +import v +import line +import lstx +import cross + +def map_col(d, crs): + def_col = d.get( 'def_col', v.all(128) ) + return def_col + +def get_col(data, l_g): + lst = map( lambda d: ( d, cross.cross_g(l_g, d) ), data ) + lst = filter( lambda (d, crs): 't' in crs, lst ) + if not lst: + return [] + (d, crs) = min( lst, key=lambda (d, crs): crs.get('t') ) + return map_col(d, crs) + +def draw(data, eye2g, wh2eye, sc_sz, video): + (w, h, d_) = sc_sz + wh2g = lstx.opt( wh2eye + [ eye2g ] ) + cnt = ut.new_cnt_wh(w, h, 'wh') + while cnt.up(): + (ix, iy) = cnt.cur() + p = lstx.tr( wh2g, 'l2g', [ix,iy,-d_] ) + l_g = line.new_p2(eye2g.p, p) + col = get_col(data, l_g) + if col: + video.set(ix, iy, col) +# EOF