public static void GeometricCenter_Returns_GeometricCenter_of_Extents()
        {
            PointExtents extents = new PointExtents(
                new List <CartesianCoordinate>()
            {
                new CartesianCoordinate(1, 2),
                new CartesianCoordinate(3, 5),
                new CartesianCoordinate(2, 6),
                new CartesianCoordinate(0, 4),
                new CartesianCoordinate(1.5, -2),
                new CartesianCoordinate(5, 4),
                new CartesianCoordinate(1, 7.5),
                new CartesianCoordinate(3.5, -1)
            });

            Assert.AreEqual(0, extents.MinX);
            Assert.AreEqual(5, extents.MaxX);
            Assert.AreEqual(-2, extents.MinY);
            Assert.AreEqual(7.5, extents.MaxY);
            Assert.AreEqual(5, extents.Width);
            Assert.AreEqual(9.5, extents.Height);

            CartesianCoordinate geometricCenter = extents.GeometricCenter();

            Assert.AreEqual(2.5, geometricCenter.X);
            Assert.AreEqual(2.75, geometricCenter.Y);
        }
        public static void Translate_Returns_Translated_Copy_of_Extents()
        {
            PointExtents extents = new PointExtents(
                new List <CartesianCoordinate>()
            {
                new CartesianCoordinate(1, 2),
                new CartesianCoordinate(3, 5),
                new CartesianCoordinate(2, 6),
                new CartesianCoordinate(0, 4),
                new CartesianCoordinate(1.5, -2),
                new CartesianCoordinate(5, 4),
                new CartesianCoordinate(1, 7),
                new CartesianCoordinate(3.5, -1)
            });

            Assert.AreEqual(0, extents.MinX);
            Assert.AreEqual(5, extents.MaxX);
            Assert.AreEqual(-2, extents.MinY);
            Assert.AreEqual(7, extents.MaxY);
            Assert.AreEqual(5, extents.Width);
            Assert.AreEqual(9, extents.Height);

            PointExtents translatedExtents = extents.Translate(3, 4) as PointExtents;

            Assert.AreEqual(3, translatedExtents.MinX);
            Assert.AreEqual(8, translatedExtents.MaxX);
            Assert.AreEqual(2, translatedExtents.MinY);
            Assert.AreEqual(11, translatedExtents.MaxY);
            Assert.AreEqual(5, translatedExtents.Width);
            Assert.AreEqual(9, translatedExtents.Height);
        }
        public static void Clone_Returns_Copy_of_Extents()
        {
            PointExtents extents = new PointExtents(
                new List <CartesianCoordinate>()
            {
                new CartesianCoordinate(1, 2),
                new CartesianCoordinate(3, 5),
                new CartesianCoordinate(2, 6),
                new CartesianCoordinate(0, 4),
                new CartesianCoordinate(1.5, -2),
                new CartesianCoordinate(5, 4),
                new CartesianCoordinate(1, 7),
                new CartesianCoordinate(3.5, -1)
            });

            Assert.AreEqual(0, extents.MinX);
            Assert.AreEqual(5, extents.MaxX);
            Assert.AreEqual(-2, extents.MinY);
            Assert.AreEqual(7, extents.MaxY);
            Assert.AreEqual(5, extents.Width);
            Assert.AreEqual(9, extents.Height);

            PointExtents extentsClone = extents.Clone();

            Assert.AreEqual(0, extentsClone.MinX);
            Assert.AreEqual(5, extentsClone.MaxX);
            Assert.AreEqual(-2, extentsClone.MinY);
            Assert.AreEqual(7, extentsClone.MaxY);
            Assert.AreEqual(5, extentsClone.Width);
            Assert.AreEqual(9, extentsClone.Height);
        }
        public static void Extents_Returns_Extents_of_Boundary()
        {
            List <CartesianCoordinate> coordinates = new List <CartesianCoordinate>()
            {
                new CartesianCoordinate(0, 0),
                new CartesianCoordinate(1, 2),
                new CartesianCoordinate(3, 4),
                new CartesianCoordinate(5, 6)
            };

            List <LineSegment> segments = new List <LineSegment>()
            {
                new LineSegment(coordinates[0], coordinates[1]),
                new LineSegment(coordinates[1], coordinates[2]),
                new LineSegment(coordinates[2], coordinates[3])
            };

            SegmentsBoundary boundary = new SegmentsBoundary(segments);

            Assert.IsTrue(boundary.IsReadOnly);
            Assert.AreEqual(3, boundary.Count);

            PointExtents extents = boundary.Extents() as PointExtents;

            Assert.AreEqual(0, extents.MinX);
            Assert.AreEqual(0, extents.MinY);
            Assert.AreEqual(5, extents.MaxX);
            Assert.AreEqual(6, extents.MaxY);
        }
        public static void Clear_Clears_Extents()
        {
            PointExtents extents = new PointExtents(
                new List <CartesianCoordinate>()
            {
                new CartesianCoordinate(1, 2),
                new CartesianCoordinate(3, 5),
                new CartesianCoordinate(2, 6),
                new CartesianCoordinate(0, 4),
                new CartesianCoordinate(1.5, -2),
                new CartesianCoordinate(5, 4),
                new CartesianCoordinate(1, 7),
                new CartesianCoordinate(3.5, -1)
            });

            Assert.AreEqual(0, extents.MinX);
            Assert.AreEqual(5, extents.MaxX);
            Assert.AreEqual(-2, extents.MinY);
            Assert.AreEqual(7, extents.MaxY);
            Assert.AreEqual(5, extents.Width);
            Assert.AreEqual(9, extents.Height);

            extents.Clear();
            Assert.AreEqual(double.NegativeInfinity, extents.MinX);
            Assert.AreEqual(double.PositiveInfinity, extents.MaxX);
            Assert.AreEqual(double.NegativeInfinity, extents.MinY);
            Assert.AreEqual(double.PositiveInfinity, extents.MaxY);
            Assert.AreEqual(double.PositiveInfinity, extents.Width);
            Assert.AreEqual(double.PositiveInfinity, extents.Height);
        }
 /// <summary>
 /// Initializes the segment to span between the provided points.
 /// </summary>
 /// <param name="i">First point of the line.</param>
 /// <param name="j">Second point of the line.</param>
 protected PathSegment(CartesianCoordinate i, CartesianCoordinate j)
 {
     i.Tolerance = _tolerance;
     j.Tolerance = _tolerance;
     I           = i;
     J           = j;
     _extents    = new PointExtents(i, j);
 }
예제 #7
0
        /// <summary>
        /// Determines if the point lies below the segment extents end.
        /// </summary>
        /// <param name="yPtN">The y-coordinate of pt n.</param>
        /// <param name="segment">The segment.</param>
        /// <returns><c>true</c> if the point lies to below the segment bottom, <c>false</c> otherwise.</returns>
        public static bool PointIsBelowSegmentExtentsExclusive(
            double yPtN,
            IPathSegment segment)
        {
            PointExtents extents = segment.Extents;

            return(yPtN < extents.MaxY);
        }
예제 #8
0
        /// <summary>
        /// Determines if the point lies within the segment extents width.
        /// </summary>
        /// <param name="xPtN">The x-coordinate of pt n.</param>
        /// <param name="segment">The segment.</param>
        /// <returns><c>true</c> if the point lies within the segment width, <c>false</c> otherwise.</returns>
        public static bool PointIsWithinSegmentExtentsWidthExclusive(
            double xPtN,
            IPathSegment segment)
        {
            PointExtents extents = segment.Extents;

            return(extents.MinX < xPtN && xPtN < extents.MaxX);
        }
예제 #9
0
        /// <summary>
        /// Determines if the point lies within the segment extents height, not including the boundary locations.
        /// </summary>
        /// <param name="yPtN">The y-coordinate of pt n.</param>
        /// <param name="segment">The segment.</param>
        /// <returns><c>true</c> if the point lies within the segment extents height, <c>false</c> otherwise.</returns>
        public static bool PointIsWithinSegmentExtentsHeightExclusive(
            double yPtN,
            IPathSegment segment)
        {
            PointExtents extents = segment.Extents;

            return(extents.MinY < yPtN && yPtN < extents.MaxY);
        }
예제 #10
0
        /// <summary>
        /// Determines if the point lies to the left of the segment extents max x-coordinate, not including the boundary coordinate.
        /// </summary>
        /// <param name="xPtN">The x-coordinate of pt n.</param>
        /// <param name="segment">The segment.</param>
        /// <returns><c>true</c> if the point lies to the left of the segment end, <c>false</c> otherwise.</returns>
        public static bool PointIsLeftOfSegmentExtentsEndExclusive(
            double xPtN,
            IPathSegment segment)
        {
            PointExtents extents = segment.Extents;

            return(xPtN < extents.MaxX);
        }
        public static void Extents()
        {
            Polygon      polygon      = new Polygon(bowTieNonCrossingSegments);
            PointExtents pointExtents = polygon.Extents();

            Assert.AreEqual(0, pointExtents.MinX);
            Assert.AreEqual(2, pointExtents.MaxX);
            Assert.AreEqual(1, pointExtents.MinY);
            Assert.AreEqual(3, pointExtents.MaxY);
        }
        public static void Initialization_without_Coordinates_Results_in_Empty_Object()
        {
            PointExtents extents = new PointExtents();

            Assert.AreEqual(double.PositiveInfinity, extents.MaxY);
            Assert.AreEqual(double.PositiveInfinity, extents.MaxX);
            Assert.AreEqual(double.NegativeInfinity, extents.MinY);
            Assert.AreEqual(double.NegativeInfinity, extents.MinX);
            Assert.AreEqual(double.PositiveInfinity, extents.Width);
            Assert.AreEqual(double.PositiveInfinity, extents.Height);
        }
        public static void Initialization_with_Empty_Coordinates_List()
        {
            PointExtents extents = new PointExtents(new List <CartesianCoordinate>());

            Assert.AreEqual(double.NegativeInfinity, extents.MinX);
            Assert.AreEqual(double.PositiveInfinity, extents.MaxX);
            Assert.AreEqual(double.NegativeInfinity, extents.MinY);
            Assert.AreEqual(double.PositiveInfinity, extents.MaxY);
            Assert.AreEqual(double.PositiveInfinity, extents.Width);
            Assert.AreEqual(double.PositiveInfinity, extents.Height);
        }
        public static void Initialization_with_2_Coordinates_Results_Object()
        {
            PointExtents extents = new PointExtents(
                new CartesianCoordinate(1, 2),
                new CartesianCoordinate(3, 5)
                );

            Assert.AreEqual(1, extents.MinX);
            Assert.AreEqual(3, extents.MaxX);
            Assert.AreEqual(2, extents.MinY);
            Assert.AreEqual(5, extents.MaxY);
            Assert.AreEqual(2, extents.Width);
            Assert.AreEqual(3, extents.Height);
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="ElasticBendingProperties"/> class.
        /// </summary>
        /// <param name="extents">The extents.</param>
        /// <param name="centroid">The centroid.</param>
        /// <param name="rotationalInertia">The rotational inertia.</param>
        public ElasticBendingProperties(PointExtents extents, CartesianCoordinate centroid, MomentOfInertia rotationalInertia)
        {
            PointExtents extentsAlignedAtCentroid = CalculateExtentsAlignedAtCentroid(extents, centroid);

            Extents_33positive = NMath.Abs(extentsAlignedAtCentroid.MaxX);
            Extents_33negative = NMath.Abs(extentsAlignedAtCentroid.MinX);
            Extents_22positive = NMath.Abs(extentsAlignedAtCentroid.MaxY);
            Extents_22negative = NMath.Abs(extentsAlignedAtCentroid.MinY);

            S_22positive = CalculateElasticModulus(rotationalInertia.I_22, Extents_33positive);
            S_22negative = CalculateElasticModulus(rotationalInertia.I_22, Extents_33negative);
            S_33positive = CalculateElasticModulus(rotationalInertia.I_33, Extents_22positive);
            S_33negative = CalculateElasticModulus(rotationalInertia.I_33, Extents_22negative);
        }
        public static void Initialization_with_2_Collinear_Coordinates_Horizontal_List()
        {
            PointExtents extents = new PointExtents(
                new List <CartesianCoordinate>()
            {
                new CartesianCoordinate(1, 2),
                new CartesianCoordinate(2, 2)
            });

            Assert.AreEqual(1, extents.MinX);
            Assert.AreEqual(2, extents.MaxX);
            Assert.AreEqual(2, extents.MinY);
            Assert.AreEqual(2, extents.MaxY);
            Assert.AreEqual(1, extents.Width);
            Assert.AreEqual(0, extents.Height);
        }
예제 #17
0
        public static void Extents_Returns_Extends_of_Boundary()
        {
            List <CartesianCoordinate> coordinates = new List <CartesianCoordinate>()
            {
                new CartesianCoordinate(0, 0),
                new CartesianCoordinate(1, 2),
                new CartesianCoordinate(3, 4),
                new CartesianCoordinate(5, 6)
            };

            PointBoundary boundary = new PointBoundary(coordinates);

            PointExtents extents = boundary.Extents() as PointExtents;

            Assert.AreEqual(0, extents.MinX);
            Assert.AreEqual(0, extents.MinY);
            Assert.AreEqual(5, extents.MaxX);
            Assert.AreEqual(6, extents.MaxY);
        }
        public static void IsWithinExtents_Returns_True_if_Point_is_within_Extents_False_otherwise()
        {
            PointExtents extents = new PointExtents(
                new List <CartesianCoordinate>()
            {
                new CartesianCoordinate(1, 2),
                new CartesianCoordinate(3, 5),
                new CartesianCoordinate(2, 6),
                new CartesianCoordinate(0, 4),
                new CartesianCoordinate(1.5, -2),
                new CartesianCoordinate(5, 4),
                new CartesianCoordinate(1, 7),
                new CartesianCoordinate(3.5, -1)
            });

            Assert.AreEqual(0, extents.MinX);
            Assert.AreEqual(5, extents.MaxX);
            Assert.AreEqual(-2, extents.MinY);
            Assert.AreEqual(7, extents.MaxY);
            Assert.AreEqual(5, extents.Width);
            Assert.AreEqual(9, extents.Height);

            CartesianCoordinate coordinateWithinExtents = new CartesianCoordinate(1, 1);

            Assert.IsTrue(extents.IsWithinExtents(coordinateWithinExtents));

            CartesianCoordinate coordinateOutsideExtentsX = new CartesianCoordinate(6, 1);

            Assert.IsFalse(extents.IsWithinExtents(coordinateOutsideExtentsX));

            CartesianCoordinate coordinateOutsideExtentsY = new CartesianCoordinate(1, 8);

            Assert.IsFalse(extents.IsWithinExtents(coordinateOutsideExtentsY));

            CartesianCoordinate coordinateOutsideExtentsXY = new CartesianCoordinate(6, 8);

            Assert.IsFalse(extents.IsWithinExtents(coordinateOutsideExtentsXY));
        }
        public static void AddRange_Updates_Extents_Boundaries_for_Any_Point_that_Lies_Outside_Current_Extents()
        {
            PointExtents extents = new PointExtents();

            extents.AddRange(new List <CartesianCoordinate>()
            {
                new CartesianCoordinate(1, 2),
                new CartesianCoordinate(3, 5),
                new CartesianCoordinate(2, 6),
                new CartesianCoordinate(0, 4),
                new CartesianCoordinate(1.5, -2),
                new CartesianCoordinate(5, 4),
                new CartesianCoordinate(1, 7),
                new CartesianCoordinate(3.5, -1)
            });

            Assert.AreEqual(0, extents.MinX);
            Assert.AreEqual(5, extents.MaxX);
            Assert.AreEqual(-2, extents.MinY);
            Assert.AreEqual(7, extents.MaxY);
            Assert.AreEqual(5, extents.Width);
            Assert.AreEqual(9, extents.Height);
        }
        public static void Initialization_with_Multiple_Coordinates_List()
        {
            PointExtents extents = new PointExtents(
                new List <CartesianCoordinate>()
            {
                new CartesianCoordinate(1, 2),
                new CartesianCoordinate(3, 5),
                new CartesianCoordinate(2, 6),
                new CartesianCoordinate(0, 4),
                new CartesianCoordinate(1.5, -2),
                new CartesianCoordinate(5, 4),
                new CartesianCoordinate(1, 7),
                new CartesianCoordinate(3.5, -1)
            }
                );

            Assert.AreEqual(0, extents.MinX);
            Assert.AreEqual(5, extents.MaxX);
            Assert.AreEqual(-2, extents.MinY);
            Assert.AreEqual(7, extents.MaxY);
            Assert.AreEqual(5, extents.Width);
            Assert.AreEqual(9, extents.Height);
        }
        public static void ScaleFromPoint_Scales_Shape(double scale,
                                                       double expectedCentroid_x, double expectedCentroid_y)
        {
            List <CartesianCoordinate> bowTieNonCrossingSegmentsScaled = new List <CartesianCoordinate>()
            {
                new CartesianCoordinate(4, 3.5),
                new CartesianCoordinate(3, 5),
                new CartesianCoordinate(3, 2),
                new CartesianCoordinate(4, 3.5),
                new CartesianCoordinate(5, 2),
                new CartesianCoordinate(5, 5),
                new CartesianCoordinate(4, 3.5),
            };

            Polygon polygon = new Polygon(bowTieNonCrossingSegmentsScaled);

            // Check shape position
            CartesianCoordinate originalCentroid = polygon.Centroid;

            Assert.AreEqual(4, originalCentroid.X);
            Assert.AreEqual(3.5, originalCentroid.Y);

            CartesianCoordinate referencePoint = new CartesianCoordinate(2, 1);
            Polygon             polygonScaled  = polygon.ScaleFromPoint(scale, referencePoint) as Polygon;

            // Check shape scale
            PointExtents extents = polygonScaled.Extents();

            Assert.AreEqual(2 * scale.Abs(), extents.Width);
            Assert.AreEqual(3 * scale.Abs(), extents.Height);

            // Check scaled centroid position
            CartesianCoordinate scaledCentroid = polygonScaled.Centroid;

            Assert.AreEqual(expectedCentroid_x, scaledCentroid.X);
            Assert.AreEqual(expectedCentroid_y, scaledCentroid.Y);
        }
        public static void Reset_Resets_Extents()
        {
            PointExtents extents = new PointExtents(
                new List <CartesianCoordinate>()
            {
                new CartesianCoordinate(1, 2),
                new CartesianCoordinate(3, 5),
                new CartesianCoordinate(2, 6),
                new CartesianCoordinate(0, 4),
                new CartesianCoordinate(1.5, -2),
                new CartesianCoordinate(5, 4),
                new CartesianCoordinate(1, 7),
                new CartesianCoordinate(3.5, -1)
            });

            Assert.AreEqual(0, extents.MinX);
            Assert.AreEqual(5, extents.MaxX);
            Assert.AreEqual(-2, extents.MinY);
            Assert.AreEqual(7, extents.MaxY);
            Assert.AreEqual(5, extents.Width);
            Assert.AreEqual(9, extents.Height);

            List <CartesianCoordinate> newList = new List <CartesianCoordinate>()
            {
                new CartesianCoordinate(-1, -2),
                new CartesianCoordinate(1, 1),
                new CartesianCoordinate(1, -7)
            };

            extents.Reset(newList);
            Assert.AreEqual(-1, extents.MinX);
            Assert.AreEqual(1, extents.MaxX);
            Assert.AreEqual(-7, extents.MinY);
            Assert.AreEqual(1, extents.MaxY);
            Assert.AreEqual(2, extents.Width);
            Assert.AreEqual(8, extents.Height);
        }
        public static void Boundary_Returns_Boundary_Cordinates_of_Extents()
        {
            PointExtents extents = new PointExtents(
                new List <CartesianCoordinate>()
            {
                new CartesianCoordinate(1, 2),
                new CartesianCoordinate(3, 5),
                new CartesianCoordinate(2, 6),
                new CartesianCoordinate(0, 4),
                new CartesianCoordinate(1.5, -2),
                new CartesianCoordinate(5, 4),
                new CartesianCoordinate(1, 7),
                new CartesianCoordinate(3.5, -1)
            });

            Assert.AreEqual(0, extents.MinX);
            Assert.AreEqual(5, extents.MaxX);
            Assert.AreEqual(-2, extents.MinY);
            Assert.AreEqual(7, extents.MaxY);
            Assert.AreEqual(5, extents.Width);
            Assert.AreEqual(9, extents.Height);

            IList <CartesianCoordinate> boundary = extents.Boundary();

            Assert.AreEqual(0, boundary[0].X);
            Assert.AreEqual(7, boundary[0].Y);

            Assert.AreEqual(5, boundary[1].X);
            Assert.AreEqual(7, boundary[1].Y);

            Assert.AreEqual(5, boundary[2].X);
            Assert.AreEqual(-2, boundary[2].Y);

            Assert.AreEqual(0, boundary[3].X);
            Assert.AreEqual(-2, boundary[3].Y);
        }
        public static void Rotate_Returns_Rotated_Copy_of_Extents()
        {
            PointExtents extents = new PointExtents(
                new List <CartesianCoordinate>()
            {
                new CartesianCoordinate(1, 2),
                new CartesianCoordinate(3, 5),
                new CartesianCoordinate(2, 6),
                new CartesianCoordinate(0, 4),
                new CartesianCoordinate(1.5, -2),
                new CartesianCoordinate(5, 4),
                new CartesianCoordinate(1, 7),
                new CartesianCoordinate(3.5, -1)
            });

            Assert.AreEqual(0, extents.MinX);
            Assert.AreEqual(5, extents.MaxX);
            Assert.AreEqual(-2, extents.MinY);
            Assert.AreEqual(7, extents.MaxY);
            Assert.AreEqual(5, extents.Width);
            Assert.AreEqual(9, extents.Height);

            PointExtents rotatedExtents = extents.Rotate(Numbers.PiOver4) as PointExtents;

            Assert.AreEqual(-2.449747, rotatedExtents.MinX, Tolerance);
            Assert.AreEqual(7.449747, rotatedExtents.MaxX, Tolerance);
            Assert.AreEqual(-2.449747, rotatedExtents.MinY, Tolerance);
            Assert.AreEqual(7.449747, rotatedExtents.MaxY, Tolerance);

            rotatedExtents = rotatedExtents.Rotate(1.8 * Numbers.Pi) as PointExtents;

            Assert.AreEqual(-4.413818, rotatedExtents.MinX, Tolerance);
            Assert.AreEqual(9.413818, rotatedExtents.MaxX, Tolerance);
            Assert.AreEqual(-4.413818, rotatedExtents.MinY, Tolerance);
            Assert.AreEqual(9.413818, rotatedExtents.MaxY, Tolerance);
        }
        public static void Add_Updates_Extents_Boundaries_if_Point_Lies_Outside_Current_Extents()
        {
            PointExtents extents = new PointExtents();

            // Empty
            Assert.AreEqual(double.NegativeInfinity, extents.MinX);
            Assert.AreEqual(double.PositiveInfinity, extents.MaxX);
            Assert.AreEqual(double.NegativeInfinity, extents.MinY);
            Assert.AreEqual(double.PositiveInfinity, extents.MaxY);
            Assert.AreEqual(double.PositiveInfinity, extents.Width);
            Assert.AreEqual(double.PositiveInfinity, extents.Height);

            // First Point
            extents.Add(new CartesianCoordinate(1, 2));
            Assert.AreEqual(double.NegativeInfinity, extents.MinX);
            Assert.AreEqual(double.PositiveInfinity, extents.MaxX);
            Assert.AreEqual(double.NegativeInfinity, extents.MinY);
            Assert.AreEqual(double.PositiveInfinity, extents.MaxY);
            Assert.AreEqual(double.PositiveInfinity, extents.Width);
            Assert.AreEqual(double.PositiveInfinity, extents.Height);

            // Second Point
            extents.Add(new CartesianCoordinate(3, 5));
            Assert.AreEqual(1, extents.MinX);
            Assert.AreEqual(3, extents.MaxX);
            Assert.AreEqual(2, extents.MinY);
            Assert.AreEqual(5, extents.MaxY);
            Assert.AreEqual(2, extents.Width);
            Assert.AreEqual(3, extents.Height);

            // Third Point
            extents.Add(new CartesianCoordinate(2, 6));
            Assert.AreEqual(1, extents.MinX);
            Assert.AreEqual(3, extents.MaxX);
            Assert.AreEqual(2, extents.MinY);
            Assert.AreEqual(6, extents.MaxY);
            Assert.AreEqual(2, extents.Width);
            Assert.AreEqual(4, extents.Height);

            // Point Beyond Min X
            extents.Add(new CartesianCoordinate(0, 4));
            Assert.AreEqual(0, extents.MinX);
            Assert.AreEqual(3, extents.MaxX);
            Assert.AreEqual(2, extents.MinY);
            Assert.AreEqual(6, extents.MaxY);
            Assert.AreEqual(3, extents.Width);
            Assert.AreEqual(4, extents.Height);

            // Point Beyond Min Y
            extents.Add(new CartesianCoordinate(1.5, -2));
            Assert.AreEqual(0, extents.MinX);
            Assert.AreEqual(3, extents.MaxX);
            Assert.AreEqual(-2, extents.MinY);
            Assert.AreEqual(6, extents.MaxY);
            Assert.AreEqual(3, extents.Width);
            Assert.AreEqual(8, extents.Height);

            // Point Beyond Max X
            extents.Add(new CartesianCoordinate(5, 4));
            Assert.AreEqual(0, extents.MinX);
            Assert.AreEqual(5, extents.MaxX);
            Assert.AreEqual(-2, extents.MinY);
            Assert.AreEqual(6, extents.MaxY);
            Assert.AreEqual(5, extents.Width);
            Assert.AreEqual(8, extents.Height);

            // Point Beyond Max Y
            extents.Add(new CartesianCoordinate(1, 7));
            Assert.AreEqual(0, extents.MinX);
            Assert.AreEqual(5, extents.MaxX);
            Assert.AreEqual(-2, extents.MinY);
            Assert.AreEqual(7, extents.MaxY);
            Assert.AreEqual(5, extents.Width);
            Assert.AreEqual(9, extents.Height);

            // Point Inside
            extents.Add(new CartesianCoordinate(3.5, -1));
            Assert.AreEqual(0, extents.MinX);
            Assert.AreEqual(5, extents.MaxX);
            Assert.AreEqual(-2, extents.MinY);
            Assert.AreEqual(7, extents.MaxY);
            Assert.AreEqual(5, extents.Width);
            Assert.AreEqual(9, extents.Height);
        }
        public static void AddExtents_Updates_Extents_Boundaries_if_Provided_Extents_Extends_Outside_Current_Extents()
        {
            PointExtents extents1 = new PointExtents(
                new List <CartesianCoordinate>()
            {
                new CartesianCoordinate(1, 2),
                new CartesianCoordinate(3, 5),
                new CartesianCoordinate(2, 6),
                new CartesianCoordinate(0, 4),
                new CartesianCoordinate(1.5, -2)
            });

            Assert.AreEqual(0, extents1.MinX);
            Assert.AreEqual(3, extents1.MaxX);
            Assert.AreEqual(-2, extents1.MinY);
            Assert.AreEqual(6, extents1.MaxY);
            Assert.AreEqual(3, extents1.Width);
            Assert.AreEqual(8, extents1.Height);

            PointExtents extents2 = new PointExtents(
                new List <CartesianCoordinate>()
            {
                new CartesianCoordinate(1.5, -2),
                new CartesianCoordinate(5, 4),
                new CartesianCoordinate(1, 7),
                new CartesianCoordinate(3.5, -1)
            });

            Assert.AreEqual(1, extents2.MinX);
            Assert.AreEqual(5, extents2.MaxX);
            Assert.AreEqual(-2, extents2.MinY);
            Assert.AreEqual(7, extents2.MaxY);
            Assert.AreEqual(4, extents2.Width);
            Assert.AreEqual(9, extents2.Height);

            extents1.AddExtents(extents2);
            Assert.AreEqual(0, extents1.MinX);
            Assert.AreEqual(5, extents1.MaxX);
            Assert.AreEqual(-2, extents1.MinY);
            Assert.AreEqual(7, extents1.MaxY);
            Assert.AreEqual(5, extents1.Width);
            Assert.AreEqual(9, extents1.Height);

            PointExtents extents3 = new PointExtents(
                new List <CartesianCoordinate>()
            {
                new CartesianCoordinate(-1, -2),
                new CartesianCoordinate(1, 1),
                new CartesianCoordinate(1, -7)
            });

            Assert.AreEqual(-1, extents3.MinX);
            Assert.AreEqual(1, extents3.MaxX);
            Assert.AreEqual(-7, extents3.MinY);
            Assert.AreEqual(1, extents3.MaxY);
            Assert.AreEqual(2, extents3.Width);
            Assert.AreEqual(8, extents3.Height);

            extents1.AddExtents(extents3);
            Assert.AreEqual(-1, extents1.MinX);
            Assert.AreEqual(5, extents1.MaxX);
            Assert.AreEqual(-7, extents1.MinY);
            Assert.AreEqual(7, extents1.MaxY);
            Assert.AreEqual(6, extents1.Width);
            Assert.AreEqual(14, extents1.Height);
        }
        /// <summary>
        /// Calculates the extents aligned at centroid.
        /// </summary>
        /// <param name="extents">The extents.</param>
        /// <param name="centroid">The centroid.</param>
        /// <returns>PointExtents.</returns>
        public static PointExtents CalculateExtentsAlignedAtCentroid(PointExtents extents, CartesianCoordinate centroid)
        {
            PointExtents extentsAlignedAtCentroid = extents.Translate(-centroid.X, -centroid.Y) as PointExtents;

            return(extentsAlignedAtCentroid);
        }