diff options
author | Bryan Bishop <kanzure@gmail.com> | 2011-05-13 16:31:39 -0500 |
---|---|---|
committer | Bryan Bishop <kanzure@gmail.com> | 2011-05-13 16:31:39 -0500 |
commit | f7e07706a591ee84b598b387ee7f386c2cfa4a51 (patch) | |
tree | 213142ebbf22051f239818030bfd9ab2500aa8f3 | |
parent | 9c637cb6b670a0dff74734e4683c298cfa301802 (diff) | |
download | lolcad-f7e07706a591ee84b598b387ee7f386c2cfa4a51.tar.gz lolcad-f7e07706a591ee84b598b387ee7f386c2cfa4a51.zip |
added Surface.get_range
-rw-r--r-- | esolid/esolid.py | 158 |
1 files changed, 157 insertions, 1 deletions
diff --git a/esolid/esolid.py b/esolid/esolid.py index 9122025..a7f55cf 100644 --- a/esolid/esolid.py +++ b/esolid/esolid.py @@ -478,6 +478,10 @@ def gen_VDM_row1(n): def GoodSylvester(P1, P2, i): return P1.GoodSylvester(P2, i) +class K_BOX3D: + def __init__(self): + pass + class Point2D: def get_low_s(self): assert (self.type) @@ -2299,6 +2303,153 @@ class Surface: else: self.X, self.Y, self.Z, self.W = K_RATPOLY(), K_RATPOLY(), K_RATPOLY(), K_RATPOLY() self.mon_ok = False + def get_range(self, l_s, h_s, l_t, h_t): + assert self.mon_ok + + i = None + b = K_BOX3D() + v_l = [None] * 2 + v_h = [None] * 2 + X_l, X_h, Y_l, Y_h, Z_l, Z_h, W_l, W_h = 0, 0, 0, 0, 0, 0, 0, 0 + + v_l[0] = l_s + v_l[1] = l_t + v_h[0] = h_s + v_h[1] = h_t + + self.X.eval_range(v_l, v_h, X_l, X_h) + self.Y.eval_range(v_l, v_h, Y_l, Y_h) + self.Z.eval_range(v_l, v_h, Z_l, Z_h) + self.W.eval_range(v_l, v_h, W_l, W_h) + + if sgn(W_h) < 0: #if W_l <= W_h < 0 + if sgn(X_l) > 0: + b.low[0] = X_h / W_h + b.high[0] = X_l / W_l + elif sgn(X_h) < 0: + b.low[0] = X_h / W_l + b.high[0] = X_l / W_h + else: + b.low[0] = X_h / W_h + b.high[0] = X_l / W_h + + if sgn(Y_l) > 0: + b.low[1] = Y_h / W_h + b.high[1] = Y_l / W_l + elif sgn(Y_h) < 0: + b.low[1] = Y_h / W_l + b.high[1] = Y_l / W_h + else: + b.low[1] = Y_h / W_h + b.high[1] = Y_l / W_h + + if sgn(Z_l) > 0: + b.low[2] = Z_h / W_h + b.high[2] = Z_l / W_l + elif sgn(Z_h) < 0: + b.low[2] = Z_h / W_l + b.high[2] = Z_l / W_h + else: + b.low[2] = Z_h / W_h + b.high[2] = Z_l / W_h + + i = 0 + while i < 3: + b.low_infty[i] = b.high_infty[i] = 0 + i += 1 + elif sgn(W_l) < 0 and not sgn(W_h): + if sgn(X_l) > 0: + b.low[0] = X_h / W_l + b.low_infty[0] = 0 + elif sgn(X_h) < 0: + b.high[0] = X_l / W_l + b.high_infty[0] = 0 + + if sgn(Y_l) > 0: + b.low[1] = Y_h / W_l + b.low_infty[1] = 0 + elif sgn(Y_h) < 0: + b.high[1] = Y_l / W_l + b.high_infty[1] = 0 + + if sgn(Z_l) > 0: + b.low[2] = Z_h / W_l + b.low_infty[2] = 0 + elif sgn(Z_h) < 0: + b.high[2] = Z_l / W_l + b.high_infty[2] = 0 + elif not sgn(W_l) and not sgn(W_h): + if sgn(X_l) > 0: + b.low_infty[0] = 1 + elif sgn(X_h) < 0: + b.high_infty[0] = -1 + + if sgn(Y_l) > 0: + b.low_infty[1] = 1 + elif sgn(Y_h) < 0: + b.high_infty[1] = -1 + + if sgn(Z_l) > 0: + b.low_infty[2] = 1 + elif sgn(Z_h) < 0: + b.high_infty[2] = -1 + elif not sgn(W_l) and sgn(W_h) > 0: + if sgn(X_l) > 0: + b.low[0] = X_l / W_h + b.low_infty[0] = 0 + elif sgn(X_h) < 0: + b.high[0] = X_h / W_h + b.high_infty[0] = 0 + + if sgn(Y_l) > 0: + b.low[1] = Y_l / W_h + b.low_infty[1] = 0 + elif sgn(Y_h) < 0: + b.high[1] = Y_h / W_h + b.high_infty[1] = 0 + + if sgn(Z_l) > 0: + b.low[2] = Z_l / W_h + b.low_infty[2] = 0 + elif sgn(Z_h) < 0: + b.high[2] = Z_h / W_h + b.high_infty[2] = 0 + elif sgn(W_l) > 0: + if sgn(X_l) > 0: + b.low[0] = X_l / W_h + b.high[0] = X_h / W_l + elif sgn(X_h) < 0: + b.low[0] = X_l / W_l + b.high[0] = X_h / W_h + else: + b.low[0] = X_l / W_l + b.high[0] = X_h / W_l + + if sgn(Y_l) > 0: + b.low[1] = Y_l / W_h + b.high[1] = Y_h / W_l + elif sgn(Y_h) < 0: + b.low[1] = Y_l / W_l + b.high[1] = Y_h / W_h + else: + b.low[1] = Y_l / W_l + b.high[1] = Y_h / W_l + + if sgn(Z_l) > 0: + b.low[1] = Z_l / W_h + b.high[1] = Z_h / W_l + elif sgn(Z_h) < 0: + b.low[1] = Z_l / W_l + b.high[1] = Z_h / W_h + else: + b.low[1] = Z_l / W_l + b.high[1] = Z_h / W_l + + i = 0 + while i < 3: + b.low_infty[i] = b.high_infty[i] = 0 + i += 1 + return b class Patch: def __init__(self, *args): @@ -2391,7 +2542,12 @@ class Patch: def split_loops(self, new_patches): pass - def get_point_in(self): pass + def get_point_in(self): pass + + def overlap(self, other): + t_box = self.surf.get_range(self.low_s, self.high_s, self.low_t, self.high_t) + s_box = other.surf.get_range(other.low_s, other.high_s, other.low_t, other.high_t) + return t_box.overlap(s_box) class Graph: """ |