import numpy as np
def scale(points, scale_factor=(1, 1, 1)):
transformation_matrix = np.eye(3)
np.fill_diagonal(transformation_matrix, scale_factor)
points[:, :3] = np.dot(points[:, :3], transformation_matrix)
return points
[docs]def rotate_around_axis(points, axis, angle, center_point=None):
"""
Return the rotation matrix associated with counterclockwise rotation about
the given axis by angle in radians.
https://stackoverflow.com/questions/6802577/rotation-of-3d-vector
"""
if center_point is None:
center_point = points[:, :3].mean(axis=0).astype(points[:, :3].dtype)
axis = axis / np.sqrt(np.dot(axis, axis))
a = np.cos(angle / 2.0)
b, c, d = -axis * np.sin(angle / 2.0)
aa, bb, cc, dd = a * a, b * b, c * c, d * d
bc, ad, ac, ab, bd, cd = b * c, a * d, a * c, a * b, b * d, c * d
rotation_matrix = np.array(
[
[aa + bb - cc - dd, 2 * (bc + ad), 2 * (bd - ac)],
[2 * (bc - ad), aa + cc - bb - dd, 2 * (cd + ab)],
[2 * (bd + ac), 2 * (cd - ab), aa + dd - bb - cc],
]
)
points[:, :3] = points[:, :3] - center_point
points[:, :3] = np.dot(points[:, :3], rotation_matrix.T)
points[:, :3] = points[:, :3] + center_point
return points
def crop(points, x_min, y_min, z_min, x_max, y_max, z_max):
if x_max <= x_min or y_max <= y_min or z_max <= z_min:
raise ValueError(
"We should have x_min < x_max and y_min < y_max and z_min < z_max. But we got"
" (x_min = {x_min}, y_min = {y_min}, z_min = {z_min},"
" x_max = {x_max}, y_max = {y_max}, z_max = {z_max})".format(
x_min=x_min,
x_max=x_max,
y_min=y_min,
y_max=y_max,
z_min=z_min,
z_max=z_max,
)
)
inds = np.all(
[
(points[:, 0] >= x_min),
(points[:, 0] < x_max),
(points[:, 1] >= y_min),
(points[:, 1] < y_max),
(points[:, 2] >= z_min),
(points[:, 2] < z_max),
],
axis=0,
)
return inds
def center(points, origin=(0, 0, 0)):
points[:, :3] -= origin + points[:, :3].mean(axis=0)
return points
def move(points, offset=(0, 0, 0)):
points[:, :3] = points[:, :3] + offset
return points
def flip_coordinates(points, axis):
axis = np.argmax(axis)
coord_max = np.max(points[:, axis])
points[:, axis] = coord_max - points[:, axis]
return points