< Summary

Information
Class: FixedMathSharp.Geometry.RationalPoint3d
Assembly: FixedMathSharp
File(s): /home/runner/work/FixedMathSharp/FixedMathSharp/src/FixedMathSharp/Geometry/Wide/Common/RationalPoint3d.cs
Line coverage
100%
Covered lines: 60
Uncovered lines: 0
Coverable lines: 60
Total lines: 139
Line coverage: 100%
Branch coverage
100%
Covered branches: 14
Total branches: 14
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
FromScalarPoint(...)100%11100%
FromAnchor(...)100%11100%
FromAnchor(...)100%11100%
CompareProjection(...)100%11100%
ScaleScalar(...)100%22100%
TryGetPoint(...)100%11100%
GetLocalPointNumerators(...)100%44100%
TryGetLocalPointIn(...)100%11100%
TryGetExactLocalPointIn(...)100%66100%
SubtractOrigin(...)100%11100%
Project(...)100%11100%
TryMaterialize(...)100%22100%

File(s)

/home/runner/work/FixedMathSharp/FixedMathSharp/src/FixedMathSharp/Geometry/Wide/Common/RationalPoint3d.cs

#LineLine coverage
 1//=======================================================================
 2// RationalPoint3d.cs
 3//=======================================================================
 4// MIT License, Copyright (c) 2024-present David Oravsky (mrdav30)
 5// See LICENSE file in the project root for full license information.
 6//=======================================================================
 7
 8using System;
 9
 10namespace FixedMathSharp.Geometry;
 11
 12/// <summary>
 13/// Retains exact world-space raw-coordinate numerators over one positive
 14/// denominator; materialization rounds each final coordinate once to nearest even.
 15/// </summary>
 16internal readonly struct RationalPoint3d
 17{
 18    internal readonly Signed320 X, Y, Z, Denominator;
 19
 20    internal RationalPoint3d(Signed320 x, Signed320 y, Signed320 z, Signed320 denominator)
 21    {
 145338822        X = x; Y = y; Z = z; Denominator = denominator;
 36334723    }
 24
 25    internal static RationalPoint3d FromScalarPoint(Vector3d point) =>
 4398426        new(ScaleScalar(point.X), ScaleScalar(point.Y), ScaleScalar(point.Z), new Signed320(0UL, 0UL, 0UL, 1UL, 0UL));
 27
 28    /// <summary>Retains an existing anchor's exact feature term in the shared Q² point domain.</summary>
 29    internal static RationalPoint3d FromAnchor(in FixedPointAnchor anchor)
 30    {
 7531        WideTriangleRelations.GetPointLocalNumerators(anchor, Vector3d.Zero, FixedQuaternion.Identity,
 7532            out Signed576 x, out Signed576 y, out Signed576 z, out Signed320 denominator);
 33        // An anchor combines a 65-bit rigid basis with a 34-bit exact local
 34        // term denominator. Its world numerator plus this lift fits 229 bits.
 7535        Signed192 qSquared = new(0UL, 1UL, 0UL);
 7536        return new RationalPoint3d(
 7537            Signed320.NarrowValue(WideArithmetic.MultiplySigned576(x, qSquared)),
 7538            Signed320.NarrowValue(WideArithmetic.MultiplySigned576(y, qSquared)),
 7539            Signed320.NarrowValue(WideArithmetic.MultiplySigned576(z, qSquared)),
 7540            Signed320.NarrowValue(WideArithmetic.MultiplySigned320(denominator, qSquared)));
 41    }
 42
 43    /// <summary>Embeds a complete planar anchor in X/Z with zero Y, preserving sub-lattice features.</summary>
 44    internal static RationalPoint3d FromAnchor(in FixedPointAnchor2d anchor)
 45    {
 3146        WidePointAnchor2d.GetExactRelativeOffsetRatio(anchor.Origin, anchor.LocalPoint, anchor.LocalDisplacement,
 3147            anchor.ExactLocalTerm, anchor.Rotation, Vector2d.Zero, Vector2d.Zero, Vector2d.Zero, default,
 3148            Fixed64.Zero, out Signed320 x, out Signed320 z, out Signed320 rawDenominator);
 49        // Both owners retain raw-coordinate ratios. The anchor's 2 Q²
 50        // denominator already belongs to the shared Q² point domain.
 3151        return new(x, default, z, rawDenominator);
 52    }
 53
 54    /// <summary>Compares exact world projections without materializing either point.</summary>
 55    internal static int CompareProjection(in RationalPoint3d first, in RationalPoint3d second, Vector3d direction)
 56    {
 557        WideDirection3d delta = WideTriangleRelations.GetScaledPointDifference(first, second,
 558            WideArithmetic.TruncateSigned320By64(second.Denominator));
 559        var axis = new WideAxis3(Signed320.ExtendValue(Signed192.Raw(direction.X)),
 560            Signed320.ExtendValue(Signed192.Raw(direction.Y)), Signed320.ExtendValue(Signed192.Raw(direction.Z)));
 561        return WideDirection3d.Dot(delta, axis).Sign;
 62    }
 63
 64    private static Signed320 ScaleScalar(Fixed64 coordinate)
 65    {
 13195266        ulong extension = coordinate.m_rawValue < 0L ? ulong.MaxValue : 0UL;
 13195267        return new Signed320(extension, extension, extension, unchecked((ulong)coordinate.m_rawValue), 0UL);
 68    }
 69
 70    internal bool TryGetPoint(out Vector3d point) =>
 308171        TryMaterialize(Signed576.ExtendValue(X), Signed576.ExtendValue(Y), Signed576.ExtendValue(Z),
 308172            Signed576.ExtendValue(Denominator), out point);
 73
 74    /// <summary>
 75    /// Transposes a normalized target rotation after exact origin subtraction.
 76    /// Source numerators are below 319 magnitude bits, so the three products
 77    /// and their sum are below 386 bits; 576-bit temporaries retain every term.
 78    /// </summary>
 79    internal void GetLocalPointNumerators(Vector3d targetOrigin, FixedQuaternion targetRotation,
 80        out Signed576 x, out Signed576 y, out Signed576 z, out Signed320 denominator)
 81    {
 14951482        if (!targetRotation.IsNormalized())
 183            throw new ArgumentException("The target rotation must be normalized.", nameof(targetRotation));
 14951384        if (targetRotation == FixedQuaternion.Identity)
 85        {
 4419286            x = SubtractOrigin(X, targetOrigin.X);
 4419287            y = SubtractOrigin(Y, targetOrigin.Y);
 4419288            z = SubtractOrigin(Z, targetOrigin.Z);
 4419289            denominator = Denominator;
 4419290            return;
 91        }
 92
 10532193        WideRationalBasis3d basis = new(targetRotation);
 10532194        Signed576 relativeX = SubtractOrigin(X, targetOrigin.X);
 10532195        Signed576 relativeY = SubtractOrigin(Y, targetOrigin.Y);
 10532196        Signed576 relativeZ = SubtractOrigin(Z, targetOrigin.Z);
 10532197        x = Project(relativeX, relativeY, relativeZ, basis.Xx, basis.Xy, basis.Xz);
 10532198        y = Project(relativeX, relativeY, relativeZ, basis.Yx, basis.Yy, basis.Yz);
 10532199        z = Project(relativeX, relativeY, relativeZ, basis.Zx, basis.Zy, basis.Zz);
 100        // Q^2 and three normalized quaternion denominators stay below 259 bits.
 105321101        denominator = Signed320.NarrowValue(WideArithmetic.MultiplySigned320(Denominator, basis.Denominator));
 105321102    }
 103
 104    internal bool TryGetLocalPointIn(Vector3d targetOrigin, FixedQuaternion targetRotation, out Vector3d point)
 105    {
 186106        GetLocalPointNumerators(targetOrigin, targetRotation, out Signed576 x, out Signed576 y, out Signed576 z,
 186107            out Signed320 denominator);
 185108        return TryMaterialize(x, y, z, Signed576.ExtendValue(denominator), out point);
 109    }
 110
 111    /// <summary>Converts only lattice-exact coordinates, without admitting rounded geometry.</summary>
 112    internal bool TryGetExactLocalPointIn(Vector3d targetOrigin, FixedQuaternion targetRotation, out Vector3d point)
 113    {
 12114        GetLocalPointNumerators(targetOrigin, targetRotation, out Signed576 x, out Signed576 y, out Signed576 z,
 12115            out Signed320 denominator);
 12116        return TryMaterialize(x, y, z, Signed576.ExtendValue(denominator), out point)
 12117            && x.Equals(WideArithmetic.MultiplySigned320(denominator, Signed192.Raw(point.X)))
 12118            && y.Equals(WideArithmetic.MultiplySigned320(denominator, Signed192.Raw(point.Y)))
 12119            && z.Equals(WideArithmetic.MultiplySigned320(denominator, Signed192.Raw(point.Z)));
 120    }
 121    private Signed576 SubtractOrigin(Signed320 coordinate, Fixed64 origin) =>
 448539122        WideArithmetic.SubtractSigned576(Signed576.ExtendValue(coordinate),
 448539123            WideArithmetic.MultiplySigned320(Denominator, Signed192.Raw(origin)));
 124
 125    private static Signed576 Project(Signed576 x, Signed576 y, Signed576 z,
 126        Signed192 axisX, Signed192 axisY, Signed192 axisZ) =>
 315963127        WideArithmetic.AddSigned576(WideArithmetic.AddSigned576(
 315963128            WideArithmetic.MultiplySigned576(x, axisX), WideArithmetic.MultiplySigned576(y, axisY)),
 315963129            WideArithmetic.MultiplySigned576(z, axisZ));
 130
 131    private static bool TryMaterialize(Signed576 x, Signed576 y, Signed576 z, Signed576 denominator, out Vector3d point)
 132    {
 3278133        bool representable = Fixed64.TryGetSignedRawRatio(x, denominator, out Fixed64 px)
 3278134            & Fixed64.TryGetSignedRawRatio(y, denominator, out Fixed64 py)
 3278135            & Fixed64.TryGetSignedRawRatio(z, denominator, out Fixed64 pz);
 3278136        point = representable ? new Vector3d(px, py, pz) : default;
 3278137        return representable;
 138    }
 139}