from numpy import cos, sin
from bezier import BezierSegment
+from helixish import HelixishCurve
+from moenp import *
import sys
-tau = np.pi * 2
-
-origin = np.array((0,0,0))
-unit_x = np.array((1,0,0))
-unit_y = np.array((0,1,0))
-unit_z = np.array((0,0,1))
-
-def unit_v(v):
- return v / np.linalg.norm(v)
-
class DoubleCubicBezier():
def __init__(db, cp):
single = BezierSegment(cp)
m.nu = nu
m._thetas = [ u * tau for u in np.linspace(0, 1, nu+1) ]
m._cp2b = BezierSegment([ (c,) for c in [0.33,0.33, 1.50]])
- m._beziers = [ m._bezier(theta) for theta in m._thetas ]
- def _bezier(m, theta):
+ m._beziers = [ m._bezier(theta, HelixishCurve) for theta in m._thetas ]
+ #check = int(nu/3)
+ #m._beziers[check] = m._bezier(m._thetas[check], HelixishCurve)
+ def _bezier(m, theta, constructor=DoubleCubicBezier):
cp = [None] * 4
cp[0] = m.edge .point(theta)
cp[3] = m.midline.point(theta*2)
# file=sys.stderr)
cp[1] = cp[0] + cp1scale * m.edge .dirn (theta)
cp[2] = cp[3] + cp2scale * m.midline.dirn (theta*2)
- return DoubleCubicBezier(cp)
+ return constructor(cp)
def point(m, iu, t):
'''
0 <= iu <= nu meaning 0 <= u <= 1
return m.h.point_offset(offset=
offset if w <= m.nt else -offset,
**m._vw2tiu_kw(v,w))
+
+ def details(m, v, w):
+ '''
+ returns tuple of 4 vectors:
+ - point location
+ - normal (+ve is in the +ve y direction at iu=t=0) unit vector
+ - along extent (towrds +ve v) unit vector
+ - along traverse (towards +ve w) unit vector
+ '''
+ p, normal, vec_v, vec_w = m.h.details(**m._vw2tiu_kw(v,w))
+ if w > m.nt:
+ normal = -normal
+ vec_w = -vec_w
+ return p, normal, vec_v, vec_w