ClipperLib.Int128.Int128Mul C# (CSharp) Method

Int128Mul() public static method

public static Int128Mul ( System.Int64 lhs, System.Int64 rhs ) : Int128
lhs System.Int64
rhs System.Int64
return Int128
        public static Int128 Int128Mul(Int64 lhs, Int64 rhs)
        {
            bool negate = (lhs < 0) != (rhs < 0);
            if (lhs < 0) lhs = -lhs;
            if (rhs < 0) rhs = -rhs;
            UInt64 int1Hi = (UInt64)lhs >> 32;
            UInt64 int1Lo = (UInt64)lhs & 0xFFFFFFFF;
            UInt64 int2Hi = (UInt64)rhs >> 32;
            UInt64 int2Lo = (UInt64)rhs & 0xFFFFFFFF;

            //nb: see comments in clipper.pas
            UInt64 a = int1Hi * int2Hi;
            UInt64 b = int1Lo * int2Lo;
            UInt64 c = int1Hi * int2Lo + int1Lo * int2Hi;

            UInt64 lo;
            Int64 hi;
            hi = (Int64)(a + (c >> 32));

            unchecked { lo = (c << 32) + b; }
            if (lo < b) hi++;
            Int128 result = new Int128(hi, lo);
            return negate ? -result : result;
        }

Usage Example

 internal static bool SlopesEqual(TEdge e1, TEdge e2, bool UseFullRange)
 {
     if (UseFullRange)
     {
         return(Int128.Int128Mul(e1.Delta.Y, e2.Delta.X) == Int128.Int128Mul(e1.Delta.X, e2.Delta.Y));
     }
     return(e1.Delta.Y * e2.Delta.X == e1.Delta.X * e2.Delta.Y);
 }
All Usage Examples Of ClipperLib.Int128::Int128Mul