Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def read_basis(self):
ncps, order = map(int, next(self.fstream).split())
kts = list(map(float, next(self.fstream).split()))
return BSplineBasis(order, kts, -1)
a = 1.0/2/sqrt(2)
b = 1.0/6 * (4*sqrt(2)-1)
controlpoints = [[ 1,-a, 1],
[ 1, a, 1],
[ b, b, w],
[ a, 1, 1],
[-a, 1, 1],
[-b, b, w],
[-1, a, 1],
[-1,-a, 1],
[-b,-b, w],
[-a,-1, 1],
[ a,-1, 1],
[ b,-b, w]]
knot = np.array([ -1, -1, 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5]) / 4.0 * 2 * pi
result = Curve(BSplineBasis(5, knot, 1), controlpoints, True)
else:
raise ValueError('Unkown type: %s' %(type))
result *= r
result.rotate(rotate_local_x_axis(xaxis, normal))
return flip_and_move_plane_geometry(result, center, normal)
:param (int) p: Tuple of polynomial discretization order in each direction
:param (int) n: Tuple of number of control points in each direction
:return: A new approximate surface
:rtype: Surface
"""
p = ensure_listlike(p, dups=2)
n = ensure_listlike(n, dups=2)
old_basis = self.bases
basis = []
u = []
N = []
# establish uniform open knot vectors
for i in range(2):
knot = [0] * p[i] + list(range(1, n[i] - p[i] + 1)) + [n[i] - p[i] + 1] * p[i]
basis.append(BSplineBasis(p[i], knot))
# make these span the same parametric domain as the old ones
basis[i].normalize()
t0 = old_basis[i].start()
t1 = old_basis[i].end()
basis[i] *= (t1 - t0)
basis[i] += t0
# fetch evaluation points and evaluate basis functions
u.append(basis[i].greville())
N.append(basis[i].evaluate(u[i]))
# find interpolation points as evaluation of existing surface
x = self.evaluate(u[0], u[1])
# solve interpolation problem
def get_cm1_mesh(self):
# Create the C^{-1} mesh
nx, ny, nz = self.n
Xm1 = self.raw.get_discontinuous_all()
b1 = BSplineBasis(2, sorted(list(range(self.n[0]+1))*2))
b2 = BSplineBasis(2, sorted(list(range(self.n[1]+1))*2))
b3 = BSplineBasis(2, sorted(list(range(self.n[2]+1))*2))
discont_vol = Volume(b1, b2, b3, Xm1)
return discont_vol
knot += [knot[0], knot[-1]]
knot.sort()
for cp in np_pts:
startpoint = controlpoints[-1]
controlpoints.append(np.array([0, cp]) + startpoint)
curve_piece = Curve(BSplineBasis(2, knot), controlpoints)
elif piece[0] == 'V':
# vertical piece, absolute position
np_pts = np.array(points).astype('float')
controlpoints = [startpoint]
knot = list(range(len(np_pts)+1))
knot += [knot[0], knot[-1]]
knot.sort()
for cp in np_pts:
controlpoints.append([startpoint[0], cp])
curve_piece = Curve(BSplineBasis(2, knot), controlpoints)
elif piece[0] == 'A' or piece[0] == 'a':
np_pts = np.reshape(np.array(points).astype('float'), (int(len(points))))
rx = float(points[0])
ry = float(points[1])
x_axis_rotation = float(points[2])
large_arc_flag = (points[3] != '0')
sweep_flag = (points[4] != '0')
xend = np.array([float(points[5]), float(points[6]) ])
if piece[0] == 'a':
xend += startpoint
R = np.array([[ np.cos(x_axis_rotation), np.sin(x_axis_rotation)],
[-np.sin(x_axis_rotation), np.cos(x_axis_rotation)]])
xp = np.linalg.solve(R, (startpoint - xend)/2)
if sweep_flag == large_arc_flag:
cprime = -(np.sqrt(abs(rx**2*ry**2 - rx**2*xp[1]**2 - ry**2*xp[0]**2) /
# figure out how many new knots we require in this knot interval:
# if we converge with *scale* and want an error of *target_error*
# |e|^2 * (1/n)^scale = target_error^2
conv_order = 4 # cubic interpolateion is order=4
square_conv_order = 2*conv_order # we are computing with square of error
scale = square_conv_order + 4 # don't want to converge too quickly in case of highly non-uniform mesh refinement is required
n = int(np.ceil(np.exp((np.log(err2[i]) - np.log(target_error))/scale)))
# add *n* new interior knots to this knot span
new_knots = np.linspace(knot_span[i], knot_span[i+1], n+1)
knot_vector = knot_vector + list(new_knots[1:-1])
# build new refined knot vector
knot_vector.sort()
b = BSplineBasis(4, knot_vector)
# do interpolation and return result
t = np.array(b.greville())
crv = interpolate(x(t), b, t)
(err2, maxerr) = crv.error(x)
length = crv.length()
return crv
controlpoints.append(2*x0 -xn1)
for i,cp in enumerate(np_pts):
if i % 2 == 0 and i>0:
controlpoints.append(2*controlpoints[-1] - controlpoints[-2])
controlpoints.append(cp)
curve_piece = Curve(BSplineBasis(4, knot), controlpoints)
elif piece[0] == 'q':
# quadratic spline, relatively positioned
controlpoints = [startpoint]
knot = list(range(int(len(np_pts)/2)+1)) * 2
knot += [knot[0], knot[-1]]
knot.sort()
for cp in np_pts:
startpoint = controlpoints[int((len(controlpoints)-1)/2)*2]
controlpoints.append(cp + startpoint)
curve_piece = Curve(BSplineBasis(3, knot), controlpoints)
elif piece[0] == 'Q':
# quadratic spline, absolute position
controlpoints = [startpoint]
knot = list(range(len(np_pts)/2+1)) * 2
knot += [knot[0], knot[-1]]
knot.sort()
for cp in np_pts:
controlpoints.append(cp)
curve_piece = Curve(BSplineBasis(3, knot), controlpoints)
elif piece[0] == 'l':
# linear spline, relatively positioned
controlpoints = [startpoint]
knot = list(range(len(np_pts)+1))
knot += [knot[0], knot[-1]]
knot.sort()
for cp in np_pts:
""" Create a solid sphere
:param float r: Radius
:param array-like center: Local origin of the sphere
:param string type: The type of parametrization ('radial' or 'square')
:return: A solid ball
:rtype: Volume
"""
if type == 'radial':
shell = SurfaceFactory.sphere(r, center)
midpoint = shell*0 + center
return edge_surfaces(shell, midpoint)
elif type == 'square':
# based on the work of James E.Cobb: "Tiling the Sphere with Rational Bezier Patches"
# University of Utah, July 11, 1988. UUCS-88-009
b = BSplineBasis(order=5)
sr2 = sqrt(2)
sr3 = sqrt(3)
sr6 = sqrt(6)
cp = [[ -4*(sr3-1), 4*(1-sr3), 4*(1-sr3), 4*(3-sr3) ], # row 0
[ -sr2 , sr2*(sr3-4), sr2*(sr3-4), sr2*(3*sr3-2)],
[ 0 , 4./3*(1-2*sr3), 4./3*(1-2*sr3),4./3*(5-sr3) ],
[ sr2 , sr2*(sr3-4), sr2*(sr3-4), sr2*(3*sr3-2)],
[ 4*(sr3-1), 4*(1-sr3), 4*(1-sr3), 4*(3-sr3) ],
[ -sr2*(4-sr3), -sr2, sr2*(sr3-4), sr2*(3*sr3-2)], # row 1
[ -(3*sr3-2)/2, (2-3*sr3)/2, -(sr3+6)/2, (sr3+6)/2],
[ 0 , sr2*(2*sr3-7)/3, -5*sr6/3, sr2*(sr3+6)/3],
[ (3*sr3-2)/2, (2-3*sr3)/2, -(sr3+6)/2, (sr3+6)/2],
[ sr2*(4-sr3), -sr2, sr2*(sr3-4), sr2*(3*sr3-2)],
[ -4./3*(2*sr3-1), 0, 4./3*(1-2*sr3), 4*(5-sr3)/3], # row 2
[-sr2/3*(7-2*sr3), 0, -5*sr6/3, sr2*(sr3+6)/3],
[ 0 , 0, 4*(sr3-5)/3, 4*(5*sr3-1)/9],
:rtype: Surface
:raises ValueError: If the length of *curves* is not two or four
"""
type = kwargs.get('type', 'coons')
if len(curves) == 1: # probably gives input as a list-like single variable
curves = curves[0]
if len(curves) == 2:
crv1 = curves[0].clone()
crv2 = curves[1].clone()
Curve.make_splines_identical(crv1, crv2)
(n, d) = crv1.controlpoints.shape # d = dimension + rational
controlpoints = np.zeros((2 * n, d))
controlpoints[:n, :] = crv1.controlpoints
controlpoints[n:, :] = crv2.controlpoints
linear = BSplineBasis(2)
return Surface(crv1.bases[0], linear, controlpoints, crv1.rational)
elif len(curves) == 4:
# reorganize input curves so they form a directed loop around surface
rtol = state.controlpoint_relative_tolerance
atol = state.controlpoint_absolute_tolerance
mycurves = [c.clone() for c in curves] # wrap into list and clone all since we're changing them
dim = np.max([c.dimension for c in mycurves])
rat = np.any([c.rational for c in mycurves])
for i in range(4):
for j in range(i+1,4):
Curve.make_splines_compatible(mycurves[i], mycurves[j])
if not (np.allclose(mycurves[0][-1], mycurves[1][0], rtol=rtol, atol=atol) and
np.allclose(mycurves[1][-1], mycurves[2][0], rtol=rtol, atol=atol) and
np.allclose(mycurves[2][-1], mycurves[3][0], rtol=rtol, atol=atol) and