def test_axis_and_angle_from_matrix(): axis1 = normalize_vector([-0.043, -0.254, 0.617]) angle1 = 0.1 R = matrix_from_axis_and_angle(axis1, angle1) axis2, angle2 = axis_and_angle_from_matrix(R) assert allclose(axis1, axis2) assert allclose([angle1], [angle2])
def test_matrix_from_axis_angle_vector(): axis1 = normalize_vector([-0.043, -0.254, 0.617]) angle1 = 0.1 R = matrix_from_axis_and_angle(axis1, angle1) r = [[0.9950248278789664, -0.09200371122722178, -0.03822183963195913, 0.0], [0.09224781823368366, 0.9957251324831573, 0.004669108322156158, 0.0], [ 0.037628871037522216, -0.008171760019527692, 0.9992583701939277, 0.0 ], [0.0, 0.0, 0.0, 1.0]] assert allclose(R, r)
def get_distance_numpy(self, x, y, z): """ vectorized distance function """ from compas.geometry import matrix_inverse import numpy as np # plane = Plane(self.frame.point, self.frame.normal) # vp = VolPlane(plane) # dm = vp.get_distance_numpy(x, y, z) m = matrix_from_axis_and_angle(self.frame.normal, 10, self.frame.point) mi = matrix_inverse(m) p = np.array([x, y, z, 1]) xt, yt, zt, _ = np.dot(mi, p) return self.obj.get_distance_numpy(xt, yt, zt)
""" vector = self.copy() vector.transform(matrix) return vector # ============================================================================== # Main # ============================================================================== if __name__ == '__main__': from compas.geometry import matrix_from_axis_and_angle u = Vector(0.0, 0.0, 1.0) v = Vector(1.0, 0.0, 0.0) print(u.angle(v)) print(3.14159 / 2) w = Vector.from_start_end(u, v) print(w) M = matrix_from_axis_and_angle(v, pi / 4) u.transform(M) print(u)
Polyline The transformed copy. """ polyline = self.copy() polyline.transform(matrix) return polyline # ============================================================================== # Main # ============================================================================== if __name__ == '__main__': from math import pi from compas.geometry import matrix_from_axis_and_angle from compas_plotters import Plotter M = matrix_from_axis_and_angle([0, 0, 1.0], pi / 2) p = Polyline([[0, 0, 0], [1, 0, 0], [2, 0, 0], [3, 0, 0]]) q = p.transformed(M) #plotter = Plotter(figsize=(10, 7)) #plotter.draw_polygons([{'points': p.points}, {'points': q.points}]) #plotter.show() print(p.point(.7, snap=True))
from compas.geometry import matrix_from_axis_and_angle from compas.geometry import transform_points_numpy from compas_plotters import Axes3D from compas_plotters import Cloud3D from compas_plotters import Bounds from compas_plotters import create_axes_3d data = random.rand(300, 3) data[:, 0] *= 10.0 data[:, 1] *= 1.0 data[:, 2] *= 4.0 a = 3.14159 * 30.0 / 180 Ry = matrix_from_axis_and_angle([0, 1.0, 0.0], a, rtype='array') a = -3.14159 * 45.0 / 180 Rz = matrix_from_axis_and_angle([0, 0, 1.0], a, rtype='array') R = Rz.dot(Ry) data = transform_points_numpy(data, R) average, vectors, values = pca_numpy(data) axes = create_axes_3d() Bounds(data).plot(axes) Cloud3D(data).plot(axes) Axes3D(average, vectors).plot(axes)
cloud[:, 1] *= -3.0 cloud[:, 1] -= 3.0 d[1] = -1 else: cloud[:, 1] *= 3.0 cloud[:, 1] += 3.0 if i in (4, 5, 6, 7): cloud[:, 2] *= -6.0 cloud[:, 2] -= 3.0 d[2] = -1 else: cloud[:, 2] *= 6.0 cloud[:, 2] += 3.0 R = matrix_from_axis_and_angle(d, a) cloud[:] = transform(cloud, R) clouds.append(cloud.tolist()) axes = create_axes_3d() bounds = Bounds([point for points in clouds for point in points]) bounds.plot(axes) for cloud in clouds: bbox = oriented_bounding_box_numpy(cloud) Cloud3D(cloud).plot(axes) Box(bbox[1]).plot(axes)