All notable changes to this project are documented here. The format follows Keep a Changelog, and the project uses Semantic Versioning with pre-release suffixes for previews.
1.0.0
The first stable release. The public API is frozen under semantic versioning. Results are bit-identical to 0.1.0-preview.5: there is no numeric change.
From this release on, results are also bit-identical across every release of a major version: no 1.x minor or patch release changes an existing result (see "The determinism promise" in the README).
Changed (breaking since 0.1.0-preview.5)
One verb per concept: Create... builds a value from parts or another concept, From... is only a representation change, and instance methods that return a new value are participles. Numeric results are unchanged; only names move.
| Before | Now |
|---|---|
Matrix2x2/3x3/4x4 D/F .Transpose() | .Transposed() |
QuaternionD/F .Conjugate() | .Conjugated() |
RigidTransformD/F .Inverse() | .Inverted() |
QuaternionD/F .FromAxisSinCos(axis, sin, cos) | .CreateFromAxisSinCos(axis, sin, cos) |
QuaternionD/F .FromMatrix(m) | .CreateFromRotationMatrix(m) |
Affine3D/F .FromTranslation(v) | .CreateTranslation(v) |
Bounds2/3 D/F .FromPoints(points) | .CreateFromPoints(points) |
Bounds2/3 D/F .FromCenterExtents(c, e) | .CreateFromCenterExtents(c, e) |
FixedBridge.MaxMagnitude (const) | FixedBridge.ExclusiveMagnitudeBound (static property; the bound is exclusive) |
PrincipalAxesD/F(moments, rotation, orientation) | PrincipalAxesD/F(moments, rotation); Orientation is derived from Rotation, so the two cannot disagree |
MassPropertiesD/F(mass, ...) accepted a negative mass | throws ArgumentOutOfRangeException (parameter mass) |
Also: the parameters of FromRows / FromColumns are now row0.. / column0.. (0-based, like Row(int) and Column(int)); ParamName of every argument exception names a parameter of the public method that was called (predicates: ax..ez; InertiaD/F.PrincipalAxes: tensor); all public value types serialize with System.Text.Json (public fields and component constructors, derived members ignored; bit-exact round trip with default options and with source-generated metadata); the package project URL points at the repository; the matrix convention (column vectors, the opposite of System.Numerics) and the predicate input range (out-of-range input may throw) are documented in the README, the package readme and the type and method docs.
Added
QuaternionD/F:CreateFromAxisAngle(exactlyCreateFromAxisSinCos(axis, SinCos(radians / 2))) andSlerp(shortest arc; evaluation order indocs/evaluation-order.md).Matrix3x3D/F:CreateRotationX/Y/Z,CreateFromQuaternion.Matrix4x4D/F:CreateRotationX/Y/Z,CreateFromQuaternion,CreateFromMatrix3x3,CreateFromAffine.Affine3D/F:CreateScale,CreateFromLinear,CreateFromQuaternion,CreateRotationX/Y/Z.FromSystemNumerics/ToSystemNumericsonVector2/3/4,QuaternionandMatrix4x4(D and F). The matrix conversions transpose; double to float rounds to nearest even.- Hash-matrix scenarios
types/f32/rotation,types/f64/rotationandtypes/json(a source-generated JSON round trip that also runs in the NativeAOT and WebAssembly smoke apps). Every earlier manifest line is unchanged.
Removed
ExpansionArithmeticis no longer public. Its preconditions are not checked (invalid input gives silently wrong results), and publishing it would freeze Shewchuk's output-size rules. It remains the internal engine behindExactPredicatesandSegmentPredicates; exposing a checked form later would be an additive change.
0.1.0-preview.5
The first version published to nuget.org. It is a preview: public API may change before 1.0.
Added
- Vectors (2, 3, 4), matrices (2x2, 3x3, 4x4), quaternions, affine and rigid transforms and axis-aligned bounds, in float and double, with a documented evaluation order (
docs/evaluation-order.md). - Correctly rounded elementary functions for float and double (
Math32,Math64): sin, cos, tan, asin, acos, atan, atan2, exp, exp2, expm1, log, log2, log10, log1p, pow, cbrt, hypot, sinh, cosh, tanh, sincos. Float results were checked exhaustively; double results against an exact big-number stage. They are slower than the platform'sMathfunctions (about 3x to 20x single-threaded in an informal measurement; seedocs/functions.md), in exchange for identical bits everywhere. - Exact geometric predicates (
Orient2D,Orient3D,InCircle,InSphere, segment classification) with a fast filter that always agrees with the exact sign. - The Q31.32 fixed-point bridge (
FixedBridge): exact conversion for magnitudes below 2^21, rejecting beyond. - Symmetric 3x3 eigen decomposition and inertia-tensor math (
RecursiveAI.OneMath.Physics). - NativeAOT and trimming compatible; no dependencies beyond the .NET base class library.
- A hash-matrix runner that compares results across JIT, scalar, NativeAOT and WebAssembly builds, and across x64 and arm64.
Known limits
- Preview status: no API stability promise yet.
- The correctly rounded functions favour exactness over speed; faster opt-in variants are not part of this release.