def function(self,params): """Archemidean spiral function.""" aspect_ratio = params['aspect_ratio'] x = self.pattern_x/aspect_ratio y = self.pattern_y thickness = params['thickness'] gaussian_width = params['smoothing'] size = params['size'] half_thickness = thickness/2.0 spacing = size*2*pi distance_from_origin = sqrt(x**2+y**2) distance_from_spiral_middle = fmod(spacing + distance_from_origin - size*arctan2(y,x),spacing) distance_from_spiral_middle = minimum(distance_from_spiral_middle,spacing - distance_from_spiral_middle) distance_from_spiral = distance_from_spiral_middle - half_thickness spiral = 1.0 - greater_equal(distance_from_spiral,0.0) sigmasq = gaussian_width*gaussian_width with float_error_ignore(): falloff = exp(divide(-distance_from_spiral*distance_from_spiral, 2.0*sigmasq)) return maximum(falloff, spiral)
def __init__(self, crv, pnt=[0., 0., 0.], vector=[1., 0., 0.], theta=2. * math.pi): if not isinstance(crv, Crv.Crv): raise NURBSError, 'Parameter crv not derived from Crv class!' # Translate and rotate the curve into alignment with the z-axis T = translate(-numerix.asarray(pnt, numerix.Float)) # Normalize vector vector = numerix.asarray(vector, numerix.Float) len = numerix.sqrt(numerix.add.reduce(vector * vector)) if len == 0: raise ZeroDivisionError, "Can't normalize a zero-length vector" vector = vector / len if vector[0] == 0.: angx = 0. else: angx = math.atan2(vector[0], vector[2]) RY = roty(-angx) vectmp = numerix.ones((4, ), numerix.Float) vectmp[0:3] = vector vectmp = numerix.dot(RY, vectmp) if vectmp[1] == 0.: angy = 0. else: angy = math.atan2(vector[1], vector[2]) RX = rotx(angy) crv.trans(numerix.dot(RX, numerix.dot(RY, T))) arc = Crv.Arc(1., [0., 0., 0.], 0., theta) narc = arc.cntrl.shape[1] ncrv = crv.cntrl.shape[1] coefs = numerix.zeros((4, narc, ncrv), numerix.Float) angle = numerix.arctan2(crv.cntrl[1, :], crv.cntrl[0, :]) vectmp = crv.cntrl[0:2, :] radius = numerix.sqrt(numerix.add.reduce(vectmp * vectmp)) for i in xrange(0, ncrv): coefs[:, :, i] = numerix.dot( rotz(angle[i]), numerix.dot( translate((0., 0., crv.cntrl[2, i])), numerix.dot(scale((radius[i], radius[i])), arc.cntrl))) coefs[3, :, i] = coefs[3, :, i] * crv.cntrl[3, i] Srf.__init__(self, coefs, arc.uknots, crv.uknots) T = translate(pnt) RX = rotx(-angy) RY = roty(angx) self.trans(numerix.dot(T, numerix.dot(RY, RX)))
def radial(x, y, wide, gaussian_width): """ Radial grating - A sector of a circle with Gaussian fall-off. Parameter wide determines in wide of sector in radians. """ angle = absolute(arctan2(y,x)) half_wide = wide/2 radius = 1.0 - greater_equal(angle,half_wide) distance = angle - half_wide sigmasq = gaussian_width*gaussian_width with float_error_ignore(): falloff = exp(divide(-distance*distance, 2.0*sigmasq)) return maximum(radius,falloff)
def __init__(self, crv, pnt = [0., 0., 0.], vector = [1., 0., 0.], theta = 2.*math.pi): if not isinstance(crv, Crv.Crv): raise NURBSError, 'Parameter crv not derived from Crv class!' # Translate and rotate the curve into alignment with the z-axis T = translate(-numerix.asarray(pnt, numerix.Float)) # Normalize vector vector = numerix.asarray(vector, numerix.Float) len = numerix.sqrt(numerix.add.reduce(vector*vector)) if len == 0: raise ZeroDivisionError, "Can't normalize a zero-length vector" vector = vector/len if vector[0] == 0.: angx = 0. else: angx = math.atan2(vector[0], vector[2]) RY = roty(-angx) vectmp = numerix.ones((4,), numerix.Float) vectmp[0:3] = vector vectmp = numerix.dot(RY, vectmp) if vectmp[1] == 0.: angy = 0. else: angy = math.atan2(vector[1], vector[2]) RX = rotx(angy) crv.trans(numerix.dot(RX, numerix.dot(RY, T))) arc = Crv.Arc(1., [0., 0., 0.], 0., theta) narc = arc.cntrl.shape[1] ncrv = crv.cntrl.shape[1] coefs = numerix.zeros((4, narc, ncrv), numerix.Float) angle = numerix.arctan2(crv.cntrl[1,:], crv.cntrl[0,:]) vectmp = crv.cntrl[0:2,:] radius = numerix.sqrt(numerix.add.reduce(vectmp*vectmp)) for i in xrange(0, ncrv): coefs[:,:,i] = numerix.dot(rotz(angle[i]), numerix.dot(translate((0., 0., crv.cntrl[2,i])), numerix.dot(scale((radius[i], radius[i])), arc.cntrl))) coefs[3,:,i] = coefs[3,:,i] * crv.cntrl[3,i] Srf.__init__(self, coefs, arc.uknots, crv.uknots) T = translate(pnt) RX = rotx(-angy) RY = roty(angx) self.trans(numerix.dot(T, numerix.dot(RY, RX)))
def function(self,params): """Radial function.""" aspect_ratio = params['aspect_ratio'] x = self.pattern_x/aspect_ratio y = self.pattern_y gaussian_width = params['smoothing'] angle = absolute(arctan2(y,x)) half_length = params['arc_length']/2 radius = 1.0 - greater_equal(angle,half_length) distance = angle - half_length sigmasq = gaussian_width*gaussian_width with float_error_ignore(): falloff = exp(divide(-distance*distance, 2.0*sigmasq)) return maximum(radius, falloff)
def spiral(x, y, thickness, gaussian_width, density): """ Archemidean spiral with Gaussian fall-off outside the spiral curve. """ half_thickness = thickness/2.0 spacing = density*2*pi distance_from_origin = sqrt(x**2+y**2) distance_from_spiral_middle = fmod(spacing + distance_from_origin - density*arctan2(y,x),spacing) distance_from_spiral_middle = minimum(distance_from_spiral_middle,spacing - distance_from_spiral_middle) distance_from_spiral = distance_from_spiral_middle - half_thickness spiral = 1.0 - greater_equal(distance_from_spiral,0.0) sigmasq = gaussian_width*gaussian_width with float_error_ignore(): falloff = exp(divide(-distance_from_spiral*distance_from_spiral, 2.0*sigmasq)) return maximum(falloff,spiral)