summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBryan Bishop <kanzure@gmail.com>2011-05-13 16:31:39 -0500
committerBryan Bishop <kanzure@gmail.com>2011-05-13 16:31:39 -0500
commitf7e07706a591ee84b598b387ee7f386c2cfa4a51 (patch)
tree213142ebbf22051f239818030bfd9ab2500aa8f3
parent9c637cb6b670a0dff74734e4683c298cfa301802 (diff)
downloadlolcad-f7e07706a591ee84b598b387ee7f386c2cfa4a51.tar.gz
lolcad-f7e07706a591ee84b598b387ee7f386c2cfa4a51.zip
added Surface.get_range
-rw-r--r--esolid/esolid.py158
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:
"""