< Summary

Information
Class: FixedMathSharp.Geometry.CylinderPolytopeFrame
Assembly: FixedMathSharp
File(s): /home/runner/work/FixedMathSharp/FixedMathSharp/src/FixedMathSharp/Geometry/Wide/Convex/CylinderPolytopeFrame.cs
Line coverage
100%
Covered lines: 61
Uncovered lines: 0
Coverable lines: 61
Total lines: 125
Line coverage: 100%
Branch coverage
100%
Covered branches: 6
Total branches: 6
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
get_SourceFrame()100%11100%
.ctor(...)100%22100%
.ctor(...)100%11100%
.ctor(...)100%11100%
.ctor(...)100%11100%
Transform(...)100%44100%

File(s)

/home/runner/work/FixedMathSharp/FixedMathSharp/src/FixedMathSharp/Geometry/Wide/Convex/CylinderPolytopeFrame.cs

#LineLine coverage
 1//=======================================================================
 2// CylinderPolytopeFrame.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
 8namespace FixedMathSharp.Geometry;
 9
 10/// <summary>Exact shared cylinder-local coordinates for polytope geometry.</summary>
 11internal readonly struct CylinderPolytopeFrame
 12{
 13    internal readonly WideRationalBasis3d Basis;
 14    internal readonly WideAxis3 Translation;
 15    internal readonly Signed192 Denominator;
 16    internal readonly Signed320 Cap;
 17    internal readonly Signed192 Radius;
 18    internal readonly Signed320 CoordinateDenominator;
 19    internal readonly bool HasExactScale;
 20    private readonly ScaledRigidFrame3d _sourceFrame;
 21    private readonly Vector3d _cylinderCenter;
 22    private readonly FixedQuaternion _cylinderRotation;
 157223    internal ScaledRigidFrame3d SourceFrame => _sourceFrame;
 24
 25    /// <summary>Exact capsule-local identity chart at a retained rational coordinate denominator.</summary>
 26    internal CylinderPolytopeFrame(Fixed64 height, Fixed64 radius, Signed320 coordinateDenominator)
 27    {
 12028        this = default;
 12029        CoordinateDenominator = coordinateDenominator;
 12030        Cap = Signed320.NarrowValue(WideArithmetic.MultiplySigned320(coordinateDenominator, Signed320.ExtendValue(Signed
 12031        Radius = WideArithmetic.AddSigned192(Signed192.Raw(radius), Signed192.Raw(radius));
 12032        HasExactScale = !Signed192.TryNarrowSigned(coordinateDenominator, out Signed192 denominator);
 12033        if (HasExactScale)
 34        {
 535            Basis = new WideRationalBasis3d(FixedQuaternion.Identity);
 536            Denominator = Signed192.Signed(1);
 537            _sourceFrame = ScaledRigidFrame3d.Rigid(Vector3d.Zero, FixedQuaternion.Identity);
 538            _cylinderRotation = FixedQuaternion.Identity;
 39        }
 40        else
 41        {
 11542            Denominator = denominator;
 11543            Basis = WideRationalBasis3d.ScaledIdentity(denominator);
 44        }
 11545    }
 46
 47    internal CylinderPolytopeFrame(Vector3d cylinderCenter, FixedQuaternion cylinderRotation,
 48        Fixed64 height, Fixed64 radius, Vector3d origin, FixedQuaternion rotation)
 411049        : this(cylinderCenter, cylinderRotation, Signed192.Raw(height), radius, origin, rotation)
 50    {
 411051    }
 52
 53    internal CylinderPolytopeFrame(Vector3d cylinderCenter, FixedQuaternion cylinderRotation,
 54        Signed192 height, Fixed64 radius, Vector3d origin, FixedQuaternion rotation)
 55    {
 478856        this = default;
 478857        WideRationalBasis3d cylinderBasis = new(cylinderRotation);
 478858        WideRationalBasis3d shapeBasis = new(rotation);
 478859        Basis = WideRationalBasis3d.CreateRelative(cylinderBasis, shapeBasis);
 478860        Denominator = Basis.Denominator;
 478861        CoordinateDenominator = Signed320.ExtendValue(Denominator);
 478862        WideOrientedBox.GetRelativeLocalPointNumerators(origin, cylinderCenter, cylinderBasis,
 478863            out Signed192 x, out Signed192 y, out Signed192 z);
 478864        Translation = new WideAxis3(
 478865            WideArithmetic.MultiplySigned192(x, shapeBasis.Denominator),
 478866            WideArithmetic.MultiplySigned192(y, shapeBasis.Denominator),
 478867            WideArithmetic.MultiplySigned192(z, shapeBasis.Denominator));
 68        // Work with doubled cylinder-local coordinates so odd raw full
 69        // heights need no rounded half-height. All vertices share D.
 478870        Cap = WideArithmetic.MultiplySigned192(height, Denominator);
 478871        Radius = WideArithmetic.AddSigned192(Signed192.Raw(radius), Signed192.Raw(radius));
 478872    }
 73
 74    /// <summary>
 75    /// Retains an affine source for finite near-field geometry. Callers admit
 76    /// source/target reach at most 4096 and relative coordinates at most 16384.
 77    /// </summary>
 78    internal CylinderPolytopeFrame(in ScaledRigidFrame3d sourceFrame,
 79        Vector3d cylinderCenter, FixedQuaternion cylinderRotation, Signed192 height, Fixed64 radius)
 80    {
 81        // Finite-section and triangle owners dispatch rigid source frames
 82        // before reaching this affine arithmetic owner.
 81383        this = default;
 81384        _sourceFrame = sourceFrame;
 81385        _cylinderCenter = cylinderCenter;
 81386        _cylinderRotation = cylinderRotation;
 81387        HasExactScale = true;
 81388        WideRationalBasis3d cylinderBasis = new(cylinderRotation);
 81389        Basis = WideRationalBasis3d.CreateRelative(cylinderBasis, sourceFrame.GeometryBasis);
 81390        CoordinateDenominator = Signed320.NarrowValue(
 81391            WideArithmetic.MultiplySigned320(sourceFrame.Denominator, cylinderBasis.Denominator));
 81392        Cap = Signed320.NarrowValue(WideArithmetic.MultiplySigned320(CoordinateDenominator, height));
 81393        Radius = WideArithmetic.AddSigned192(Signed192.Raw(radius), Signed192.Raw(radius));
 81394    }
 95
 96    internal WideAxis3 Transform(Vector3d point)
 97    {
 49503598        if (HasExactScale)
 99        {
 100            // Existing affine sources are nonrigid. The local identity chart
 101            // retains a wider rational denominator without changing its mapping.
 148842102            if (_sourceFrame.IsRigid)
 103            {
 17104                Signed320 chartX = Signed320.NarrowValue(WideArithmetic.MultiplySigned320(CoordinateDenominator, Signed3
 17105                Signed320 chartY = Signed320.NarrowValue(WideArithmetic.MultiplySigned320(CoordinateDenominator, Signed3
 17106                Signed320 chartZ = Signed320.NarrowValue(WideArithmetic.MultiplySigned320(CoordinateDenominator, Signed3
 17107                return new WideAxis3(WideArithmetic.AddSigned320(chartX, chartX), WideArithmetic.AddSigned320(chartY, ch
 108            }
 148825109            _sourceFrame.GetPoint(point).GetLocalPointNumerators(_cylinderCenter, _cylinderRotation,
 148825110                out Signed576 px, out Signed576 py, out Signed576 pz, out _);
 111            // Near-field raw coordinates <2^46 and the common denominator
 112            // <2^259 leave doubled numerators below 306 magnitude bits.
 148825113            return new WideAxis3(Signed320.NarrowValue(WideArithmetic.AddSigned576(px, px)),
 148825114                Signed320.NarrowValue(WideArithmetic.AddSigned576(py, py)),
 148825115                Signed320.NarrowValue(WideArithmetic.AddSigned576(pz, pz)));
 116        }
 346193117        WideAxis3 local = WideRigidProjection.TransformLocalAxis(Basis,
 346193118            Signed192.Raw(point.X), Signed192.Raw(point.Y), Signed192.Raw(point.Z));
 346193119        Signed320 x = WideArithmetic.AddSigned320(local.X, Translation.X);
 346193120        Signed320 y = WideArithmetic.AddSigned320(local.Y, Translation.Y);
 346193121        Signed320 z = WideArithmetic.AddSigned320(local.Z, Translation.Z);
 346193122        return new WideAxis3(WideArithmetic.AddSigned320(x, x),
 346193123            WideArithmetic.AddSigned320(y, y), WideArithmetic.AddSigned320(z, z));
 124    }
 125}