Exemplo n.º 1
0
        /// <summary>
        /// returns the Convex Hull of a list of points
        /// </summary>
        /// <param name="points"></param>
        /// <returns>Convex Hull</returns>
        private static List <Point> ConvexHull(List <Point> points)
        {
            var vertices = new Vertex[points.Count];

            for (var i = 0; i < points.Count; i++)
            {
                vertices[i] = new Vertex(points[i].X, points[i].Y);
            }

            ConvexHullCreationResult <Vertex, DefaultConvexFace <Vertex> > convexHull = MIConvexHull.ConvexHull.Create(vertices);

            if (convexHull.Result == null)
            {
                throw new ArgumentOutOfRangeException("Could not create convex hull, check your points are not co-linear.");
            }
            var hullPoints = convexHull.Result.Points.ToList();

            var convexHullPoints = new List <Point>();

            foreach (Vertex vertex in hullPoints)
            {
                convexHullPoints.Add(Point.ByCoordinates(vertex.Position[0], vertex.Position[1]));
            }

            return(convexHullPoints);
        }
Exemplo n.º 2
0
        public static RectangleOriented FindMbrBoxByArea(List <PointD> list_of_points)
        {
            if (list_of_points.Count <= 1)
            {
                return(new RectangleOriented(new PointD(0, 0), 0, 0, 0));
            }

            ConvexHullCreationResult <DefaultVertex2D> hull = ConvexHull.Create2D(list_of_points.Select(x => new double[2] {
                x.X, x.Y
            }).ToList());

            double[,] hull_array = new double[hull.Result.Count, 2];

            for (int i = 0; i < hull.Result.Count; i++)
            {
                hull_array[i, 0] = hull.Result[i].X;
                hull_array[i, 1] = hull.Result[i].Y;
            }

            Matrix <double> hull_matrix = DenseMatrix.OfArray(hull_array);

            List <double> edge_angles = Rotating_Caliper(hull_array);

            double?           min_area       = null;
            RectangleOriented best_rectangle = new RectangleOriented();

            /// Test each angle to find bounding box with smallest area
            foreach (double angle in edge_angles)
            {
                RectangleOriented rectangle = FindMinimumBoundingRectangle(hull_matrix, angle);


                double area = rectangle.Width * rectangle.Lenght;

                if (area < min_area || min_area == null)
                {
                    min_area       = area;
                    best_rectangle = rectangle;
                }
            }

            return(best_rectangle);
        }
Exemplo n.º 3
0
        public static RectangleOriented FindMbrBoxByOverlap(List <PointD> list_of_points)
        {
            ConvexHullCreationResult <DefaultVertex2D> hull = ConvexHull.Create2D(list_of_points.Select(x => new double[2] {
                x.X, x.Y
            }).ToList());

            double[,] hull_array = new double[hull.Result.Count, 2];

            for (int i = 0; i < hull.Result.Count; i++)
            {
                hull_array[i, 0] = hull.Result[i].X;
                hull_array[i, 1] = hull.Result[i].Y;
            }

            Matrix <double> hull_matrix = DenseMatrix.OfArray(hull_array);

            List <double> edge_angles = Rotating_Caliper(hull_array);

            int?max_overlap = null;
            RectangleOriented best_rectangle = new RectangleOriented();

            /// Test each angle to find bounding box with smallest area
            foreach (double angle in edge_angles)
            {
                RectangleOriented rectangle = FindMinimumBoundingRectangle(hull_matrix, angle);


                int overlap = FindAllBorderPoints(list_of_points, rectangle, 0.05).Count;

                if (overlap > max_overlap || max_overlap == null)
                {
                    max_overlap    = overlap;
                    best_rectangle = rectangle;
                }
            }

            return(best_rectangle);
        }