< 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    {
 22180        WideRationalBasis3d basis = new(rotation);
 22181        Signed192 offsetX = WideArithmetic.SubtractSigned192(
 22182            Signed192.Raw(worldPoint.X),
 22183            Signed192.Raw(origin.X));
 22184        Signed192 offsetY = WideArithmetic.SubtractSigned192(
 22185            Signed192.Raw(worldPoint.Y),
 22186            Signed192.Raw(origin.Y));
 22187        Signed192 offsetZ = WideArithmetic.SubtractSigned192(
 22188            Signed192.Raw(worldPoint.Z),
 22189            Signed192.Raw(origin.Z));
 22190        bool representable = TryInverseTransformScaledCoordinate(
 22191                offsetX,
 22192                offsetY,
 22193                offsetZ,
 22194                basis.Xx,
 22195                basis.Xy,
 22196                basis.Xz,
 22197                basis.Denominator,
 22198                scale.X,
 22199                out Fixed64 x)
 221100            & TryInverseTransformScaledCoordinate(
 221101                offsetX,
 221102                offsetY,
 221103                offsetZ,
 221104                basis.Yx,
 221105                basis.Yy,
 221106                basis.Yz,
 221107                basis.Denominator,
 221108                scale.Y,
 221109                out Fixed64 y)
 221110            & TryInverseTransformScaledCoordinate(
 221111                offsetX,
 221112                offsetY,
 221113                offsetZ,
 221114                basis.Zx,
 221115                basis.Zy,
 221116                basis.Zz,
 221117                basis.Denominator,
 221118                scale.Z,
 221119                out Fixed64 z);
 221120        if (!representable)
 121        {
 1122            localPoint = default;
 1123            return false;
 124        }
 125
 220126        localPoint = new Vector3d(x, y, z);
 220127        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    {
 663252        Signed320 projection = WideArithmetic.GetDotProduct3D(
 663253            offsetX,
 663254            offsetY,
 663255            offsetZ,
 663256            axisX,
 663257            axisY,
 663258            axisZ);
 663259        Signed576 numerator = WideArithmetic.MultiplySigned320(
 663260            projection,
 663261            Signed320.ExtendValue(Signed192.One));
 663262        Signed576 denominator = Signed576.ExtendValue(
 663263            WideArithmetic.MultiplySigned192(
 663264                rotationDenominator,
 663265                Signed192.Raw(scale)));
 663266        return Fixed64.TryGetSignedRawRatio(
 663267            numerator,
 663268            denominator,
 663269            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}