Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def inverse_transform_points(self, points):
"""Apply the inverse transformation to points (not in-place)."""
if self.is_identity:
return points
return tr.transform_points(
points.reshape(-1, 3),
self.inverse_matrix).reshape(points.shape)
transform = np.asanyarray(transform, dtype=np.float64)
if transform.shape != (dimension + 1, dimension + 1):
raise ValueError('transform is incorrect shape!')
elif np.abs(transform - np.eye(dimension + 1)).max() < 1e-8:
# if we've been passed an identity matrix do nothing
return
# make sure cache is up to date
self._cache.verify()
# new cache to transfer items
cache = {}
# apply transform to discretized paths
if 'discrete' in self._cache.cache:
cache['discrete'] = np.array([
transformations.transform_points(
d, matrix=transform)
for d in self.discrete])
# things we can just straight up copy
# as they are topological not geometric
for key in ['root',
'paths',
'path_valid',
'dangling',
'vertex_graph',
'enclosure',
'enclosure_shell',
'enclosure_directed']:
# if they're in cache save them from the purge
if key in self._cache.cache:
cache[key] = self._cache.cache[key]
The cost of the transformation
"""
a = np.asanyarray(a, dtype=np.float64)
if not util.is_shape(a, (-1, 3)):
raise ValueError('points must be (n,3)!')
is_mesh = util.is_instance_named(b, 'Trimesh')
if not is_mesh:
b = np.asanyarray(b, dtype=np.float64)
if not util.is_shape(b, (-1, 3)):
raise ValueError('points must be (n,3)!')
btree = cKDTree(b)
# transform a under initial_transformation
a = transform_points(a, initial)
total_matrix = initial
# start with infinite cost
old_cost = np.inf
# avoid looping forever by capping iterations
for n_iteration in range(max_iterations):
# Closest point in b to each point in a
if is_mesh:
closest, distance, faces = b.nearest.on_surface(a)
else:
distances, ix = btree.query(a, 1)
closest = b[ix]
# align a with closest points
matrix, transformed, cost = procrustes(a=a,
corners_geom = {k: bounds_module.corners(v.bounds)
for k, v in self.geometry.items()
if v.bounds is not None}
if len(corners_geom) == 0:
return np.array([])
for node_name in self.graph.nodes_geometry:
# access the transform and geometry name from node
transform, geometry_name = self.graph[node_name]
# not all nodes have associated geometry
if geometry_name not in corners_geom:
continue
# transform geometry corners into where
# the instance of the geometry is located
corners_inst.extend(
transformations.transform_points(
corners_geom[geometry_name],
transform))
# make corners numpy array
corners_inst = np.array(corners_inst,
dtype=np.float64)
return corners_inst
height = projected[:, 2].ptp()
rotation_2D, box = oriented_bounds_2D(projected[:, :2])
volume = np.product(box) * height
if volume < min_volume:
min_volume = volume
min_extents = np.append(box, height)
min_2D = to_2D.copy()
rotation_2D[:2, 2] = 0.0
rotation_Z = transformations.planar_matrix_to_3D(rotation_2D)
# combine the 2D OBB transformation with the 2D projection transform
to_origin = np.dot(rotation_Z, min_2D)
# transform points using our matrix to find the translation for the
# transform
transformed = transformations.transform_points(vertices,
to_origin)
box_center = (transformed.min(axis=0) + transformed.ptp(axis=0) * .5)
to_origin[:3, 3] = -box_center
# return ordered 3D extents
if ordered:
# sort the three extents
order = min_extents.argsort()
# generate a matrix which will flip transform
# to match the new ordering
flip = np.eye(4)
flip[:3, :3] = -np.eye(3)[order]
# make sure transform isn't mangling triangles
# by reversing windings on triangles
if np.isclose(np.trace(flip[:3, :3]), 0.0):
verts_2d = np.array(polygon.exterior)[:-1]
base_verts_2d, faces_2d = triangulate_polygon(polygon, **kwargs)
n = len(verts_2d)
# Create basis for first planar polygon cap
x, y, z = util.generate_basis(path[0] - path[1])
tf_mat = np.ones((4, 4))
tf_mat[:3, :3] = np.c_[x, y, z]
tf_mat[:3, 3] = path[0]
# Compute 3D locations of those vertices
verts_3d = np.c_[verts_2d, np.zeros(n)]
verts_3d = tf.transform_points(verts_3d, tf_mat)
base_verts_3d = np.c_[base_verts_2d,
np.zeros(len(base_verts_2d))]
base_verts_3d = tf.transform_points(base_verts_3d,
tf_mat)
# keep matching sequence of vertices and 0- indexed faces
vertices = [base_verts_3d]
faces = [faces_2d]
# Compute plane normals for each turn --
# each turn induces a plane halfway between the two vectors
v1s = util.unitize(path[1:-1] - path[:-2])
v2s = util.unitize(path[1:-1] - path[2:])
norms = np.cross(np.cross(v1s, v2s), v1s + v2s)
norms[(norms == 0.0).all(1)] = v1s[(norms == 0.0).all(1)]
norms = util.unitize(norms)
final_v1 = util.unitize(path[-1] - path[-2])
norms = np.vstack((norms, final_v1))
v1s = np.vstack((v1s, final_v1))
vertices_3D = util.stack_3D(vertices)
# a sequence of zero- indexed faces, which will then be appended
# with offsets to create the final mesh
faces_seq = [faces[:, ::-1],
faces.copy(),
vertical_faces]
vertices_seq = [vertices_3D,
vertices_3D.copy() + [0.0, 0, height],
vertical]
# append sequences into flat nicely indexed arrays
vertices, faces = util.append_faces(vertices_seq, faces_seq)
if transform is not None:
# apply transform here to avoid later bookkeeping
vertices = tf.transform_points(
vertices, transform)
# if the transform flips the winding flip faces back
# so that the normals will be facing outwards
if tf.flips_winding(transform):
# fliplr makes arrays non-contiguous
faces = np.ascontiguousarray(np.fliplr(faces))
# create mesh object with passed keywords
mesh = Trimesh(vertices=vertices,
faces=faces,
**kwargs)
# only check in strict mode (unit tests)
if tol.strict:
assert mesh.volume > 0.0
return mesh
--------------
result : shapely.geometry.Polygon
Polygon transformed by matrix.
"""
matrix = np.asanyarray(matrix, dtype=np.float64)
if util.is_sequence(polygon):
result = [transform_polygon(p, t)
for p, t in zip(polygon, matrix)]
return result
# transform the outer shell
shell = transform_points(np.array(polygon.exterior.coords),
matrix)[:, :2]
# transform the interiors
holes = [transform_points(np.array(i.coords),
matrix)[:, :2]
for i in polygon.interiors]
# create a new polygon with the result
result = Polygon(shell=shell, holes=holes)
return result