コード例 #1
0
        internal Direction(
            IAlgebraicNumberCalculator <TAlgebraicNumber> calculator,
            TAlgebraicNumber x,
            TAlgebraicNumber y)
        {
            if (calculator is null)
            {
                throw new ArgumentNullException(nameof(calculator));
            }

            if (x is null)
            {
                throw new ArgumentNullException(nameof(x));
            }

            if (y is null)
            {
                throw new ArgumentNullException(nameof(y));
            }

            if (calculator.IsZero(x) && calculator.IsZero(y))
            {
                throw new ArgumentException(
                          "Both components of the direction cannot be simultaneously zero.",
                          nameof(y));
            }

            _calculator = calculator;

            X = x;
            Y = y;
        }
コード例 #2
0
        public ConvolutionFactory(IAlgebraicNumberCalculator <TAlgebraicNumber> algebraicNumberCalculator)
        {
            AlgebraicNumberCalculator = algebraicNumberCalculator
                                        ?? throw new ArgumentNullException(nameof(algebraicNumberCalculator));

            Zero = algebraicNumberCalculator.FromInt(0);

            One = algebraicNumberCalculator.FromInt(1);
        }
コード例 #3
0
        public static bool IsZero <TAlgebraicNumber>(
            this IAlgebraicNumberCalculator <TAlgebraicNumber> calculator,
            TAlgebraicNumber number)
        {
            if (calculator is null)
            {
                throw new ArgumentNullException(nameof(calculator));
            }

            return(calculator.Sign(number) == 0);
        }
コード例 #4
0
        public static TAlgebraicNumber Max <TAlgebraicNumber>(
            this IAlgebraicNumberCalculator <TAlgebraicNumber> calculator,
            TAlgebraicNumber first,
            TAlgebraicNumber second)
        {
            if (calculator is null)
            {
                throw new ArgumentNullException(nameof(calculator));
            }

            return(calculator.IsStrictlySmallerThan(first, second) ? second : first);
        }
コード例 #5
0
        public static bool IsStrictlySmallerThan <TAlgebraicNumber>(
            this IAlgebraicNumberCalculator <TAlgebraicNumber> calculator,
            TAlgebraicNumber number1,
            TAlgebraicNumber number2)
        {
            if (calculator is null)
            {
                throw new ArgumentNullException(nameof(calculator));
            }

            return(calculator.IsStrictlyPositive(calculator.Subtract(number2, number1)));
        }
コード例 #6
0
        public static bool AreEqual <TAlgebraicNumber>(
            this IAlgebraicNumberCalculator <TAlgebraicNumber> calculator,
            TAlgebraicNumber number1,
            TAlgebraicNumber number2)
        {
            if (calculator is null)
            {
                throw new ArgumentNullException(nameof(calculator));
            }

            return(calculator.IsZero(calculator.Subtract(number2, number1)));
        }
コード例 #7
0
        public static TAlgebraicNumber Abs <TAlgebraicNumber>(
            this IAlgebraicNumberCalculator <TAlgebraicNumber> calculator,
            TAlgebraicNumber number)
        {
            if (calculator is null)
            {
                throw new ArgumentNullException(nameof(calculator));
            }

            return(calculator.IsStrictlyNegative(number)
                ? calculator.Opposite(number)
                : number);
        }
コード例 #8
0
 internal Segment(
     IAlgebraicNumberCalculator <TAlgebraicNumber> calculator,
     Point <TAlgebraicNumber> start,
     Point <TAlgebraicNumber> end,
     Direction <TAlgebraicNumber> startTangentDirection,
     Direction <TAlgebraicNumber> endTangentDirection,
     Fraction weight)
     : base(calculator, start, end, startTangentDirection, endTangentDirection, weight)
 {
     NormalDirection = new Direction <TAlgebraicNumber>(
         Calculator,
         Calculator.Opposite(startTangentDirection.Y),
         startTangentDirection.X);
 }
コード例 #9
0
 protected Tracing(
     IAlgebraicNumberCalculator <TAlgebraicNumber> calculator,
     Point <TAlgebraicNumber> start,
     Point <TAlgebraicNumber> end,
     Direction <TAlgebraicNumber> startTangentDirection,
     Direction <TAlgebraicNumber> endTangentDirection,
     Fraction weight)
 {
     Calculator            = calculator ?? throw new ArgumentNullException(nameof(start));
     Start                 = start ?? throw new ArgumentNullException(nameof(start));
     End                   = end ?? throw new ArgumentNullException(nameof(end));
     StartTangentDirection = startTangentDirection ?? throw new ArgumentNullException(nameof(startTangentDirection));
     EndTangentDirection   = endTangentDirection ?? throw new ArgumentNullException(nameof(endTangentDirection));
     Weight                = weight;
 }
コード例 #10
0
        public static bool AreClose <TAlgebraicNumber>(
            this IAlgebraicNumberCalculator <TAlgebraicNumber> calculator,
            TAlgebraicNumber number1,
            TAlgebraicNumber number2,
            TAlgebraicNumber tolerance)
        {
            if (calculator is null)
            {
                throw new ArgumentNullException(nameof(calculator));
            }

            var absoluteDifference = calculator.Abs(calculator.Subtract(number2, number1));

            return(calculator.IsSmallerThan(absoluteDifference, tolerance));
        }
コード例 #11
0
 internal Arc(
     IAlgebraicNumberCalculator <TAlgebraicNumber> calculator,
     Point <TAlgebraicNumber> center,
     DirectionRange <TAlgebraicNumber> directions,
     TAlgebraicNumber radius,
     Point <TAlgebraicNumber> start,
     Point <TAlgebraicNumber> end,
     Direction <TAlgebraicNumber> startTangentDirection,
     Direction <TAlgebraicNumber> endTangentDirection,
     Fraction weight)
     : base(calculator, start, end, startTangentDirection, endTangentDirection, weight)
 {
     Center     = center ?? throw new ArgumentNullException(nameof(center));
     Directions = directions ?? throw new ArgumentNullException(nameof(directions));
     Radius     = radius ?? throw new ArgumentNullException(nameof(radius));
 }
コード例 #12
0
        internal DirectionRange(
            IAlgebraicNumberCalculator <TAlgebraicNumber> calculator,
            Direction <TAlgebraicNumber> start,
            Direction <TAlgebraicNumber> end,
            Orientation orientation)
        {
            _calculator = calculator ?? throw new ArgumentNullException(nameof(calculator));

            Start = start ?? throw new ArgumentNullException(nameof(start));

            End = end ?? throw new ArgumentNullException(nameof(end));

            if (!Enum.IsDefined(typeof(Orientation), orientation))
            {
                throw new InvalidEnumArgumentException(
                          nameof(orientation),
                          (int)orientation,
                          typeof(Orientation));
            }

            Orientation = orientation;
        }
コード例 #13
0
        public void SetUp()
        {
            var factory = new ConvolutionFactory();

            _calculator = factory.AlgebraicNumberCalculator;
        }
コード例 #14
0
 public void SetUp() => _calculator = new DoubleAlgebraicNumberCalculator(zeroTolerance: 1e-10);
コード例 #15
0
 public void SetUp()
 {
     _calculator = new DoubleAlgebraicNumberCalculator();
     _subject    = new Point <double>(_calculator, x: 3.5, y: 10.7);
 }
コード例 #16
0
 internal Point(IAlgebraicNumberCalculator <TAlgebraicNumber> calculator, TAlgebraicNumber x, TAlgebraicNumber y)
 {
     _calculator = calculator ?? throw new ArgumentNullException(nameof(calculator));
     X           = x ?? throw new ArgumentNullException(nameof(x));
     Y           = y ?? throw new ArgumentNullException(nameof(y));
 }
コード例 #17
0
     this IAlgebraicNumberCalculator <TAlgebraicNumber> calculator,
     TAlgebraicNumber first,
     TAlgebraicNumber second)
 {
     if (calculator is null)