Source code for eradiate.kernel.transform

"""
Geometric transforms.
"""

from __future__ import annotations

import mitsuba as mi
import numpy as np


[docs] def map_unit_cube( xmin: float, xmax: float, ymin: float, ymax: float, zmin: float, zmax: float ) -> mi.ScalarTransform4f: r""" Map the unit cube :math:`[0, 1]^3` to :math:`[x_\mathrm{min}, x_\mathrm{max}] \times [y_\mathrm{min}, y_\mathrm{max}] \times [z_\mathrm{min}, z_\mathrm{max}]`. Parameters ---------- xmin : float Minimum X value. xmax : float Maximum X value. ymin : float Minimum Y value. ymax : float Maximum Y value. zmin : float Minimum Z value. zmax : float Maximum Z value. Returns ------- :class:`mitsuba.core.ScalarTransform4f` Computed transform matrix. Warnings -------- You must select a Mitsuba variant before calling this function. """ return mi.ScalarTransform4f.translate( [xmin, ymin, zmin] ) @ mi.ScalarTransform4f.scale([xmax - xmin, ymax - ymin, zmax - zmin])
[docs] def map_cube( xmin: float, xmax: float, ymin: float, ymax: float, zmin: float, zmax: float ) -> mi.ScalarTransform4f: r""" Map the cube :math:`[-1, 1]^3` to :math:`[x_\mathrm{min}, x_\mathrm{max}] \times [y_\mathrm{min}, y_\mathrm{max}] \times [z_\mathrm{min}, z_\mathrm{max}]`. Parameters ---------- xmin : float Minimum X value. xmax : float Maximum X value. ymin : float Minimum Y value. ymax : float Maximum Y value. zmin : float Minimum Z value. zmax : float Maximum Z value. Returns ------- :class:`mitsuba.core.ScalarTransform4f` Computed transform matrix. Warnings -------- You must select a Mitsuba variant before calling this function. """ half_edge_x = 0.5 * (xmax - xmin) half_edge_y = 0.5 * (ymax - ymin) half_edge_z = 0.5 * (zmax - zmin) return mi.ScalarTransform4f.translate( [half_edge_x + xmin, half_edge_y + ymin, half_edge_z + zmin] ) @ mi.ScalarTransform4f.scale([half_edge_x, half_edge_y, half_edge_z])
def transform_affine(t, x): """ Apply a mitsuba transformation to a list of points. Parameters ---------- t : mi.ScalarTransform4f A transformation, to be applied to the list of points. x : array-like A list of points in (n, 3)-shape, to be transformed. Returns ------- ndarray List in (n, 3)-shape of transformed points. """ t = np.array(t.matrix) r = np.dot(t, (np.vstack((x.T, np.ones(x.shape[0]))))) r /= r[3, :] r = r[:3, ...].T return r