mach.geometry#
Geometry utilities for coordinate system conversions.
This module provides functions for converting between different coordinate systems commonly used in ultrasound imaging:
ultrasound_angles_to_cartesian - Convert ultrasound angles (azimuth, elevation) to Cartesian coordinates
spherical_to_cartesian - Convert physics spherical coordinates to Cartesian coordinates
We define the “ultrasound convention” as: 1. Rotate azimuth (counter-clockwise) around fixed y-axis 2. Then rotate elevation (clockwise) around fixed x-axis
This convention is more intuitive for elevation multi-slice imaging where you first create a scan in azimuth, then rotate that plane in elevation.
For discussion on ultrasound toolbox conventions, see: magnusdk/vbeam#50
For convenience, we also provide spherical angle conversions following the physics convention as defined in ISO 80000-2:2019.
Functions
|
Convert standard spherical angle convention to a Cartesian vector. |
|
Convert ultrasound angles (azimuth, elevation, radius) to Cartesian coordinates. |
- mach.geometry.spherical_to_cartesian(
- theta_rad: Real[Array, '*angles'] | float | int,
- phi_rad: Real[Array, '*angles'] | float | int,
- radius_m: Real[Array, '*angles'] | float | int = 1,
Convert standard spherical angle convention to a Cartesian vector.
Uses the physics convention as defined in ISO 80000-2:2019. https://en.wikipedia.org/wiki/Spherical_coordinate_system
- Parameters:
theta_rad – Polar angle in radians - angle between the radial line and a polar axis.
phi_rad – Azimuthal angle in radians - angle of rotation of the radial line around the polar axis.
radius_m – Radial distance from the origin in meters (defaults to 1 for unit vectors).
- Returns:
Wave-direction vectors in xyz-order, with norm=radius_m. For scalar inputs: returns tuple[float, float, float]. For array inputs: returns array with shape (*angles, 3).
- Raises:
ValueError – If any angle has magnitude >= π/2, suggesting possible unit confusion.
Examples
>>> # Convert physics spherical coordinates >>> import numpy as np >>> x, y, z = spherical_to_cartesian(np.pi/4, np.pi/3, 1) >>> print(f"Spherical to Cartesian: ({x:.3f}, {y:.3f}, {z:.3f})")
- mach.geometry.ultrasound_angles_to_cartesian(
- azimuth_rad: Real[Array, '*angles'] | float | int,
- elevation_rad: Real[Array, '*angles'] | float | int,
- radius_m: Real[Array, '*angles'] | float | int = 1,
Convert ultrasound angles (azimuth, elevation, radius) to Cartesian coordinates.
The resulting vectors can be used directly with mach.wavefront.plane().
We define the “ultrasound convention” as: 1. Rotate azimuth (counter-clockwise) around fixed y-axis 2. Then rotate elevation (clockwise) around fixed x-axis
This convention is more intuitive for elevation multi-slice imaging where you first create a scan in azimuth, then rotate that plane in elevation.
- Following the corrected mapping from magnusdk/vbeam#50
x = r * sin(azimuth) y = r * sin(elevation) * cos(azimuth) z = r * cos(elevation) * cos(azimuth)
- Parameters:
azimuth_rad – Azimuth angle in radians - angle in xz-plane (around y-axis), applied first.
elevation_rad – Elevation angle in radians - angle from xz-plane (after azimuth rotation).
radius_m – Radius/distance from origin in meters (defaults to 1 for unit vectors).
- Returns:
Cartesian coordinates in xyz-order. For array inputs: returns array with shape (*coords, 3). For scalar inputs: returns tuple[float, float, float].
Examples
>>> # Convert 15° azimuth to Cartesian >>> import numpy as np >>> x, y, z = ultrasound_angles_to_cartesian(np.radians(15), 0, 1) >>> print(f"15° azimuth: ({x:.3f}, {y:.3f}, {z:.3f})")
>>> # Multiple angles >>> azimuths = np.radians([-10, 0, 10]) >>> coords = ultrasound_angles_to_cartesian(azimuths, 0, 1) >>> print(coords.shape) # (3, 3)