File indexing completed on 2026-04-09 07:48:53
0001
0002 """
0003 CSGScanTest.py
0004 ==============
0005
0006 ::
0007
0008 ~/o/CSG/tests/CSGScanTest.sh grab
0009 ~/o/CSG/tests/CSGScanTest.sh ana
0010
0011
0012 """
0013 import os
0014 import numpy as np
0015 from glob import glob
0016 from opticks.ana.fold import Fold
0017
0018
0019 try:
0020 import matplotlib.pyplot as plt
0021 except ImportError:
0022 plt = None
0023 pass
0024
0025 try:
0026 import pyvista as pv
0027 except ImportError:
0028 pv = None
0029 pass
0030
0031 def plot3d(pos, grid=False):
0032 """
0033 https://docs.pyvista.org/plotting/plotting.html
0034
0035 q:close
0036 v:isometric camera
0037 +/-: increase/decrease point size
0038 """
0039 pl = pv.Plotter()
0040 pl.add_points(pos, color='#FFFFFF', point_size=2.0 )
0041 if grid:
0042 pl.show_grid()
0043 pass
0044 cp = pl.show()
0045 return cp
0046
0047
0048 def plot3d_arrows(pos, nrm, mag=1, grid=False):
0049 """
0050 """
0051 pl = pv.Plotter()
0052 pl.add_arrows(pos, nrm, mag=mag, color='#FFFFFF', point_size=2.0 )
0053 if grid:
0054 pl.show_grid()
0055 pass
0056 cp = pl.show()
0057 return cp
0058
0059
0060 class CSGScanTest(object):
0061 def __init__(self, a, symbol="a" ):
0062
0063 ori = a[:,0] ; valid_isect = a[:,0,3].view(np.int32)
0064 dir = a[:,1]
0065 post = a[:,2]
0066 isect = a[:,3]
0067
0068 tot = len(a)
0069 hit = np.count_nonzero( valid_isect == 1 )
0070 miss = np.count_nonzero( valid_isect == 0 )
0071
0072 self.symbol = symbol
0073 self.a = a
0074
0075 self.ori = ori ; self.valid_isect = valid_isect
0076 self.dir = dir
0077 self.post = post
0078 self.isect = isect
0079
0080 self.tot = tot
0081 self.hit = hit
0082 self.miss = miss
0083
0084 def __repr__(self):
0085 return "%s : tot %d hit %d miss %d " % (self.symbol, self.tot, self.hit, self.miss)
0086
0087
0088 def plot2d(st):
0089 plt.ion()
0090 fig, axs = plt.subplots(1)
0091 if not type(axs) is np.ndarray: axs = [axs]
0092
0093 ax = axs[0]
0094 ax.set_aspect('equal')
0095 ax.scatter( st.post[:,0], st.post[:,2], s=0.1 )
0096 ax.scatter( st.ori[:,0], st.ori[:,2] )
0097 scale = 10.
0098 ax.scatter( st.ori[:,0] + st.dir[:,0]*scale, st.ori[:,2]+st.dir[:,2]*scale )
0099 fig.show()
0100
0101 if __name__ == '__main__':
0102 f = Fold.Load("$FOLD", symbol="f")
0103 print(repr(f))
0104
0105 a = f.h.tt
0106 b = f.d.tt
0107
0108 a_ = CSGScanTest(a, symbol="f.h.tt")
0109 print(a_)
0110
0111 b_ = CSGScanTest(b, symbol="f.d.tt")
0112 print(b_)
0113
0114 plot3d( a_.post[:,:3] )
0115 plot3d( b_.post[:,:3] )
0116
0117
0118
0119
0120