< Summary

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

Feature is only available for sponsors

Upgrade to PRO version

Metrics

File(s)

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

#LineLine coverage
 1//=======================================================================
 2// WideRigidProjection.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>
 11/// Owns exact rigid-axis transforms and projection arithmetic shared by wide
 12/// geometry relations.
 13/// </summary>
 14internal static class WideRigidProjection
 15{
 16    internal static WideAxis3 TransformLocalAxis(
 17        in WideRationalBasis3d basis,
 18        Signed192 localX,
 19        Signed192 localY,
 20        Signed192 localZ) =>
 1839821        new(
 1839822            TransformLocalAxisComponent(
 1839823                localX, localY, localZ,
 1839824                basis.Xx, basis.Yx, basis.Zx),
 1839825            TransformLocalAxisComponent(
 1839826                localX, localY, localZ,
 1839827                basis.Xy, basis.Yy, basis.Zy),
 1839828            TransformLocalAxisComponent(
 1839829                localX, localY, localZ,
 1839830                basis.Xz, basis.Yz, basis.Zz));
 31
 32    /// <summary>
 33    /// Transforms a local triangle normal-cross-edge axis. The local components
 34    /// must come from that exact construction; its proven rigid-triangle bound
 35    /// keeps each transformed component within <see cref="Signed320"/>.
 36    /// </summary>
 37    internal static WideAxis3 TransformLocalTriangleNormalCrossEdgeAxis(
 38        in WideRationalBasis3d basis,
 39        Signed320 localX,
 40        Signed320 localY,
 41        Signed320 localZ) =>
 47442        new(
 47443            TransformLocalTriangleNormalCrossEdgeComponent(
 47444                localX, localY, localZ,
 47445                basis.Xx, basis.Yx, basis.Zx),
 47446            TransformLocalTriangleNormalCrossEdgeComponent(
 47447                localX, localY, localZ,
 47448                basis.Xy, basis.Yy, basis.Zy),
 47449            TransformLocalTriangleNormalCrossEdgeComponent(
 47450                localX, localY, localZ,
 47451                basis.Xz, basis.Yz, basis.Zz));
 52
 53    internal static void GetLocalAxisProjections(
 54        in WideAxis3 axis,
 55        in WideRationalBasis3d basis,
 56        out Signed576 x,
 57        out Signed576 y,
 58        out Signed576 z)
 59    {
 1212960        x = GetBasisAxisProjection(
 1212961            axis,
 1212962            basis.Xx,
 1212963            basis.Xy,
 1212964            basis.Xz);
 1212965        y = GetBasisAxisProjection(
 1212966            axis,
 1212967            basis.Yx,
 1212968            basis.Yy,
 1212969            basis.Yz);
 1212970        z = GetBasisAxisProjection(
 1212971            axis,
 1212972            basis.Zx,
 1212973            basis.Zy,
 1212974            basis.Zz);
 1212975    }
 76
 77    internal static Signed576 GetLocalOffsetProjection(
 78        Vector3d localOffset,
 79        in Signed576 axisX,
 80        in Signed576 axisY,
 81        in Signed576 axisZ) =>
 5931982        WideArithmetic.AddSigned576(
 5931983            WideArithmetic.AddSigned576(
 5931984                WideArithmetic.MultiplySigned576(
 5931985                    axisX,
 5931986                    localOffset.X.m_rawValue),
 5931987                WideArithmetic.MultiplySigned576(
 5931988                    axisY,
 5931989                    localOffset.Y.m_rawValue)),
 5931990            WideArithmetic.MultiplySigned576(
 5931991                axisZ,
 5931992                localOffset.Z.m_rawValue));
 93
 94    internal static void TransformLocalAxis(
 95        in WideRationalBasis3d basis,
 96        in WideAxis3 localAxis,
 97        out Signed576 x,
 98        out Signed576 y,
 99        out Signed576 z)
 100    {
 216101        x = TransformLocalAxisComponent(
 216102            localAxis,
 216103            basis.Xx,
 216104            basis.Yx,
 216105            basis.Zx);
 216106        y = TransformLocalAxisComponent(
 216107            localAxis,
 216108            basis.Xy,
 216109            basis.Yy,
 216110            basis.Zy);
 216111        z = TransformLocalAxisComponent(
 216112            localAxis,
 216113            basis.Xz,
 216114            basis.Yz,
 216115            basis.Zz);
 216116    }
 117
 118    internal static Signed576 GetWorldOriginDifferenceProjection(
 119        Vector3d end,
 120        Vector3d start,
 121        in WideAxis3 axis) =>
 28035122        WideArithmetic.AddSigned576(
 28035123            WideArithmetic.AddSigned576(
 28035124                WideArithmetic.MultiplySigned320(
 28035125                    Signed320.ExtendValue(WideArithmetic.SubtractSigned192(
 28035126                        Signed192.Raw(end.X),
 28035127                        Signed192.Raw(start.X))),
 28035128                    axis.X),
 28035129                WideArithmetic.MultiplySigned320(
 28035130                    Signed320.ExtendValue(WideArithmetic.SubtractSigned192(
 28035131                        Signed192.Raw(end.Y),
 28035132                        Signed192.Raw(start.Y))),
 28035133                    axis.Y)),
 28035134            WideArithmetic.MultiplySigned320(
 28035135                Signed320.ExtendValue(WideArithmetic.SubtractSigned192(
 28035136                    Signed192.Raw(end.Z),
 28035137                    Signed192.Raw(start.Z))),
 28035138                axis.Z));
 139
 140    internal static Signed576 GetBasisAxisProjection(
 141        in WideAxis3 axis,
 142        Signed192 basisX,
 143        Signed192 basisY,
 144        Signed192 basisZ) =>
 110076145        WideArithmetic.AddSigned576(
 110076146            WideArithmetic.AddSigned576(
 110076147                WideArithmetic.MultiplySigned576(
 110076148                    Signed576.ExtendValue(axis.X),
 110076149                    basisX),
 110076150                WideArithmetic.MultiplySigned576(
 110076151                    Signed576.ExtendValue(axis.Y),
 110076152                    basisY)),
 110076153            WideArithmetic.MultiplySigned576(
 110076154                Signed576.ExtendValue(axis.Z),
 110076155                basisZ));
 156
 157    internal static void IncludeProjection(
 158        in Signed576 candidate,
 159        ref Signed576 minimum,
 160        ref Signed576 maximum)
 161    {
 46173162        if (WideArithmetic.SubtractSigned576(candidate, minimum).Sign < 0)
 5923163            minimum = candidate;
 46173164        if (WideArithmetic.SubtractSigned576(candidate, maximum).Sign > 0)
 7304165            maximum = candidate;
 46173166    }
 167
 168    private static Signed320 TransformLocalAxisComponent(
 169        Signed192 localX,
 170        Signed192 localY,
 171        Signed192 localZ,
 172        Signed192 basisX,
 173        Signed192 basisY,
 174        Signed192 basisZ) =>
 55194175        WideArithmetic.AddSigned320(
 55194176            WideArithmetic.AddSigned320(
 55194177                WideArithmetic.MultiplySigned192(localX, basisX),
 55194178                WideArithmetic.MultiplySigned192(localY, basisY)),
 55194179            WideArithmetic.MultiplySigned192(localZ, basisZ));
 180
 181    private static Signed320 TransformLocalTriangleNormalCrossEdgeComponent(
 182        Signed320 localX,
 183        Signed320 localY,
 184        Signed320 localZ,
 185        Signed192 basisX,
 186        Signed192 basisY,
 187        Signed192 basisZ)
 188    {
 1422189        Signed576 transformed = WideArithmetic.AddSigned576(
 1422190            WideArithmetic.AddSigned576(
 1422191                WideArithmetic.MultiplySigned576(
 1422192                    Signed576.ExtendValue(localX),
 1422193                    basisX),
 1422194                WideArithmetic.MultiplySigned576(
 1422195                    Signed576.ExtendValue(localY),
 1422196                    basisY)),
 1422197            WideArithmetic.MultiplySigned576(
 1422198                Signed576.ExtendValue(localZ),
 1422199                basisZ));
 1422200        return Signed320.NarrowValue(transformed);
 201    }
 202
 203    private static Signed576 TransformLocalAxisComponent(
 204        in WideAxis3 localAxis,
 205        Signed192 basisX,
 206        Signed192 basisY,
 207        Signed192 basisZ) =>
 648208        WideArithmetic.AddSigned576(
 648209            WideArithmetic.AddSigned576(
 648210                WideArithmetic.MultiplySigned576(
 648211                    Signed576.ExtendValue(localAxis.X),
 648212                    basisX),
 648213                WideArithmetic.MultiplySigned576(
 648214                    Signed576.ExtendValue(localAxis.Y),
 648215                    basisY)),
 648216            WideArithmetic.MultiplySigned576(
 648217                Signed576.ExtendValue(localAxis.Z),
 648218                basisZ));
 219}

Methods/Properties

TransformLocalAxis(FixedMathSharp.Geometry.WideRationalBasis3d&,FixedMathSharp.Signed192,FixedMathSharp.Signed192,FixedMathSharp.Signed192)
TransformLocalTriangleNormalCrossEdgeAxis(FixedMathSharp.Geometry.WideRationalBasis3d&,FixedMathSharp.Signed320,FixedMathSharp.Signed320,FixedMathSharp.Signed320)
GetLocalAxisProjections(FixedMathSharp.Geometry.WideAxis3&,FixedMathSharp.Geometry.WideRationalBasis3d&,FixedMathSharp.Signed576&,FixedMathSharp.Signed576&,FixedMathSharp.Signed576&)
GetLocalOffsetProjection(FixedMathSharp.Vector3d,FixedMathSharp.Signed576&,FixedMathSharp.Signed576&,FixedMathSharp.Signed576&)
TransformLocalAxis(FixedMathSharp.Geometry.WideRationalBasis3d&,FixedMathSharp.Geometry.WideAxis3&,FixedMathSharp.Signed576&,FixedMathSharp.Signed576&,FixedMathSharp.Signed576&)
GetWorldOriginDifferenceProjection(FixedMathSharp.Vector3d,FixedMathSharp.Vector3d,FixedMathSharp.Geometry.WideAxis3&)
GetBasisAxisProjection(FixedMathSharp.Geometry.WideAxis3&,FixedMathSharp.Signed192,FixedMathSharp.Signed192,FixedMathSharp.Signed192)
IncludeProjection(FixedMathSharp.Signed576&,FixedMathSharp.Signed576&,FixedMathSharp.Signed576&)
TransformLocalAxisComponent(FixedMathSharp.Signed192,FixedMathSharp.Signed192,FixedMathSharp.Signed192,FixedMathSharp.Signed192,FixedMathSharp.Signed192,FixedMathSharp.Signed192)
TransformLocalTriangleNormalCrossEdgeComponent(FixedMathSharp.Signed320,FixedMathSharp.Signed320,FixedMathSharp.Signed320,FixedMathSharp.Signed192,FixedMathSharp.Signed192,FixedMathSharp.Signed192)
TransformLocalAxisComponent(FixedMathSharp.Geometry.WideAxis3&,FixedMathSharp.Signed192,FixedMathSharp.Signed192,FixedMathSharp.Signed192)