< Summary

Information
Class: FixedMathSharp.WideVector3dTransform
Assembly: FixedMathSharp
File(s): /home/runner/work/FixedMathSharp/FixedMathSharp/src/FixedMathSharp/Numerics/Wide/WideVector3dTransform.cs
Line coverage
100%
Covered lines: 202
Uncovered lines: 0
Coverable lines: 202
Total lines: 297
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
TryTransformScaledPoint(...)100%22100%
TryInverseTransformScaledPoint(...)100%22100%
TryComposeScaledLocalPoints(...)100%22100%
TryTransformScaledCoordinate(...)100%11100%
TryInverseTransformScaledCoordinate(...)100%11100%
TryComposeScaledLocalCoordinate(...)100%11100%

File(s)

/home/runner/work/FixedMathSharp/FixedMathSharp/src/FixedMathSharp/Numerics/Wide/WideVector3dTransform.cs

#LineLine coverage
 1//=======================================================================
 2// WideVector3dTransform.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 FixedMathSharp.Geometry;
 9
 10namespace FixedMathSharp;
 11
 12/// <summary>
 13/// Owns exact component-scaled three-dimensional point transforms.
 14/// </summary>
 15internal static class WideVector3dTransform
 16{
 17    internal static bool TryTransformScaledPoint(
 18        Vector3d origin,
 19        FixedQuaternion rotation,
 20        Vector3d localPoint,
 21        Vector3d scale,
 22        Vector3d localDisplacement,
 23        out Vector3d worldPoint)
 24    {
 7025        WideRationalBasis3d basis = new(rotation);
 7026        Signed320 scaledDenominator = WideArithmetic.MultiplySigned192(
 7027            basis.Denominator,
 7028            Signed192.One);
 7029        Signed576 denominator = Signed576.ExtendValue(scaledDenominator);
 7030        bool representable = TryTransformScaledCoordinate(
 7031                origin.X,
 7032                basis.Xx,
 7033                basis.Yx,
 7034                basis.Zx,
 7035                scaledDenominator,
 7036                denominator,
 7037                localPoint,
 7038                scale,
 7039                localDisplacement,
 7040                out Fixed64 x)
 7041            & TryTransformScaledCoordinate(
 7042                origin.Y,
 7043                basis.Xy,
 7044                basis.Yy,
 7045                basis.Zy,
 7046                scaledDenominator,
 7047                denominator,
 7048                localPoint,
 7049                scale,
 7050                localDisplacement,
 7051                out Fixed64 y)
 7052            & TryTransformScaledCoordinate(
 7053                origin.Z,
 7054                basis.Xz,
 7055                basis.Yz,
 7056                basis.Zz,
 7057                scaledDenominator,
 7058                denominator,
 7059                localPoint,
 7060                scale,
 7061                localDisplacement,
 7062                out Fixed64 z);
 7063        if (!representable)
 64        {
 165            worldPoint = default;
 166            return false;
 67        }
 68
 6969        worldPoint = new Vector3d(x, y, z);
 6970        return true;
 71    }
 72
 73    internal static bool TryInverseTransformScaledPoint(
 74        Vector3d origin,
 75        FixedQuaternion rotation,
 76        Vector3d worldPoint,
 77        Vector3d scale,
 78        out Vector3d localPoint)
 79    {
 10480        WideRationalBasis3d basis = new(rotation);
 10481        Signed192 offsetX = WideArithmetic.SubtractSigned192(
 10482            Signed192.Raw(worldPoint.X),
 10483            Signed192.Raw(origin.X));
 10484        Signed192 offsetY = WideArithmetic.SubtractSigned192(
 10485            Signed192.Raw(worldPoint.Y),
 10486            Signed192.Raw(origin.Y));
 10487        Signed192 offsetZ = WideArithmetic.SubtractSigned192(
 10488            Signed192.Raw(worldPoint.Z),
 10489            Signed192.Raw(origin.Z));
 10490        bool representable = TryInverseTransformScaledCoordinate(
 10491                offsetX,
 10492                offsetY,
 10493                offsetZ,
 10494                basis.Xx,
 10495                basis.Xy,
 10496                basis.Xz,
 10497                basis.Denominator,
 10498                scale.X,
 10499                out Fixed64 x)
 104100            & TryInverseTransformScaledCoordinate(
 104101                offsetX,
 104102                offsetY,
 104103                offsetZ,
 104104                basis.Yx,
 104105                basis.Yy,
 104106                basis.Yz,
 104107                basis.Denominator,
 104108                scale.Y,
 104109                out Fixed64 y)
 104110            & TryInverseTransformScaledCoordinate(
 104111                offsetX,
 104112                offsetY,
 104113                offsetZ,
 104114                basis.Zx,
 104115                basis.Zy,
 104116                basis.Zz,
 104117                basis.Denominator,
 104118                scale.Z,
 104119                out Fixed64 z);
 104120        if (!representable)
 121        {
 1122            localPoint = default;
 1123            return false;
 124        }
 125
 103126        localPoint = new Vector3d(x, y, z);
 103127        return true;
 128    }
 129
 130    internal static bool TryComposeScaledLocalPoints(
 131        Vector3d outerLocalPoint,
 132        Vector3d outerScale,
 133        Vector3d innerFrameOffset,
 134        Vector3d innerFrameScale,
 135        Vector3d innerLocalDisplacement,
 136        FixedQuaternion innerRotation,
 137        out Vector3d result)
 138    {
 67139        WideRationalBasis3d basis = new(innerRotation);
 67140        Signed320 scaledDenominator = WideArithmetic.MultiplySigned192(
 67141            basis.Denominator,
 67142            Signed192.One);
 67143        Signed576 denominator = Signed576.ExtendValue(scaledDenominator);
 67144        bool representable = TryComposeScaledLocalCoordinate(
 67145                outerLocalPoint.X,
 67146                outerScale.X,
 67147                basis.Xx,
 67148                basis.Yx,
 67149                basis.Zx,
 67150                basis.Denominator,
 67151                denominator,
 67152                innerFrameOffset.X,
 67153                innerFrameScale.X,
 67154                innerLocalDisplacement,
 67155                out Fixed64 x)
 67156            & TryComposeScaledLocalCoordinate(
 67157                outerLocalPoint.Y,
 67158                outerScale.Y,
 67159                basis.Xy,
 67160                basis.Yy,
 67161                basis.Zy,
 67162                basis.Denominator,
 67163                denominator,
 67164                innerFrameOffset.Y,
 67165                innerFrameScale.Y,
 67166                innerLocalDisplacement,
 67167                out Fixed64 y)
 67168            & TryComposeScaledLocalCoordinate(
 67169                outerLocalPoint.Z,
 67170                outerScale.Z,
 67171                basis.Xz,
 67172                basis.Yz,
 67173                basis.Zz,
 67174                basis.Denominator,
 67175                denominator,
 67176                innerFrameOffset.Z,
 67177                innerFrameScale.Z,
 67178                innerLocalDisplacement,
 67179                out Fixed64 z);
 67180        if (!representable)
 181        {
 1182            result = default;
 1183            return false;
 184        }
 185
 66186        result = new Vector3d(x, y, z);
 66187        return true;
 188    }
 189
 190    private static bool TryTransformScaledCoordinate(
 191        Fixed64 origin,
 192        Signed192 axisX,
 193        Signed192 axisY,
 194        Signed192 axisZ,
 195        Signed320 scaledDenominator,
 196        Signed576 denominator,
 197        Vector3d localPoint,
 198        Vector3d scale,
 199        Vector3d localDisplacement,
 200        out Fixed64 coordinate)
 201    {
 210202        Signed576 scaledLocal = WideArithmetic.AddSigned576(
 210203            WideArithmetic.AddSigned576(
 210204                WideArithmetic.MultiplySigned320(
 210205                    WideArithmetic.MultiplySigned192(
 210206                        Signed192.Raw(localPoint.X),
 210207                        Signed192.Raw(scale.X)),
 210208                    Signed320.ExtendValue(axisX)),
 210209                WideArithmetic.MultiplySigned320(
 210210                    WideArithmetic.MultiplySigned192(
 210211                        Signed192.Raw(localPoint.Y),
 210212                        Signed192.Raw(scale.Y)),
 210213                    Signed320.ExtendValue(axisY))),
 210214            WideArithmetic.MultiplySigned320(
 210215                WideArithmetic.MultiplySigned192(
 210216                    Signed192.Raw(localPoint.Z),
 210217                    Signed192.Raw(scale.Z)),
 210218                Signed320.ExtendValue(axisZ)));
 210219        Signed320 displacement = WideArithmetic.GetDotProduct3D(
 210220            Signed192.Raw(localDisplacement.X),
 210221            Signed192.Raw(localDisplacement.Y),
 210222            Signed192.Raw(localDisplacement.Z),
 210223            axisX,
 210224            axisY,
 210225            axisZ);
 210226        Signed576 numerator = WideArithmetic.AddSigned576(
 210227            WideArithmetic.AddSigned576(
 210228                WideArithmetic.MultiplySigned320(
 210229                    Signed320.ExtendValue(Signed192.Raw(origin)),
 210230                    scaledDenominator),
 210231                scaledLocal),
 210232            WideArithmetic.MultiplySigned320(
 210233                displacement,
 210234                Signed320.ExtendValue(Signed192.One)));
 210235        return Fixed64.TryGetSignedRawRatio(
 210236            numerator,
 210237            denominator,
 210238            out coordinate);
 239    }
 240
 241    private static bool TryInverseTransformScaledCoordinate(
 242        Signed192 offsetX,
 243        Signed192 offsetY,
 244        Signed192 offsetZ,
 245        Signed192 axisX,
 246        Signed192 axisY,
 247        Signed192 axisZ,
 248        Signed192 rotationDenominator,
 249        Fixed64 scale,
 250        out Fixed64 coordinate)
 251    {
 312252        Signed320 projection = WideArithmetic.GetDotProduct3D(
 312253            offsetX,
 312254            offsetY,
 312255            offsetZ,
 312256            axisX,
 312257            axisY,
 312258            axisZ);
 312259        Signed576 numerator = WideArithmetic.MultiplySigned320(
 312260            projection,
 312261            Signed320.ExtendValue(Signed192.One));
 312262        Signed576 denominator = Signed576.ExtendValue(
 312263            WideArithmetic.MultiplySigned192(
 312264                rotationDenominator,
 312265                Signed192.Raw(scale)));
 312266        return Fixed64.TryGetSignedRawRatio(
 312267            numerator,
 312268            denominator,
 312269            out coordinate);
 270    }
 271
 272    private static bool TryComposeScaledLocalCoordinate(
 273        Fixed64 outerLocalPoint,
 274        Fixed64 outerScale,
 275        Signed192 axisX,
 276        Signed192 axisY,
 277        Signed192 axisZ,
 278        Signed192 rotationDenominator,
 279        Signed576 denominator,
 280        Fixed64 innerFrameOffset,
 281        Fixed64 innerFrameScale,
 282        Vector3d innerLocalDisplacement,
 283        out Fixed64 coordinate) =>
 201284        Fixed64.TryGetSignedRawRatio(
 201285            WideRationalBasis3d.GetComposedScaledCoordinateNumerator(
 201286                outerLocalPoint,
 201287                outerScale,
 201288                axisX,
 201289                axisY,
 201290                axisZ,
 201291                rotationDenominator,
 201292                innerFrameOffset,
 201293                innerFrameScale,
 201294                innerLocalDisplacement),
 201295            denominator,
 201296            out coordinate);
 297}