Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
import splipy.surface_factory as surfaces
### create a parametric 3D-function
def trefoil(t):
t = np.array(t)
return np.array([sin(t) + 2*sin(2*t), cos(t) - 2*cos(2*t), -sin(3*t)]).T
### do an adaptive best cubic spline-fit of this function
path = curves.fit(trefoil, 0, 2*pi)
### since we know it is a closed curve, enforce this on the path
path = path.make_periodic(0,0)
### create a sweeping curve (either a circle or square)
shape = curves.circle(r=0.2)
# shape = 16*curves.n_gon(4)
### sweep *shape along *path
srf = surfaces.sweep(path, shape)
### write results to file. Use meshlab (www.meshlab.net) to view stl-files
with STL('trefoil.stl') as f:
f.write(srf, n=(150,30))
def circle(self):
dim = int( self.read_next_non_whitespace().strip())
r = float( next(self.fstream).strip())
center= np.array(next(self.fstream).split(), dtype=float)
normal= np.array(next(self.fstream).split(), dtype=float)
xaxis = np.array(next(self.fstream).split(), dtype=float)
param = np.array(next(self.fstream).split(), dtype=float)
reverse = next(self.fstream).strip() != '0'
result = CurveFactory.circle(r=r, center=center, normal=normal, xaxis=xaxis)
result.reparam(param)
if reverse:
result.reverse()
return result
def disc(r=1, center=(0,0,0), normal=(0,0,1), type='radial', xaxis=(1,0,0)):
""" Create a circular disc. The *type* parameter distinguishes between
different parametrizations.
:param float r: Radius
:param array-like center: local origin
:param array-like normal: local normal
:param string type: The type of parametrization ('radial' or 'square')
:param array-like xaxis: direction of sem, i.e. parametric start point v=0
:return: The disc
:rtype: Surface
"""
if type == 'radial':
c1 = CurveFactory.circle(r, center=center, normal=normal, xaxis=xaxis)
c2 = flip_and_move_plane_geometry(c1*0, center, normal)
result = edge_curves(c2, c1)
result.swap()
result.reparam((0,r), (0,2*pi))
return result
elif type == 'square':
w = 1 / sqrt(2)
cp = [[-r * w, -r * w, 1],
[0, -r, w],
[r * w, -r * w, 1],
[-r, 0, w],
[0, 0, 1],
[r, 0, w],
[-r * w, r * w, 1],
[0, r, w],
[r * w, r * w, 1]]
def cylinder(r=1, h=1, center=(0,0,0), axis=(0,0,1), xaxis=(1,0,0)):
""" Create a cylinder shell with no top or bottom
:param float r: Radius
:param float h: Height
:param array-like center: The center of the bottom circle
:param array-like axis: Cylinder axis
:param array-like xaxis: direction of sem, i.e. parametric start point u=0
:return: The cylinder shell
:rtype: Surface
"""
return extrude(CurveFactory.circle(r, center, axis, xaxis=xaxis), h*np.array(axis))
# parametrization, and the acceleration vector is shown to be discontinuous.
#
# Author: Kjetil Andre Johannessen
# Institute: Norwegian University of Science and Technology (NTNU)
# Date: March 2016
#
from sys import path
path.append('../')
from splipy import *
import splipy.curve_factory as curves
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
n = 250 # number of evaluation points
c = curves.circle() # create the NURBS circle
t = np.linspace(c.start(0), c.end(0), n) # parametric evaluation points
x = c(t) # physical (x,y)-coordinates, size (n,2)
v = c.derivative(t, 1) # velocity at all points
a = c.derivative(t, 2) # acceleration at all points
# plot the circle and get reference to the acceleration/velocity lines which we
# will update during animation
fig = plt.figure()
plt.plot(x[:,0], x[:,1], 'k-')
velocity, = plt.plot([x[0,0], x[0,0]+v[0,0]], [x[0,1], x[0,1]+v[0,1]], 'r-', linewidth=2)
acceleration, = plt.plot([x[0,0], x[0,0]+a[0,0]], [x[0,1], x[0,1]+a[0,1]], 'b-', linewidth=3)
plt.axis('equal')
plt.legend(('NURBS Circle', 'Velocity', 'Acceleration'))
# update the velocity/acceleration lines for frame *i* in the animation
def animate(i):
def torus(minor_r=1, major_r=3, center=(0,0,0), normal=(0,0,1), xaxis=(1,0,0)):
""" Create a torus (doughnut) by revolving a circle of size *minor_r*
around the *z* axis with radius *major_r*.
:param float minor_r: The thickness of the torus (radius in the *xz* plane)
:param float major_r: The size of the torus (radius in the *xy* plane)
:param array-like center: Local origin of the torus
:param array-like normal: Local origin of the torus
:param array-like center: Local origin of the torus
:return: A periodic torus
:rtype: Surface
"""
circle = CurveFactory.circle(minor_r)
circle.rotate(pi / 2, (1, 0, 0)) # flip up into xz-plane
circle.translate((major_r, 0, 0)) # move into position to spin around z-axis
result = revolve(circle)
result.rotate(rotate_local_x_axis(xaxis, normal))
return flip_and_move_plane_geometry(result, center, normal)
right_points[i, 0] = x[i, 0] - v[i, 1] * dist # x at bottom
right_points[i, 1] = x[i, 1] + v[i, 0] * dist # y at bottom
left_points[ i, 0] = x[i, 0] + v[i, 1] * dist # x at top
left_points[ i, 1] = x[i, 1] - v[i, 0] * dist # y at top
else:
right_points[:, 0] = x[:, 0] - v[:, 1] * amount # x at bottom
right_points[:, 1] = x[:, 1] + v[:, 0] * amount # y at bottom
left_points[ :, 0] = x[:, 0] + v[:, 1] * amount # x at top
left_points[ :, 1] = x[:, 1] - v[:, 0] * amount # y at top
# perform interpolation on each side
right = CurveFactory.interpolate(right_points, curve.bases[0])
left = CurveFactory.interpolate(left_points, curve.bases[0])
return edge_curves(right, left)
else: # dimension=3, we will create a surrounding tube
return sweep(curve, CurveFactory.circle(r=amount))