< 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: 128
Uncovered lines: 0
Coverable lines: 128
Total lines: 229
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) =>
 37792521        new(
 37792522            TransformLocalAxisComponent(
 37792523                localX, localY, localZ,
 37792524                basis.Xx, basis.Yx, basis.Zx),
 37792525            TransformLocalAxisComponent(
 37792526                localX, localY, localZ,
 37792527                basis.Xy, basis.Yy, basis.Zy),
 37792528            TransformLocalAxisComponent(
 37792529                localX, localY, localZ,
 37792530                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) =>
 58542        new(
 58543            TransformLocalTriangleNormalCrossEdgeComponent(
 58544                localX, localY, localZ,
 58545                basis.Xx, basis.Yx, basis.Zx),
 58546            TransformLocalTriangleNormalCrossEdgeComponent(
 58547                localX, localY, localZ,
 58548                basis.Xy, basis.Yy, basis.Zy),
 58549            TransformLocalTriangleNormalCrossEdgeComponent(
 58550                localX, localY, localZ,
 58551                basis.Xz, basis.Yz, basis.Zz));
 52
 53    /// <summary>Transforms a raw finite face normal crossed with a raw finite edge, preserving its exact local construc
 54    internal static WideAxis3 TransformLocalNormalCrossEdge(
 55        in WideRationalBasis3d basis,
 56        Signed192 normalX, Signed192 normalY, Signed192 normalZ,
 57        Signed192 edgeX, Signed192 edgeY, Signed192 edgeZ) =>
 58558        TransformLocalTriangleNormalCrossEdgeAxis(basis,
 58559            WideArithmetic.MultiplySubtract(normalY, edgeZ, normalZ, edgeY),
 58560            WideArithmetic.MultiplySubtract(normalZ, edgeX, normalX, edgeZ),
 58561            WideArithmetic.MultiplySubtract(normalX, edgeY, normalY, edgeX));
 62
 63    internal static void GetLocalAxisProjections(
 64        in WideAxis3 axis,
 65        in WideRationalBasis3d basis,
 66        out Signed576 x,
 67        out Signed576 y,
 68        out Signed576 z)
 69    {
 4401770        x = GetBasisAxisProjection(
 4401771            axis,
 4401772            basis.Xx,
 4401773            basis.Xy,
 4401774            basis.Xz);
 4401775        y = GetBasisAxisProjection(
 4401776            axis,
 4401777            basis.Yx,
 4401778            basis.Yy,
 4401779            basis.Yz);
 4401780        z = GetBasisAxisProjection(
 4401781            axis,
 4401782            basis.Zx,
 4401783            basis.Zy,
 4401784            basis.Zz);
 4401785    }
 86
 87    internal static Signed576 GetLocalOffsetProjection(
 88        Vector3d localOffset,
 89        in Signed576 axisX,
 90        in Signed576 axisY,
 91        in Signed576 axisZ) =>
 13551592        WideArithmetic.AddSigned576(
 13551593            WideArithmetic.AddSigned576(
 13551594                WideArithmetic.MultiplySigned576(
 13551595                    axisX,
 13551596                    localOffset.X.m_rawValue),
 13551597                WideArithmetic.MultiplySigned576(
 13551598                    axisY,
 13551599                    localOffset.Y.m_rawValue)),
 135515100            WideArithmetic.MultiplySigned576(
 135515101                axisZ,
 135515102                localOffset.Z.m_rawValue));
 103
 104    internal static void TransformLocalAxis(
 105        in WideRationalBasis3d basis,
 106        in WideAxis3 localAxis,
 107        out Signed576 x,
 108        out Signed576 y,
 109        out Signed576 z)
 110    {
 23160111        x = TransformLocalAxisComponent(
 23160112            localAxis,
 23160113            basis.Xx,
 23160114            basis.Yx,
 23160115            basis.Zx);
 23160116        y = TransformLocalAxisComponent(
 23160117            localAxis,
 23160118            basis.Xy,
 23160119            basis.Yy,
 23160120            basis.Zy);
 23160121        z = TransformLocalAxisComponent(
 23160122            localAxis,
 23160123            basis.Xz,
 23160124            basis.Yz,
 23160125            basis.Zz);
 23160126    }
 127
 128    internal static Signed576 GetWorldOriginDifferenceProjection(
 129        Vector3d end,
 130        Vector3d start,
 131        in WideAxis3 axis) =>
 9475132        WideArithmetic.AddSigned576(
 9475133            WideArithmetic.AddSigned576(
 9475134                WideArithmetic.MultiplySigned320(
 9475135                    Signed320.ExtendValue(WideArithmetic.SubtractSigned192(
 9475136                        Signed192.Raw(end.X),
 9475137                        Signed192.Raw(start.X))),
 9475138                    axis.X),
 9475139                WideArithmetic.MultiplySigned320(
 9475140                    Signed320.ExtendValue(WideArithmetic.SubtractSigned192(
 9475141                        Signed192.Raw(end.Y),
 9475142                        Signed192.Raw(start.Y))),
 9475143                    axis.Y)),
 9475144            WideArithmetic.MultiplySigned320(
 9475145                Signed320.ExtendValue(WideArithmetic.SubtractSigned192(
 9475146                    Signed192.Raw(end.Z),
 9475147                    Signed192.Raw(start.Z))),
 9475148                axis.Z));
 149
 150    internal static Signed576 GetBasisAxisProjection(
 151        in WideAxis3 axis,
 152        Signed192 basisX,
 153        Signed192 basisY,
 154        Signed192 basisZ) =>
 136308155        WideArithmetic.AddSigned576(
 136308156            WideArithmetic.AddSigned576(
 136308157                WideArithmetic.MultiplySigned576(
 136308158                    Signed576.ExtendValue(axis.X),
 136308159                    basisX),
 136308160                WideArithmetic.MultiplySigned576(
 136308161                    Signed576.ExtendValue(axis.Y),
 136308162                    basisY)),
 136308163            WideArithmetic.MultiplySigned576(
 136308164                Signed576.ExtendValue(axis.Z),
 136308165                basisZ));
 166
 167    internal static void IncludeProjection(
 168        in Signed576 candidate,
 169        ref Signed576 minimum,
 170        ref Signed576 maximum)
 171    {
 105062172        if (WideArithmetic.SubtractSigned576(candidate, minimum).Sign < 0)
 12488173            minimum = candidate;
 105062174        if (WideArithmetic.SubtractSigned576(candidate, maximum).Sign > 0)
 13337175            maximum = candidate;
 105062176    }
 177
 178    private static Signed320 TransformLocalAxisComponent(
 179        Signed192 localX,
 180        Signed192 localY,
 181        Signed192 localZ,
 182        Signed192 basisX,
 183        Signed192 basisY,
 184        Signed192 basisZ) =>
 1133775185        WideArithmetic.AddSigned320(
 1133775186            WideArithmetic.AddSigned320(
 1133775187                WideArithmetic.MultiplySigned192(localX, basisX),
 1133775188                WideArithmetic.MultiplySigned192(localY, basisY)),
 1133775189            WideArithmetic.MultiplySigned192(localZ, basisZ));
 190
 191    private static Signed320 TransformLocalTriangleNormalCrossEdgeComponent(
 192        Signed320 localX,
 193        Signed320 localY,
 194        Signed320 localZ,
 195        Signed192 basisX,
 196        Signed192 basisY,
 197        Signed192 basisZ)
 198    {
 1755199        Signed576 transformed = WideArithmetic.AddSigned576(
 1755200            WideArithmetic.AddSigned576(
 1755201                WideArithmetic.MultiplySigned576(
 1755202                    Signed576.ExtendValue(localX),
 1755203                    basisX),
 1755204                WideArithmetic.MultiplySigned576(
 1755205                    Signed576.ExtendValue(localY),
 1755206                    basisY)),
 1755207            WideArithmetic.MultiplySigned576(
 1755208                Signed576.ExtendValue(localZ),
 1755209                basisZ));
 1755210        return Signed320.NarrowValue(transformed);
 211    }
 212
 213    private static Signed576 TransformLocalAxisComponent(
 214        in WideAxis3 localAxis,
 215        Signed192 basisX,
 216        Signed192 basisY,
 217        Signed192 basisZ) =>
 69480218        WideArithmetic.AddSigned576(
 69480219            WideArithmetic.AddSigned576(
 69480220                WideArithmetic.MultiplySigned576(
 69480221                    Signed576.ExtendValue(localAxis.X),
 69480222                    basisX),
 69480223                WideArithmetic.MultiplySigned576(
 69480224                    Signed576.ExtendValue(localAxis.Y),
 69480225                    basisY)),
 69480226            WideArithmetic.MultiplySigned576(
 69480227                Signed576.ExtendValue(localAxis.Z),
 69480228                basisZ));
 229}

Methods/Properties

TransformLocalAxis(FixedMathSharp.Geometry.WideRationalBasis3d&,FixedMathSharp.Signed192,FixedMathSharp.Signed192,FixedMathSharp.Signed192)
TransformLocalTriangleNormalCrossEdgeAxis(FixedMathSharp.Geometry.WideRationalBasis3d&,FixedMathSharp.Signed320,FixedMathSharp.Signed320,FixedMathSharp.Signed320)
TransformLocalNormalCrossEdge(FixedMathSharp.Geometry.WideRationalBasis3d&,FixedMathSharp.Signed192,FixedMathSharp.Signed192,FixedMathSharp.Signed192,FixedMathSharp.Signed192,FixedMathSharp.Signed192,FixedMathSharp.Signed192)
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)