< Summary

Line coverage
100%
Covered lines: 365
Uncovered lines: 0
Coverable lines: 365
Total lines: 601
Line coverage: 100%
Branch coverage
100%
Covered branches: 196
Total branches: 196
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
File 1: .cctor()100%11100%
File 1: TryGetMinimumAxialPoint(...)100%1616100%
File 1: .ctor(...)100%66100%
File 1: GetAxialParameter(...)100%22100%
File 1: TryGetEdgePoint(...)100%2424100%
File 1: Transform(...)100%11100%
File 1: GetEdgeCoefficient(...)100%11100%
File 1: TryGetFacePoint(...)100%2424100%
File 1: TryGetAxisPlaneRatio(...)100%88100%
File 1: ContainsAxisPoint(...)100%44100%
File 1: ContainsStationaryPoint(...)100%44100%
File 1: GetEdgeProducts(...)100%11100%
File 1: WitnessCoordinate(...)100%11100%
File 1: AxisCoordinate(...)100%11100%
File 1: SumProductSign(...)100%66100%
File 1: Ratio(...)100%11100%
File 1: Product(...)100%11100%
File 1: Product(...)100%11100%
File 1: Product(...)100%11100%
File 1: Product(...)100%11100%
File 1: Extend(...)100%11100%
File 1: Narrow(...)100%11100%
File 1: Axis(...)100%11100%
File 1: Raw(...)100%11100%
File 1: Difference(...)100%11100%
File 1: Add(...)100%11100%
File 1: Subtract(...)100%11100%
File 1: Multiply(...)100%11100%
File 1: Dot(...)100%11100%
File 2: TryGetMinimumAxialPoint(...)100%1818100%
File 2: GetScaledConeAxial(...)100%11100%
File 2: GetScaledConeRelativePoint(...)100%11100%
File 2: TryGetScaledConeEdgePoint(...)100%88100%
File 2: BuildScaledConeEdgeCoefficient(...)100%11100%
File 2: TryGetScaledConeFacePoint(...)100%3232100%
File 2: TryGetScaledConeAxisPoint(...)100%1010100%
File 2: TryGetScaledConeStationaryPoint(...)100%1616100%
File 2: ContainsScaledConeFacePoint(...)100%1818100%
File 2: PackScaledCone832(...)100%11100%

File(s)

/home/runner/work/FixedMathSharp/FixedMathSharp/src/FixedMathSharp/Geometry/Wide/FiniteAxis/WideTriangleConeIntersection.cs

#LineLine coverage
 1//=======================================================================
 2// WideTriangleConeIntersection.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 System;
 9
 10namespace FixedMathSharp.Geometry;
 11
 12/// <summary>Exact edge/face minimum-axial reduction in the triangle's authored frame.</summary>
 13internal static partial class WideTriangleConeIntersection
 14{
 115    private static readonly Signed192 Scale = Signed192.Raw(Fixed64.One);
 116    private static readonly Signed192 MaximumParameter = Signed192.Raw(Fixed64.MaxValue);
 17
 18    internal static bool TryGetMinimumAxialPoint(FixedTriangle triangle, Vector3d origin,
 19        FixedQuaternion rotation, Vector3d apex, Vector3d axis, Fixed64 height, Fixed64 radius,
 20        out Vector3d point)
 21    {
 13922        var frame = new QueryFrame(origin, rotation, apex, axis);
 13923        bool found = false;
 13924        point = default;
 13925        Fixed64 bestAxial = Fixed64.MaxValue;
 111226        for (int index = 0; index < 3; index++)
 27        {
 41728            FixedSegment edge = triangle.GetEdge(index);
 41729            if (!frame.TryGetEdgePoint(edge, height, radius, out Vector3d candidate))
 30                continue;
 31            // Equal candidates retain authored AB, BC, CA order after the same
 32            // local-point rounding and cone-parameter projection in either frame.
 9933            Fixed64 axial = frame.GetAxialParameter(candidate, height);
 9934            if (found && axial >= bestAxial)
 35                continue;
 6736            found = true;
 6737            point = candidate;
 6738            bestAxial = axial;
 39        }
 13940        triangle.GetExactNormal(out Signed192 nx, out Signed192 ny, out Signed192 nz, out Signed320 nSquared);
 13941        if (!WideGeometry.IsQ128MagnitudeAtMostEpsilon(nSquared)
 13942            && TryGetFacePoint(triangle, frame, Axis(nx, ny, nz), nSquared, height, radius, found,
 13943                out Vector3d facePoint, out Fixed64 faceAxial)
 13944            && (!found || faceAxial < bestAxial))
 45        {
 6046            found = true;
 6047            point = facePoint;
 48        }
 13949        return found;
 50    }
 51
 52    private readonly struct QueryFrame
 53    {
 54        internal readonly WideAxis3 Apex, Axis;
 55        internal readonly Signed192 Denominator, AxisSquared;
 56        internal readonly bool Compact;
 57        internal readonly Vector3d LocalApex;
 58        private readonly WideRationalBasis3d basis;
 59        private readonly Vector3d origin, worldApex, worldAxis;
 60        private readonly bool identity;
 61
 62        internal QueryFrame(Vector3d origin, FixedQuaternion rotation, Vector3d apex, Vector3d axis)
 63        {
 41764            this.origin = origin; worldApex = apex; worldAxis = axis;
 13965            identity = rotation == FixedQuaternion.Identity;
 13966            basis = identity ? default : new WideRationalBasis3d(rotation);
 13967            Vector3d localApex = default;
 13968            Compact = identity && Vector3d.TrySubtract(apex, origin, out localApex);
 13969            LocalApex = localApex;
 13970            AxisSquared = Signed192.NarrowProven(Dot(Raw(axis), Raw(axis)));
 13971            if (identity)
 72            {
 11573                Denominator = Signed192.Signed(1);
 11574                Apex = Difference(apex, origin);
 11575                Axis = Raw(axis);
 11576                return;
 77            }
 2478            WideOrientedBox.GetRelativeLocalPointNumerators(apex, origin, basis,
 2479                out Signed192 ax, out Signed192 ay, out Signed192 az);
 2480            WideOrientedBox.GetRelativeLocalPointNumerators(axis, Vector3d.Zero, basis,
 2481                out Signed192 dx, out Signed192 dy, out Signed192 dz);
 2482            Span<Signed320> values = stackalloc Signed320[7]
 2483            {
 2484                Signed320.ExtendValue(basis.Denominator), Signed320.ExtendValue(ax),
 2485                Signed320.ExtendValue(ay), Signed320.ExtendValue(az), Signed320.ExtendValue(dx),
 2486                Signed320.ExtendValue(dy), Signed320.ExtendValue(dz)
 2487            };
 2488            WideArithmetic.ReduceCommonScale(values);
 2489            Denominator = Signed192.NarrowProven(values[0]);
 2490            Apex = new WideAxis3(values[1], values[2], values[3]);
 2491            Axis = new WideAxis3(values[4], values[5], values[6]);
 2492        }
 93
 94        internal Fixed64 GetAxialParameter(Vector3d point, Fixed64 height)
 95        {
 9996            if (Compact)
 8697                return FixedMath.Min(Vector3d.ProjectNonNegativeDifferenceParameter(point, LocalApex, worldAxis), height
 98
 99            // Compare the same nearest-even cone parameter as face candidates,
 100            // not a floored dot: an admitted unit axis need not have exact length 1.
 13101            Signed320 numerator = Dot(Subtract(Multiply(Raw(point), Denominator), Apex), Axis);
 13102            Signed320 denominator = Signed320.NarrowValue(WideArithmetic.MultiplySigned576(
 13103                Signed576.ExtendValue(WideArithmetic.MultiplySigned192(AxisSquared, Denominator)), Denominator));
 13104            return FixedMath.Clamp(Fixed64.GetSignedRatio(numerator, denominator), Fixed64.Zero, height);
 105        }
 106
 107        internal bool TryGetEdgePoint(FixedSegment edge, Fixed64 height, Fixed64 radius, out Vector3d point)
 108        {
 109            // Only an exact translation qualifies for the compact segment path.
 110            // Rounded rotation or saturating origin subtraction cannot do so.
 417111            if (Compact)
 342112                return edge.TryGetFiniteConeIntersectionMinimumAxialPoint(LocalApex, worldAxis, height, radius, out poin
 113
 114            WideAxis3 start, delta;
 115            Signed192 denominator;
 75116            if (identity)
 117            {
 3118                start = Subtract(Raw(edge.Start), Apex);
 3119                delta = Difference(edge.End, edge.Start);
 3120                denominator = Signed192.Signed(1);
 121            }
 122            else
 123            {
 72124                WideAxis3 offset = Difference(origin, worldApex);
 72125                start = Add(Transform(edge.Start), Multiply(offset, basis.Denominator));
 72126                WideAxis3 localDelta = Difference(edge.End, edge.Start);
 72127                delta = WideRigidProjection.TransformLocalAxis(basis, Narrow(localDelta.X), Narrow(localDelta.Y), Narrow
 72128                denominator = basis.Denominator;
 129            }
 75130            Signed192 startProjection = Signed192.NarrowProven(Dot(start, Raw(worldAxis)));
 75131            Signed192 velocityProjection = Signed192.NarrowProven(Dot(delta, Raw(worldAxis)));
 75132            Signed320 startAxial = WideArithmetic.MultiplySigned192(startProjection, Scale);
 75133            Signed320 velocity = WideArithmetic.MultiplySigned192(velocityProjection, Scale);
 75134            Signed320 maximum = Signed320.NarrowValue(WideArithmetic.MultiplySigned576(
 75135                Signed576.ExtendValue(WideArithmetic.MultiplySigned192(AxisSquared, Signed192.Raw(height))), denominator
 300136            Signed320 lowerN = default, lowerD = Signed320.ExtendValue(Signed192.Signed(1)), upperN = Signed320.ExtendVa
 75137            if (velocity.IsZero)
 138            {
 22139                if (startAxial.Sign < 0 || WideArithmetic.SubtractSigned320(startAxial, maximum).Sign > 0)
 32140                { point = default; return false; }
 141            }
 142            else
 143            {
 53144                Signed320 first = WideArithmetic.Negate(startAxial);
 53145                Signed320 second = WideArithmetic.SubtractSigned320(maximum, startAxial);
 53146                Signed320 divisor = velocity;
 53147                if (velocity.Sign < 0)
 148                {
 27149                    (first, second) = (WideArithmetic.Negate(second), WideArithmetic.Negate(first));
 27150                    divisor = WideArithmetic.Negate(divisor);
 151                }
 53152                if (second.Sign < 0 || WideArithmetic.SubtractSigned320(first, divisor).Sign > 0)
 28153                { point = default; return false; }
 89154                if (first.Sign > 0) { lowerN = first; lowerD = divisor; }
 89155                if (WideArithmetic.SubtractSigned320(second, divisor).Sign < 0) { upperN = second; upperD = divisor; }
 156            }
 45157            Signed576 a = GetEdgeCoefficient(Dot(delta, delta), velocityProjection, velocityProjection, AxisSquared, hei
 45158            Signed576 b = GetEdgeCoefficient(Dot(start, delta), startProjection, velocityProjection, AxisSquared, height
 45159            Signed576 c = GetEdgeCoefficient(Dot(start, start), startProjection, startProjection, AxisSquared, height, r
 45160            if (!WideFiniteConeIntersection.TrySolveBoundedUnitPolynomial(
 45161                    Signed832.ExtendValue(a), Signed832.ExtendValue(b), Signed832.ExtendValue(c),
 45162                    lowerN, lowerD, upperN, upperD, Fixed64.MaxValue, out Fixed64 entry, out Fixed64 exit))
 64163            { point = default; return false; }
 13164            point = edge.GetPointAtDistance(velocity.Sign < 0 ? exit : entry, Fixed64.MaxValue);
 13165            return true;
 166        }
 167
 72168        private WideAxis3 Transform(Vector3d point) => WideRigidProjection.TransformLocalAxis(basis,
 72169            Signed192.Raw(point.X), Signed192.Raw(point.Y), Signed192.Raw(point.Z));
 170    }
 171
 172    private static Signed576 GetEdgeCoefficient(Signed320 squared, Signed192 first, Signed192 second,
 173        Signed192 q, Fixed64 height, Fixed64 radius)
 174    {
 175        // For P(t)=start+t*delta and q=axis.axis, radial distance is
 176        // (q*P.P-(P.axis)^2)/q. Keep t's axial clipping separate and expand
 177        // H²*q*(q*P.P-(P.axis)^2)-R²*Q²*(P.axis)^2 <= 0 exactly.
 178        // P and E have <133 bits, their axial dots <168. After retaining the
 179        // common rigid denominator, cone coefficients still fit below 530 bits.
 135180        Signed576 axial = WideArithmetic.MultiplySigned320(Signed320.ExtendValue(first), Signed320.ExtendValue(second));
 135181        Signed576 radial = WideArithmetic.SubtractSigned576(
 135182            WideArithmetic.MultiplySigned576(Signed576.ExtendValue(squared), q), axial);
 135183        return WideArithmetic.SubtractSigned576(
 135184            WideArithmetic.MultiplySigned576(radial, q, Signed192.Raw(height), Signed192.Raw(height)),
 135185            WideArithmetic.MultiplySigned576(axial, Scale, Scale, Signed192.Raw(radius), Signed192.Raw(radius)));
 186    }
 187
 188    private static bool TryGetFacePoint(FixedTriangle triangle, in QueryFrame frame, WideAxis3 normal,
 189        Signed320 normalSquared, Fixed64 height, Fixed64 radius, bool hasEdge,
 190        out Vector3d point, out Fixed64 axial)
 191    {
 272192        point = default; axial = default;
 193        // The plane is n.(X-apex)=c/D and its axial slope is b/D.
 194        // p=|n|²*|axisNumerator|²-b² is the squared radial plane normal.
 195        // At each axial parameter the stationary radial point is the first
 196        // place that plane's cone section can touch the triangle interior.
 136197        Signed320 b = Dot(normal, frame.Axis);
 136198        Signed320 c = Dot(normal, Subtract(Multiply(Raw(triangle.A), frame.Denominator), frame.Apex));
 136199        Signed320 qScaled = Signed320.NarrowValue(WideArithmetic.MultiplySigned576(
 136200            Signed576.ExtendValue(WideArithmetic.MultiplySigned192(frame.AxisSquared, frame.Denominator)), frame.Denomin
 136201        Signed576 p = WideArithmetic.SubtractSigned576(WideArithmetic.MultiplySigned320(normalSquared, qScaled),
 136202            WideArithmetic.MultiplySigned320(b, b));
 136203        bool crossesAxis = TryGetAxisPlaneRatio(b, c, height, out Signed320 axisN, out Signed320 axisD);
 136204        if (p.IsZero)
 205        {
 24206            if (hasEdge || !crossesAxis || !ContainsAxisPoint(triangle, normal, frame, axisN, axisD))
 17207                return false;
 7208            point = new Vector3d(AxisCoordinate(frame.Apex.X, frame.Axis.X, frame.Denominator, axisN, axisD),
 7209                AxisCoordinate(frame.Apex.Y, frame.Axis.Y, frame.Denominator, axisN, axisD),
 7210                AxisCoordinate(frame.Apex.Z, frame.Axis.Z, frame.Denominator, axisN, axisD));
 7211            axial = Ratio(WideArithmetic.MultiplySigned832(Extend(axisN), Scale), Extend(axisD));
 7212            return true;
 213        }
 214        // n<130, b<230, c<263, p<460 bits. Cancel the common D² from
 215        // the polynomial before multiplying: coefficients then need <660 bits.
 112216        Signed832 coefficient = WideArithmetic.SubtractSigned832(
 112217            Product(WideArithmetic.MultiplySigned320(b, b), frame.AxisSquared, Signed192.Raw(height), Signed192.Raw(heig
 112218            Product(p, Signed192.Raw(radius), Signed192.Raw(radius), Scale, Scale));
 112219        Signed832 projection = WideArithmetic.SubtractSigned832(default,
 112220            Product(WideArithmetic.MultiplySigned320(b, c), frame.AxisSquared, Scale, Signed192.Raw(height)));
 112221        Signed832 constant = Product(WideArithmetic.MultiplySigned320(c, c), frame.AxisSquared, Scale, Scale);
 112222        if (!WideFiniteConeIntersection.TrySolveBoundedUnitPolynomial(coefficient, projection, constant,
 112223                default, Signed320.ExtendValue(Signed192.Signed(1)), Signed320.ExtendValue(Signed192.Signed(1)), Signed3
 25224            return false;
 225        bool contained;
 87226        if (!hasEdge)
 36227            contained = crossesAxis ? ContainsAxisPoint(triangle, normal, frame, axisN, axisD)
 36228                : ContainsStationaryPoint(triangle, normal, normalSquared, frame, b, c, p, height, Fixed64.MaxValue);
 229        else
 230        {
 51231            int sign = WideFiniteConeIntersection.GetPolynomialSignAtRationalParameter(coefficient, projection, constant
 51232                Signed320.ExtendValue(Signed192.Raw(entry)), Signed320.ExtendValue(MaximumParameter));
 51233            Fixed64 lower = sign < 0 ? Fixed64.FromRaw(entry.m_rawValue - 1) : entry;
 51234            Fixed64 upper = sign > 0 ? Fixed64.FromRaw(entry.m_rawValue + 1) : entry;
 51235            contained = ContainsStationaryPoint(triangle, normal, normalSquared, frame, b, c, p, height, lower)
 51236                && (lower == upper || ContainsStationaryPoint(triangle, normal, normalSquared, frame, b, c, p, height, u
 237        }
 117238        if (!contained) return false;
 57239        point = new Vector3d(WitnessCoordinate(frame.Apex.X, frame.Axis.X, normal.X, frame.Denominator, qScaled, b, c, p
 57240            WitnessCoordinate(frame.Apex.Y, frame.Axis.Y, normal.Y, frame.Denominator, qScaled, b, c, p, height, entry),
 57241            WitnessCoordinate(frame.Apex.Z, frame.Axis.Z, normal.Z, frame.Denominator, qScaled, b, c, p, height, entry))
 57242        axial = Fixed64.GetSignedRawRatio(WideArithmetic.MultiplySigned192(Signed192.Raw(height), Signed192.Raw(entry)),
 57243        return true;
 244    }
 245
 246    private static bool TryGetAxisPlaneRatio(Signed320 b, Signed320 c, Fixed64 height, out Signed320 numerator, out Sign
 247    {
 136248        denominator = b.Sign < 0 ? WideArithmetic.Negate(b) : b;
 136249        numerator = b.Sign < 0 ? WideArithmetic.Negate(c) : c;
 136250        return !b.IsZero && numerator.Sign >= 0 && WideArithmetic.SubtractSigned576(
 136251            WideArithmetic.MultiplySigned576(Signed576.ExtendValue(numerator), Scale),
 136252            WideArithmetic.MultiplySigned576(Signed576.ExtendValue(denominator), Signed192.Raw(height))).Sign <= 0;
 253    }
 254
 255    private static bool ContainsAxisPoint(FixedTriangle triangle, WideAxis3 normal, in QueryFrame frame, Signed320 numer
 256    {
 156257        for (int index = 0; index < 3; index++)
 258        {
 63259            GetEdgeProducts(triangle.GetEdge(index), normal, frame, out Signed576 h, out Signed576 l);
 63260            if (SumProductSign(Extend(denominator), h, Extend(numerator), l) < 0)
 8261                return false;
 262        }
 15263        return true;
 264    }
 265
 266    private static bool ContainsStationaryPoint(FixedTriangle triangle, WideAxis3 normal, Signed320 normalSquared,
 267        in QueryFrame frame, Signed320 b, Signed320 c, Signed576 p, Fixed64 height, Fixed64 parameter)
 268    {
 105269        Signed832 originScale = Product(p, MaximumParameter, Scale);
 105270        Signed832 axisScale = WideArithmetic.SubtractSigned832(
 105271            Product(Signed576.ExtendValue(normalSquared), frame.AxisSquared, Signed192.Raw(height), Signed192.Raw(parame
 105272            Product(WideArithmetic.MultiplySigned320(b, c), MaximumParameter, Scale));
 724273        for (int index = 0; index < 3; index++)
 274        {
 284275            GetEdgeProducts(triangle.GetEdge(index), normal, frame, out Signed576 h, out Signed576 l);
 276            // These halfspace products can exceed 832 bits; compare magnitudes
 277            // in existing transient product storage rather than truncating.
 284278            if (SumProductSign(originScale, h, axisScale, l) < 0)
 27279                return false;
 280        }
 78281        return true;
 282    }
 283
 284    private static void GetEdgeProducts(FixedSegment edge, WideAxis3 normal, in QueryFrame frame, out Signed576 h, out S
 285    {
 347286        WideAxis3 inward = WideAxis3.Cross(normal, Difference(edge.End, edge.Start));
 347287        h = WideAxis3.Dot(inward, Subtract(frame.Apex, Multiply(Raw(edge.Start), frame.Denominator)));
 347288        l = WideAxis3.Dot(inward, frame.Axis);
 347289    }
 290
 291    private static Fixed64 WitnessCoordinate(Signed320 apex, Signed320 axis, Signed320 normal, Signed192 denominator,
 292        Signed320 q, Signed320 b, Signed320 c, Signed576 p, Fixed64 height, Fixed64 parameter)
 293    {
 171294        Signed576 v = WideArithmetic.SubtractSigned576(WideArithmetic.MultiplySigned320(q, normal), WideArithmetic.Multi
 171295        Signed832 w = WideArithmetic.SubtractSigned832(WideArithmetic.MultiplySigned576ToSigned832(p, axis),
 171296            WideArithmetic.MultiplySigned576ToSigned832(v, b));
 171297        Signed832 first = WideArithmetic.AddSigned832(WideArithmetic.MultiplySigned576ToSigned832(p, apex),
 171298            WideArithmetic.MultiplySigned576ToSigned832(v, c));
 171299        first = WideArithmetic.MultiplySigned832(WideArithmetic.MultiplySigned832(first, MaximumParameter), Scale);
 171300        Signed832 second = WideArithmetic.MultiplySigned832(WideArithmetic.MultiplySigned832(w, Signed192.Raw(height)), 
 171301        return Ratio(WideArithmetic.AddSigned832(first, second), Product(p, denominator, MaximumParameter, Scale));
 302    }
 303
 304    private static Fixed64 AxisCoordinate(Signed320 apex, Signed320 axis, Signed192 frameD, Signed320 numerator, Signed3
 21305        Ratio(Signed832.ExtendValue(WideArithmetic.AddSigned576(WideArithmetic.MultiplySigned320(apex, denominator),
 21306            WideArithmetic.MultiplySigned320(axis, numerator))),
 21307            WideArithmetic.MultiplySigned832(Extend(denominator), frameD));
 308
 309    private static int SumProductSign(Signed832 a, Signed576 b, Signed832 c, Signed576 d)
 310    {
 694311        int first = a.Sign * b.Sign, second = c.Sign * d.Sign;
 361312        if (first == 0) return second;
 473313        if (second == 0 || first == second) return first;
 193314        return first * WideArithmetic.CompareNonNegativeProducts(a, Signed832.ExtendValue(b), c, Signed832.ExtendValue(d
 315    }
 316
 317    private static Fixed64 Ratio(Signed832 numerator, Signed832 denominator)
 318    {
 199319        bool represented = Fixed64.TryGetSignedRawRatio(numerator, denominator, 0, out Fixed64 value);
 320        System.Diagnostics.Debug.Assert(represented);
 199321        return value;
 322    }
 323
 324    private static Signed832 Product(Signed576 value, Signed192 a, Signed192 b) =>
 934325        WideArithmetic.MultiplySigned832(WideArithmetic.MultiplySigned832(Signed832.ExtendValue(value), a), b);
 326    private static Signed832 Product(Signed576 value, Signed192 a, Signed192 b, Signed192 c) =>
 724327        WideArithmetic.MultiplySigned832(Product(value, a, b), c);
 328    private static Signed832 Product(Signed576 value, Signed192 a, Signed192 b, Signed192 c, Signed192 d) =>
 217329        WideArithmetic.MultiplySigned832(Product(value, a, b, c), d);
 330    private static Signed832 Product(Signed576 value, Signed192 a, Signed192 b, Signed192 c, Signed192 d, Signed192 e) =
 105331        WideArithmetic.MultiplySigned832(Product(value, a, b, c, d), e);
 161332    private static Signed832 Extend(Signed320 value) => Signed832.ExtendValue(Signed576.ExtendValue(value));
 1920333    private static Signed192 Narrow(Signed320 value) => Signed192.NarrowProven(value);
 1787334    private static WideAxis3 Axis(Signed192 x, Signed192 y, Signed192 z) => new(Signed320.ExtendValue(x), Signed320.Exte
 1042335    private static WideAxis3 Raw(Vector3d value) => Axis(Signed192.Raw(value.X), Signed192.Raw(value.Y), Signed192.Raw(v
 609336    private static WideAxis3 Difference(Vector3d a, Vector3d b) => Axis(WideArithmetic.Difference(a.X, b.X), WideArithme
 72337    private static WideAxis3 Add(WideAxis3 a, WideAxis3 b) => new(WideArithmetic.AddSigned320(a.X, b.X), WideArithmetic.
 499338    private static WideAxis3 Subtract(WideAxis3 a, WideAxis3 b) => new(WideArithmetic.SubtractSigned320(a.X, b.X), WideA
 568339    private static WideAxis3 Multiply(WideAxis3 value, Signed192 scale) => new(WideArithmetic.MultiplySigned192(Narrow(v
 709340    private static Signed320 Dot(WideAxis3 a, WideAxis3 b) => Signed320.NarrowValue(WideAxis3.Dot(a, b));
 341}

/home/runner/work/FixedMathSharp/FixedMathSharp/src/FixedMathSharp/Geometry/Wide/FiniteAxis/WideTriangleConeIntersection.ScaledFrame.cs

#LineLine coverage
 1//=======================================================================
 2// WideTriangleConeIntersection.ScaledFrame.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 System;
 9
 10namespace FixedMathSharp.Geometry;
 11
 12/// <content>Exact source-frame ingress for finite triangle/cone minimum-axial queries.</content>
 13internal static partial class WideTriangleConeIntersection
 14{
 15    private const int ScaledQueryWords = 32;
 16
 17    internal static bool TryGetMinimumAxialPoint(in FixedTriangle triangle, in ScaledRigidFrame3d frame,
 18        Vector3d apex, Vector3d axis, Fixed64 height, Fixed64 radius,
 19        out FixedPointAnchor point)
 20    {
 3021        if (frame.IsRigid)
 22        {
 223            bool found = TryGetMinimumAxialPoint(triangle,frame.RigidOrigin,frame.Rotation,apex,axis,height,radius,out V
 224            point = found ? new FixedPointAnchor(frame.RigidOrigin,frame.Rotation,local) : default;
 225            return found;
 26        }
 8427        bool hasPoint=false;point=default;Fixed64 best=Fixed64.MaxValue;
 22428        for(int edge=0;edge<3;edge++)
 29        {
 8430            if(!TryGetScaledConeEdgePoint(triangle.GetEdge(edge),frame,apex,axis,height,radius,out FixedPointAnchor cand
 2731            Fixed64 axial=GetScaledConeAxial(candidate,apex,axis,height);
 2732            if(hasPoint&&axial>=best)continue;
 4533            hasPoint=true;point=candidate;best=axial;
 34        }
 2835        if(TryGetScaledConeFacePoint(triangle,frame,apex,axis,height,radius,hasPoint,out FixedPointAnchor face,out Fixed
 4036            &&(!hasPoint||faceAxial<best)){point=face;hasPoint=true;}
 2837        return hasPoint;
 38    }
 39
 40    private static Fixed64 GetScaledConeAxial(in FixedPointAnchor point,Vector3d apex,Vector3d axis,Fixed64 height) =>
 2741        FixedMath.Min(point.ProjectNonNegativeOffsetFrom(new FixedPointAnchor(apex,FixedQuaternion.Identity,Vector3d.Zer
 42
 27343    private static WideDirection3d GetScaledConeRelativePoint(in RationalPoint3d point,Vector3d apex) => new(
 27344        WideArithmetic.SubtractSigned576(Signed576.ExtendValue(point.X),WideArithmetic.MultiplySigned320(point.Denominat
 27345        WideArithmetic.SubtractSigned576(Signed576.ExtendValue(point.Y),WideArithmetic.MultiplySigned320(point.Denominat
 27346        WideArithmetic.SubtractSigned576(Signed576.ExtendValue(point.Z),WideArithmetic.MultiplySigned320(point.Denominat
 47
 48    private static bool TryGetScaledConeEdgePoint(in FixedSegment edge,in ScaledRigidFrame3d frame,
 49        Vector3d apex,Vector3d axis,Fixed64 height,Fixed64 radius,out FixedPointAnchor point)
 50    {
 8451        point=default;
 8452        WideDirection3d first=GetScaledConeRelativePoint(frame.GetPoint(edge.Start),apex);
 8453        WideDirection3d last=GetScaledConeRelativePoint(frame.GetPoint(edge.End),apex);
 8454        WideDirection3d delta=new(WideArithmetic.SubtractSigned576(last.X,first.X),
 8455            WideArithmetic.SubtractSigned576(last.Y,first.Y),WideArithmetic.SubtractSigned576(last.Z,first.Z));
 8456        var direction=new WideDirection3d(new WideAxis3(Signed320.ExtendValue(Signed192.Raw(axis.X)),
 8457            Signed320.ExtendValue(Signed192.Raw(axis.Y)),Signed320.ExtendValue(Signed192.Raw(axis.Z))));
 25258        Signed832 q=direction.SquaredLength, startAxial=WideDirection3d.Dot(first,direction), velocity=WideDirection3d.D
 16859        Signed832 start=WideArithmetic.MultiplySigned832(startAxial,Scale), end=WideArithmetic.MultiplySigned832(WideAri
 8460        Signed832 maximum=default;
 61        // The denominator may exceed192 after independent placement rotations.
 62        // Keep the complete product in the borrowed coefficient bank below.
 63        const int words=ScaledQueryWords;
 16864        Span<ulong> values=stackalloc ulong[14*words];Span<int> signs=stackalloc int[14];
 16865        var a=ContactQuadratic.At(values,signs,0,words);var b=ContactQuadratic.At(values,signs,1,words);
 16866        var c=ContactQuadratic.At(values,signs,2,words);var work=ContactQuadratic.At(values,signs,3,words);
 16867        var term=ContactQuadratic.At(values,signs,4,words);var axial=ContactQuadratic.At(values,signs,5,words);
 8468        var radial=ContactQuadratic.At(values,signs,6,words);
 16869        work.Set(q);ContactQuadratic.Scale(work,Signed576.ExtendValue(frame.Denominator),term);
 8470        ContactQuadratic.Scale(term,Signed576.ExtendValue(Signed192.Raw(height)),work);
 8471        maximum=PackScaledCone832(work);
 33672        Signed832 lowerN=default,lowerD=Signed832.ExtendValue(Signed192.One),upperN=lowerD,upperD=lowerD;
 8473        if(!WideTriangleRelations.ClipScaledHalfPlane(start,end,ref lowerN,ref lowerD,ref upperN,ref upperD)
 8474            ||!WideTriangleRelations.ClipScaledHalfPlane(WideArithmetic.SubtractSigned832(maximum,start),
 10175                WideArithmetic.SubtractSigned832(maximum,end),ref lowerN,ref lowerD,ref upperN,ref upperD))return false;
 6776        BuildScaledConeEdgeCoefficient(delta,delta,velocity,velocity,q,height,radius,a,work,term,axial,radial);
 6777        BuildScaledConeEdgeCoefficient(first,delta,startAxial,velocity,q,height,radius,b,work,term,axial,radial);
 6778        BuildScaledConeEdgeCoefficient(first,first,startAxial,startAxial,q,height,radius,c,work,term,axial,radial);
 6779        if(!WideFiniteConeIntersection.TrySolveBoundedUnitPolynomial(a,b,c,lowerN,lowerD,upperN,upperD,
 10580            Fixed64.MaxValue,out Fixed64 entry,out Fixed64 exit))return false;
 2981        Fixed64 parameter=velocity.Sign<0?exit:entry;
 5882        work.Set(Signed576.ExtendValue(Signed192.Raw(parameter)));term.Set(Signed576.ExtendValue(MaximumParameter));
 2983        return WideTriangleRelations.TryGetSegmentPointAnchor(frame,edge,work,term,apex,out point);
 84    }
 85
 86    private static void BuildScaledConeEdgeCoefficient(in WideDirection3d first,in WideDirection3d second,
 87        Signed832 firstAxial,Signed832 secondAxial,Signed832 q,Fixed64 height,Fixed64 radius,
 88        scoped ContactQuadratic output,scoped ContactQuadratic work,scoped ContactQuadratic term,
 89        scoped ContactQuadratic axial,scoped ContactQuadratic radial)
 90    {
 40291        work.Set(firstAxial);ContactQuadratic.Scale(work,secondAxial,axial);
 60392        work.Set(WideDirection3d.Dot(first,second));ContactQuadratic.Scale(work,q,radial);radial.Add(axial,-1);
 40293        ContactQuadratic.Scale(radial,q,work);ContactQuadratic.Scale(work,Signed576.ExtendValue(Signed192.Raw(height)),t
 20194        ContactQuadratic.Scale(term,Signed576.ExtendValue(Signed192.Raw(height)),output);
 40295        ContactQuadratic.Scale(axial,Signed576.ExtendValue(Scale),work);ContactQuadratic.Scale(work,Signed576.ExtendValu
 20196        ContactQuadratic.Scale(term,Signed576.ExtendValue(Signed192.Raw(radius)),work);
 40297        ContactQuadratic.Scale(work,Signed576.ExtendValue(Signed192.Raw(radius)),term);output.Add(term,-1);
 20198    }
 99
 100    private static bool TryGetScaledConeFacePoint(in FixedTriangle triangle,in ScaledRigidFrame3d frame,
 101        Vector3d apex,Vector3d axis,Fixed64 height,Fixed64 radius,bool hasEdge,
 102        out FixedPointAnchor point,out Fixed64 axial)
 103    {
 56104        point=default;axial=default;
 28105        WideDirection3d normal=WideTriangleRelations.GetScaledTriangleLocalNormal(triangle,frame).Transform(frame.Geomet
 29106        if(normal.IsZero)return false;
 27107        var direction=new WideDirection3d(new WideAxis3(Signed320.ExtendValue(Signed192.Raw(axis.X)),
 27108            Signed320.ExtendValue(Signed192.Raw(axis.Y)),Signed320.ExtendValue(Signed192.Raw(axis.Z))));
 54109        Signed832 normalSquare=normal.SquaredLength,alignment=WideDirection3d.Dot(normal,direction);
 27110        Signed832 plane=WideDirection3d.Dot(normal,GetScaledConeRelativePoint(frame.GetPoint(triangle.A),apex));
 27111        Signed832 q=direction.SquaredLength;
 112        const int words=ScaledQueryWords;
 54113        Span<ulong> values=stackalloc ulong[18*words];Span<int> signs=stackalloc int[18];
 54114        var a=ContactQuadratic.At(values,signs,0,words);var b=ContactQuadratic.At(values,signs,1,words);
 54115        var c=ContactQuadratic.At(values,signs,2,words);var p=ContactQuadratic.At(values,signs,3,words);
 54116        var work=ContactQuadratic.At(values,signs,4,words);var term=ContactQuadratic.At(values,signs,5,words);
 54117        var axisN=ContactQuadratic.At(values,signs,6,words);var axisD=ContactQuadratic.At(values,signs,7,words);
 27118        var ratio=ContactQuadratic.At(values,signs,8,words);
 54119        work.Set(normalSquare);ContactQuadratic.Scale(work,q,p);
 81120        work.Set(alignment);ContactQuadratic.Scale(work,alignment,term);p.Add(term,-1);
 81121        axisN.Set(plane);ContactQuadratic.Scale(axisN,Signed576.ExtendValue(Scale),work);work.CopyTo(axisN);
 54122        axisD.Set(alignment);ContactQuadratic.Scale(axisD,Signed576.ExtendValue(frame.Denominator),work);
 27123        ContactQuadratic.Scale(work,Signed576.ExtendValue(Signed192.Raw(height)),axisD);
 45124        if(axisD.Signs[0]<0){axisN.MultiplySign(-1);axisD.MultiplySign(-1);}
 27125        bool crossesAxis=axisD.Signs[0]!=0&&axisN.Signs[0]>=0
 27126            &&WideArithmetic.CompareMagnitudeEqualLength(axisN.Rational,axisD.Rational)<=0;
 27127        if(p.Signs[0]==0)
 128        {
 18129            if(hasEdge||!crossesAxis)return false;
 6130            return TryGetScaledConeAxisPoint(triangle,frame,apex,axis,alignment,plane,true,out point,out axial);
 131        }
 45132        work.Set(alignment);ContactQuadratic.Scale(work,alignment,term);ContactQuadratic.Scale(term,q,a);
 15133        ContactQuadratic.Scale(a,Signed576.ExtendValue(Signed192.Raw(height)),work);
 15134        ContactQuadratic.Scale(work,Signed576.ExtendValue(Signed192.Raw(height)),a);
 15135        ContactQuadratic.Scale(p,Signed576.ExtendValue(Signed192.Raw(radius)),work);
 15136        ContactQuadratic.Scale(work,Signed576.ExtendValue(Signed192.Raw(radius)),term);
 45137        ContactQuadratic.Scale(term,Signed576.ExtendValue(Scale),work);ContactQuadratic.Scale(work,Signed576.ExtendValue
 30138        ContactQuadratic.Scale(a,Signed576.ExtendValue(frame.Denominator),work);ContactQuadratic.Scale(work,Signed576.Ex
 45139        work.Set(alignment);ContactQuadratic.Scale(work,plane,term);ContactQuadratic.Scale(term,q,b);
 30140        ContactQuadratic.Scale(b,Signed576.ExtendValue(Scale),work);ContactQuadratic.Scale(work,Signed576.ExtendValue(Si
 30141        ContactQuadratic.Scale(term,Signed576.ExtendValue(frame.Denominator),b);b.MultiplySign(-1);
 45142        work.Set(plane);ContactQuadratic.Scale(work,plane,term);ContactQuadratic.Scale(term,q,c);
 30143        ContactQuadratic.Scale(c,Signed576.ExtendValue(Scale),work);ContactQuadratic.Scale(work,Signed576.ExtendValue(Sc
 15144        Signed832 one=Signed832.ExtendValue(Signed192.One);
 17145        if(!WideFiniteConeIntersection.TrySolveBoundedUnitPolynomial(a,b,c,default,one,one,one,Fixed64.MaxValue,out Fixe
 13146        Signed832 pValue=PackScaledCone832(p);
 147        bool contained;
 13148        if(!hasEdge)
 149        {
 4150            contained=crossesAxis
 4151                ?TryGetScaledConeAxisPoint(triangle,frame,apex,axis,alignment,plane,false,out _,out _)
 4152                :TryGetScaledConeStationaryPoint(triangle,frame,apex,axis,normal,normalSquare,alignment,plane,pValue,q,h
 153        }
 154        else
 155        {
 9156            int sign=WideFiniteConeIntersection.GetBorrowedPolynomialSignAtRationalParameter(a,b,c,
 9157                Signed832.ExtendValue(Signed192.Raw(entry)),Signed832.ExtendValue(MaximumParameter));
 9158            Fixed64 lower=sign<0?Fixed64.FromRaw(entry.m_rawValue-1):entry;
 9159            Fixed64 upper=sign>0?Fixed64.FromRaw(entry.m_rawValue+1):entry;
 9160            contained=TryGetScaledConeStationaryPoint(triangle,frame,apex,axis,normal,normalSquare,alignment,plane,pValu
 9161                &&(lower==upper||TryGetScaledConeStationaryPoint(triangle,frame,apex,axis,normal,normalSquare,alignment,
 162        }
 21163        if(!contained||!TryGetScaledConeStationaryPoint(triangle,frame,apex,axis,normal,normalSquare,alignment,plane,pVa
 10164        work.Set(Signed576.ExtendValue(Signed192.Raw(height)));ContactQuadratic.Scale(work,Signed576.ExtendValue(Signed1
 5165        work.Set(Signed576.ExtendValue(MaximumParameter));
 5166        axial=ContactQuadratic.RoundRatio(ratio,work,ReadOnlySpan<ulong>.Empty,0,height.m_rawValue);
 5167        return true;
 168    }
 169
 170    private static bool TryGetScaledConeAxisPoint(in FixedTriangle triangle,in ScaledRigidFrame3d frame,
 171        Vector3d apex,Vector3d axis,Signed832 alignment,Signed832 plane,bool materialize,
 172        out FixedPointAnchor point,out Fixed64 axial)
 173    {
 174        const int words=ScaledQueryWords;
 14175        Span<ulong> values=stackalloc ulong[10*words];Span<int> signs=stackalloc int[10];
 14176        var x=ContactQuadratic.At(values,signs,0,words);var y=ContactQuadratic.At(values,signs,1,words);
 14177        var z=ContactQuadratic.At(values,signs,2,words);var d=ContactQuadratic.At(values,signs,3,words);
 7178        var work=ContactQuadratic.At(values,signs,4,words);
 14179        work.Set(plane);ContactQuadratic.Scale(work,Signed576.ExtendValue(Signed192.Raw(axis.X)),x);
 7180        ContactQuadratic.Scale(work,Signed576.ExtendValue(Signed192.Raw(axis.Y)),y);
 7181        ContactQuadratic.Scale(work,Signed576.ExtendValue(Signed192.Raw(axis.Z)),z);
 14182        work.Set(alignment);ContactQuadratic.Scale(work,Signed576.ExtendValue(frame.Denominator),d);
 19183        if(d.Signs[0]<0){d.MultiplySign(-1);x.MultiplySign(-1);y.MultiplySign(-1);z.MultiplySign(-1);}
 14184        point=default;axial=default;
 9185        if(!ContainsScaledConeFacePoint(triangle,frame,apex,x,y,z,d))return false;
 6186        if(!materialize)return true;
 5187        if(!QuadraticPointMaterialization.TryGetPointInFrame(apex,FixedQuaternion.Identity,x,y,z,d,ReadOnlySpan<ulong>.E
 3188        point=new FixedPointAnchor(apex,FixedQuaternion.Identity,local);
 6189        work.Set(plane);ContactQuadratic.Scale(work,Signed576.ExtendValue(Scale),x);
 4190        if(alignment.Sign<0)x.MultiplySign(-1);
 3191        axial=ContactQuadratic.RoundRatio(x,d,ReadOnlySpan<ulong>.Empty,0,long.MaxValue);
 3192        return true;
 193    }
 194
 195    private static bool TryGetScaledConeStationaryPoint(in FixedTriangle triangle,in ScaledRigidFrame3d frame,
 196        Vector3d apex,Vector3d axis,in WideDirection3d normal,Signed832 normalSquare,Signed832 alignment,
 197        Signed832 plane,Signed832 p,Signed832 q,Fixed64 height,Fixed64 parameter,bool materialize,out FixedPointAnchor p
 198    {
 199        const int words=ScaledQueryWords;
 44200        Span<ulong> values=stackalloc ulong[16*words];Span<int> signs=stackalloc int[16];
 44201        var x=ContactQuadratic.At(values,signs,0,words);var y=ContactQuadratic.At(values,signs,1,words);
 44202        var z=ContactQuadratic.At(values,signs,2,words);var d=ContactQuadratic.At(values,signs,3,words);
 44203        var work=ContactQuadratic.At(values,signs,4,words);var term=ContactQuadratic.At(values,signs,5,words);
 44204        var w=ContactQuadratic.At(values,signs,6,words);var v=ContactQuadratic.At(values,signs,7,words);
 44205        work.Set(p);ContactQuadratic.Scale(work,Signed576.ExtendValue(frame.Denominator),term);
 44206        ContactQuadratic.Scale(term,Signed576.ExtendValue(Scale),work);ContactQuadratic.Scale(work,Signed576.ExtendValue
 176207        for(int coordinate=0;coordinate<3;coordinate++)
 208        {
 66209            var output=coordinate==0?x:coordinate==1?y:z;
 66210            Signed576 n=coordinate==0?normal.X:coordinate==1?normal.Y:normal.Z;
 132211            work.Set(normalSquare);ContactQuadratic.Scale(work,Signed576.ExtendValue(Signed192.Raw(axis[coordinate])),w)
 198212            work.Set(alignment);ContactQuadratic.Scale(work,n,term);w.Add(term,-1);
 132213            work.Set(q);ContactQuadratic.Scale(work,n,v);
 198214            work.Set(alignment);ContactQuadratic.Scale(work,Signed576.ExtendValue(Signed192.Raw(axis[coordinate])),term)
 132215            ContactQuadratic.Scale(w,q,work);ContactQuadratic.Scale(work,Signed576.ExtendValue(Signed192.Raw(height)),te
 132216            ContactQuadratic.Scale(term,Signed576.ExtendValue(frame.Denominator),work);ContactQuadratic.Scale(work,Signe
 132217            ContactQuadratic.Scale(v,plane,work);ContactQuadratic.Scale(work,Signed576.ExtendValue(Scale),term);
 132218            ContactQuadratic.Scale(term,Signed576.ExtendValue(MaximumParameter),work);output.Add(work);
 219        }
 22220        point=default;
 29221        if(!ContainsScaledConeFacePoint(triangle,frame,apex,x,y,z,d))return false;
 24222        if(!materialize)return true;
 7223        if(!QuadraticPointMaterialization.TryGetPointInFrame(apex,FixedQuaternion.Identity,x,y,z,d,ReadOnlySpan<ulong>.E
 10224        point=new FixedPointAnchor(apex,FixedQuaternion.Identity,local);return true;
 225    }
 226
 227    private static bool ContainsScaledConeFacePoint(in FixedTriangle triangle,in ScaledRigidFrame3d frame,Vector3d apex,
 228        scoped ContactQuadratic x,scoped ContactQuadratic y,scoped ContactQuadratic z,scoped ContactQuadratic denominato
 229    {
 230        const int words=ScaledQueryWords;
 58231        Span<ulong> values=stackalloc ulong[8*words];Span<int> signs=stackalloc int[8];
 58232        var sum=ContactQuadratic.At(values,signs,0,words);var delta=ContactQuadratic.At(values,signs,1,words);
 58233        var term=ContactQuadratic.At(values,signs,2,words);var product=ContactQuadratic.At(values,signs,3,words);
 29234        WideDirection3d normal=WideTriangleRelations.GetScaledTriangleLocalNormal(triangle,frame);
 196235        for(int edge=0;edge<3;edge++)
 236        {
 78237            FixedSegment segment=triangle.GetEdge(edge);
 78238            WideDirection3d inward=WideDirection3d.Cross(normal,WideDirection3d.GetLocalEdge(frame,segment.Start,segment
 156239            WideDirection3d start=GetScaledConeRelativePoint(frame.GetPoint(segment.Start),apex);sum.Clear();
 624240            for(int coordinate=0;coordinate<3;coordinate++)
 241            {
 234242                var point=coordinate==0?x:coordinate==1?y:z;
 234243                ContactQuadratic.Scale(point,Signed576.ExtendValue(frame.Denominator),delta);
 468244                ContactQuadratic.Scale(denominator,coordinate==0?start.X:coordinate==1?start.Y:start.Z,term);delta.Add(t
 468245                ContactQuadratic.Scale(delta,coordinate==0?inward.X:coordinate==1?inward.Y:inward.Z,product);sum.Add(pro
 246            }
 87247            if(sum.Signs[0]<0)return false;
 248        }
 20249        return true;
 250    }
 251
 252    private static Signed832 PackScaledCone832(scoped ContactQuadratic value)
 253    {
 254        // Both callers pack nonnegative values: the positive axial cap and
 255        // the Gram minor |normal|²|axis|²-(normal.axis)².
 256        System.Diagnostics.Debug.Assert(value.Signs[0]>=0);
 291257        Span<ulong> data=stackalloc ulong[13];data.Clear();value.Rational[..WideArithmetic.GetActiveMagnitudeLength(valu
 97258        return new Signed832(data[12],data[11],data[10],data[9],data[8],data[7],data[6],data[5],data[4],data[3],data[2],
 259    }
 260}

Methods/Properties

.cctor()
TryGetMinimumAxialPoint(FixedMathSharp.Geometry.FixedTriangle,FixedMathSharp.Vector3d,FixedMathSharp.FixedQuaternion,FixedMathSharp.Vector3d,FixedMathSharp.Vector3d,FixedMathSharp.Fixed64,FixedMathSharp.Fixed64,FixedMathSharp.Vector3d&)
.ctor(FixedMathSharp.Vector3d,FixedMathSharp.FixedQuaternion,FixedMathSharp.Vector3d,FixedMathSharp.Vector3d)
GetAxialParameter(FixedMathSharp.Vector3d,FixedMathSharp.Fixed64)
TryGetEdgePoint(FixedMathSharp.Geometry.FixedSegment,FixedMathSharp.Fixed64,FixedMathSharp.Fixed64,FixedMathSharp.Vector3d&)
Transform(FixedMathSharp.Vector3d)
GetEdgeCoefficient(FixedMathSharp.Signed320,FixedMathSharp.Signed192,FixedMathSharp.Signed192,FixedMathSharp.Signed192,FixedMathSharp.Fixed64,FixedMathSharp.Fixed64)
TryGetFacePoint(FixedMathSharp.Geometry.FixedTriangle,FixedMathSharp.Geometry.WideTriangleConeIntersection/QueryFrame&,FixedMathSharp.Geometry.WideAxis3,FixedMathSharp.Signed320,FixedMathSharp.Fixed64,FixedMathSharp.Fixed64,System.Boolean,FixedMathSharp.Vector3d&,FixedMathSharp.Fixed64&)
TryGetAxisPlaneRatio(FixedMathSharp.Signed320,FixedMathSharp.Signed320,FixedMathSharp.Fixed64,FixedMathSharp.Signed320&,FixedMathSharp.Signed320&)
ContainsAxisPoint(FixedMathSharp.Geometry.FixedTriangle,FixedMathSharp.Geometry.WideAxis3,FixedMathSharp.Geometry.WideTriangleConeIntersection/QueryFrame&,FixedMathSharp.Signed320,FixedMathSharp.Signed320)
ContainsStationaryPoint(FixedMathSharp.Geometry.FixedTriangle,FixedMathSharp.Geometry.WideAxis3,FixedMathSharp.Signed320,FixedMathSharp.Geometry.WideTriangleConeIntersection/QueryFrame&,FixedMathSharp.Signed320,FixedMathSharp.Signed320,FixedMathSharp.Signed576,FixedMathSharp.Fixed64,FixedMathSharp.Fixed64)
GetEdgeProducts(FixedMathSharp.Geometry.FixedSegment,FixedMathSharp.Geometry.WideAxis3,FixedMathSharp.Geometry.WideTriangleConeIntersection/QueryFrame&,FixedMathSharp.Signed576&,FixedMathSharp.Signed576&)
WitnessCoordinate(FixedMathSharp.Signed320,FixedMathSharp.Signed320,FixedMathSharp.Signed320,FixedMathSharp.Signed192,FixedMathSharp.Signed320,FixedMathSharp.Signed320,FixedMathSharp.Signed320,FixedMathSharp.Signed576,FixedMathSharp.Fixed64,FixedMathSharp.Fixed64)
AxisCoordinate(FixedMathSharp.Signed320,FixedMathSharp.Signed320,FixedMathSharp.Signed192,FixedMathSharp.Signed320,FixedMathSharp.Signed320)
SumProductSign(FixedMathSharp.Signed832,FixedMathSharp.Signed576,FixedMathSharp.Signed832,FixedMathSharp.Signed576)
Ratio(FixedMathSharp.Signed832,FixedMathSharp.Signed832)
Product(FixedMathSharp.Signed576,FixedMathSharp.Signed192,FixedMathSharp.Signed192)
Product(FixedMathSharp.Signed576,FixedMathSharp.Signed192,FixedMathSharp.Signed192,FixedMathSharp.Signed192)
Product(FixedMathSharp.Signed576,FixedMathSharp.Signed192,FixedMathSharp.Signed192,FixedMathSharp.Signed192,FixedMathSharp.Signed192)
Product(FixedMathSharp.Signed576,FixedMathSharp.Signed192,FixedMathSharp.Signed192,FixedMathSharp.Signed192,FixedMathSharp.Signed192,FixedMathSharp.Signed192)
Extend(FixedMathSharp.Signed320)
Narrow(FixedMathSharp.Signed320)
Axis(FixedMathSharp.Signed192,FixedMathSharp.Signed192,FixedMathSharp.Signed192)
Raw(FixedMathSharp.Vector3d)
Difference(FixedMathSharp.Vector3d,FixedMathSharp.Vector3d)
Add(FixedMathSharp.Geometry.WideAxis3,FixedMathSharp.Geometry.WideAxis3)
Subtract(FixedMathSharp.Geometry.WideAxis3,FixedMathSharp.Geometry.WideAxis3)
Multiply(FixedMathSharp.Geometry.WideAxis3,FixedMathSharp.Signed192)
Dot(FixedMathSharp.Geometry.WideAxis3,FixedMathSharp.Geometry.WideAxis3)
TryGetMinimumAxialPoint(FixedMathSharp.Geometry.FixedTriangle&,FixedMathSharp.Geometry.ScaledRigidFrame3d&,FixedMathSharp.Vector3d,FixedMathSharp.Vector3d,FixedMathSharp.Fixed64,FixedMathSharp.Fixed64,FixedMathSharp.Geometry.FixedPointAnchor&)
GetScaledConeAxial(FixedMathSharp.Geometry.FixedPointAnchor&,FixedMathSharp.Vector3d,FixedMathSharp.Vector3d,FixedMathSharp.Fixed64)
GetScaledConeRelativePoint(FixedMathSharp.Geometry.RationalPoint3d&,FixedMathSharp.Vector3d)
TryGetScaledConeEdgePoint(FixedMathSharp.Geometry.FixedSegment&,FixedMathSharp.Geometry.ScaledRigidFrame3d&,FixedMathSharp.Vector3d,FixedMathSharp.Vector3d,FixedMathSharp.Fixed64,FixedMathSharp.Fixed64,FixedMathSharp.Geometry.FixedPointAnchor&)
BuildScaledConeEdgeCoefficient(FixedMathSharp.Geometry.WideDirection3d&,FixedMathSharp.Geometry.WideDirection3d&,FixedMathSharp.Signed832,FixedMathSharp.Signed832,FixedMathSharp.Signed832,FixedMathSharp.Fixed64,FixedMathSharp.Fixed64,FixedMathSharp.Geometry.ContactQuadratic,FixedMathSharp.Geometry.ContactQuadratic,FixedMathSharp.Geometry.ContactQuadratic,FixedMathSharp.Geometry.ContactQuadratic,FixedMathSharp.Geometry.ContactQuadratic)
TryGetScaledConeFacePoint(FixedMathSharp.Geometry.FixedTriangle&,FixedMathSharp.Geometry.ScaledRigidFrame3d&,FixedMathSharp.Vector3d,FixedMathSharp.Vector3d,FixedMathSharp.Fixed64,FixedMathSharp.Fixed64,System.Boolean,FixedMathSharp.Geometry.FixedPointAnchor&,FixedMathSharp.Fixed64&)
TryGetScaledConeAxisPoint(FixedMathSharp.Geometry.FixedTriangle&,FixedMathSharp.Geometry.ScaledRigidFrame3d&,FixedMathSharp.Vector3d,FixedMathSharp.Vector3d,FixedMathSharp.Signed832,FixedMathSharp.Signed832,System.Boolean,FixedMathSharp.Geometry.FixedPointAnchor&,FixedMathSharp.Fixed64&)
TryGetScaledConeStationaryPoint(FixedMathSharp.Geometry.FixedTriangle&,FixedMathSharp.Geometry.ScaledRigidFrame3d&,FixedMathSharp.Vector3d,FixedMathSharp.Vector3d,FixedMathSharp.Geometry.WideDirection3d&,FixedMathSharp.Signed832,FixedMathSharp.Signed832,FixedMathSharp.Signed832,FixedMathSharp.Signed832,FixedMathSharp.Signed832,FixedMathSharp.Fixed64,FixedMathSharp.Fixed64,System.Boolean,FixedMathSharp.Geometry.FixedPointAnchor&)
ContainsScaledConeFacePoint(FixedMathSharp.Geometry.FixedTriangle&,FixedMathSharp.Geometry.ScaledRigidFrame3d&,FixedMathSharp.Vector3d,FixedMathSharp.Geometry.ContactQuadratic,FixedMathSharp.Geometry.ContactQuadratic,FixedMathSharp.Geometry.ContactQuadratic,FixedMathSharp.Geometry.ContactQuadratic)
PackScaledCone832(FixedMathSharp.Geometry.ContactQuadratic)