Transforms

Affine-matrix reorient/apply and polar_to_xy (BOSL2 transforms.scad, coords.scad).

pybosl2.transforms.polar_to_xy(radius, angle)[source]

Convert polar coordinates (radius, angle in degrees) to a 2-D [x, y] point.

Parameters:
radius : float

Radius to scale by.

angle : float

Rotation angle in degrees.

Return type:

list[float]

pybosl2.transforms.rot_from_to(a, b)[source]

(angle_degrees, axis) rotating direction a onto direction b.

Matches BOSL2’s rot(from=, to=) axis choice, including the antiparallel case (180 degrees about a perpendicular axis).

Parameters:
a : Sequence[float] | ndarray

The first vector, or the angle in degrees.

b : Sequence[float] | ndarray

The second vector.

Return type:

tuple[float, ndarray]

pybosl2.transforms.axis_angle_matrix(angle, axis)[source]

3x3 rotation matrix for angle degrees about axis (Rodrigues’ rotation formula).

Parameters:
angle : float

Rotation angle in degrees.

axis : Sequence[float] | ndarray

Axis to rotate about.

Return type:

ndarray

pybosl2.transforms.rot_about_axis(angle, axis, center=(0.0, 0.0, 0.0))[source]

4x4 matrix rotating angle degrees about the line through center in direction axis.

The 4x4 form of BOSL2’s rot(a=, v=, center=): translate center to the origin, rotate, translate back.

Parameters:
angle : float

Rotation angle in degrees.

axis : Sequence[float] | ndarray

Axis to rotate about.

center : tuple[float, float, float]

Point to rotate or scale about.

Return type:

ndarray

pybosl2.transforms.rot_inverse(t)[source]

Inverse of a rigid 4x4 transform: transpose the rotation,.

un-translate.

Parameters:
t : ndarray

Interpolation parameter from 0 to 1.

Return type:

ndarray

pybosl2.transforms.rot_decode(m, long=False)[source]

Decode a rigid 4x4 transform into its screw motion.

Returns [angle_degrees, axis, center, translation_along_axis] – rotating by angle about the line through center in direction axis then translating along the axis reproduces m. axis, center and the axial translation are returned as Vector. With long, the complementary (>180 degree) rotation about the reversed axis is chosen.

Parameters:
m : ndarray

The 4x4 matrix.

long : bool

Take the long way round the rotation rather than the short one.

Return type:

list[Any]

pybosl2.transforms.reorient(anchor=None, spin=0, orient=None, size=None)[source]

Return the 4x4 matrix that reorients a cuboid of size onto anchor/spin/orient.

The Python equivalent of BOSL2’s reorient(anchor, spin, orient, size), for feeding PythonSCAD’s .multmatrix(). Composed as R(UP -> orient) * Zrot(spin) * Translate(-anchor * size / 2); verified to match BOSL2’s own output exactly across every anchor/orient/spin/size combination the toolkit uses (see tests/test_bosl2_reorient.py).

Returns plain nested lists, not an ndarray: the result feeds straight into the native multmatrix(), which rejects numpy arrays (“Error during parsing multmatrix(object, vec16)”).

Usage:

tmat = reorient(anchor=CENTER, spin=90, orient=LEFT, size=[10, 20, 30])
shape.multmatrix(tmat)
Parameters:
anchor : Anchor | Sequence[float] | ndarray | None

BOSL2 anchor vector (default CENTER)

spin : float

rotation about Z in degrees, applied after the anchor move (default 0)

orient : Anchor | Sequence[float] | ndarray | None

direction the shape’s UP is rotated onto (default UP)

size : Sequence[float] | ndarray | None

[x, y, z] size the anchor is resolved against (default [0, 0, 0])

Return type:

list[list[float]]

pybosl2.transforms.apply(transform, points)[source]

Apply a 4x4 (or 3x3, 2-D) transform matrix to every point in points.

The Python equivalent of BOSL2’s apply(). Returns plain nested lists so the result can cross the native FFI boundary.

Usage:

apply(reorient(anchor=CENTER, orient=LEFT, size=[1, 1, 1]), [[5, 0, 0], [-5, 0, 0]])
Parameters:
transform : Sequence[Sequence[float]] | np.ndarray

The 4x4 matrix to apply.

points : PathLike

The points to transform.

Return type:

list[list[float]]