Python concave hull of points

In geometrythe convex hull or convex envelope or convex closure of a 12kw brushless motor is the smallest convex set that contains it. The convex hull may be defined either as the intersection of all convex sets containing a given subset of a Euclidean spaceor equivalently as the set of all convex combinations of points in the subset.

For a bounded subset of the plane, the convex hull may be visualized as the shape enclosed by a rubber band stretched around the subset.

Perimeter of Convex hull for a given set of points

Convex hulls of open sets are open, and convex hulls of compact sets are compact. Every convex set is the convex hull of its extreme points. The convex hull operator is an example of a closure operatorand every antimatroid can be represented by applying this closure operator to finite sets of points.

The algorithmic problems of finding the convex hull of a finite set of points in the plane or other low-dimensional Euclidean spaces, and its dual problem of intersecting half-spacesare fundamental problems of computational geometry. As well as for finite point sets, convex hulls have also been studied for simple polygonsBrownian motionspace curvesand epigraphs of functions. Convex hulls have wide applications in mathematics, statistics, combinatorial optimization, economics, geometric modeling, and ethology.

Related structures include the orthogonal convex hullconvex layersDelaunay triangulation and Voronoi diagramand convex skull. A set of points in a Euclidean space is defined to be convex if it contains the line segments connecting each pair of its points. For objects in three dimensions, the first definition states that the convex hull is the smallest possible convex bounding volume of the objects.

The definition using convex combinations may be extended from Euclidean spaces to arbitrary real vector spaces or affine spaces ; convex hulls may also be generalized in a more abstract way, to oriented matroids. Therefore, the first two definitions are equivalent. In two dimensions, the convex hull is sometimes partitioned into two parts, the upper hull and the lower hull, stretching between the leftmost and rightmost points of the hull.

More generally, for convex hulls in any dimension, one can partition the boundary of the hull into upward-facing points points for which an upward ray is disjoint from the hulldownward-facing points, and extreme points. For three-dimensional hulls, the upward-facing and downward-facing parts of the boundary form topological disks. The closed convex hull of a set is the closure of the convex hull, and the open convex hull is the interior or in some sources the relative interior of the convex hull.

However, an intersection of closed half-spaces is itself closed, so when a convex hull is not closed it cannot be represented in this way.

Topologically, the convex hull of an open set is always itself open, and the convex hull of a compact set is always itself compact.By using our site, you acknowledge that you have read and understand our Cookie PolicyPrivacy Policyand our Terms of Service.

It only takes a minute to sign up. In mathematics, the convex hull or convex envelope for a set of points X in a real vector space V is the minimal convex set containing X Wikipedia. Wikipedia visualizes it nicely using a rubber band analogy, and there are some good algorithms to compute it. A concave hull is visualized using the red line in the image below the blue line visualizes the convex hull.

Intuitively, it is a polygon which embraces all the points, but has less minimal? As a result, the polygon's boundary length is longer. A concave hull may be the solution for some real-world problems e. I have failed to find a proper definition, algorithm and practical solution for the notion of a Concave Hull.

Convex Hull Algorithm Python

The Grass Wiki has some descriptions and imagesand there is a commercial solution in concavehull. Alpha shapes can be considered a generalisation of the convex hull.

They were first described in in:. Edelsbrunner, H. I'm not sure if you can vary the alpha parameter, however. There are probably many python modules you could use. It is fine to keep your code proprietary if you do not redistribute your program code or binaries. Here is what you are looking for. Duckham, M. Pattern Recognition v41, This seems to be a specific application of alpha shapeswhich are from my reading a more general form of this problem.

R has the alphahull modulewhich has excellent documentation on computing alpha shapes.

Redirecting…

Also check this detailed background on alpha shapes. Finally, this interesting application of alpha shapes by Flickr made the rounds a while ago, showing their utility for aggregating user generated point content:.By using our site, you acknowledge that you have read and understand our Cookie PolicyPrivacy Policyand our Terms of Service.

The dark mode beta is finally here. Change your preferences any time. Stack Overflow for Teams is a private, secure spot for you and your coworkers to find and share information. I'm looking for a python implementation for the Concave Hull problem. My problem is a bit different since I don't have a set of points, but a set of lines, where the result Concave-Hull will roughly bound along the lines as in the left drawing.

I understand that there is no single "correct answer". But some approximation will be enough for my needs. One possible solution is to take each line and interpolate it to a range of let's say 20 points and find the concave hull of all the created points. Not sure about it.

A good python implementation for the problem, even if not using the lines just finding a concave hull from a list of points will also be helpful. You could use alphashape. The tricky part is to choose an alpha that fits your needs. Alphashape comes with a function to find the optimum alpha value. This will not give you the desired output as the concave hull will follow these additional fake points and it becomes more concave than it can be with the original points.

I think the best solution for the whole problem is to start with the concave hull of the points for the optimum alpha obtained from optimizealpha and then decrease it until your hull doesn't intersect any of your lines as suggested by sgillen. This can be done similarly to finding the optimum alpha by using a bisection loop with testing any [polygon. Here is a fine blog post and associated github repo on finding the concave hull for a set of points using python.

My recommendation to you is the following. Create a set of points using the endpoints of each line. Then use the linked to code to generate a concave hull for these points, with some guess for the value of alpha.

Once this is done you can check if the generated hull intersects any of your linesand if it does modify alpha. You can make the check for intersection and adjustment automated if you like. You could also try adding the midpoints of your lines to your set of points, that may decrease the number of alphas you need to try. Like the other ones also said you first have to convert the endpoints of the lines to a list of points. After that you could need this tidy function from the SciPy Library: scipy.Geometric algorithms involve questions that would be simple to solve by a human looking at a chart, but are complex because there needs to be an automated process.

One example is: given four points on a 2-dimensional plane, and the first three of the points create a triangle, determine if the fourth point lies inside or outside the triangle. Another geometric problem is: given a number of points on a 2-dimensional plane, compute the minimum number of boundary points, that if connected, would contain all the points without creating a concave angle.

I got a clue from a lecture. It involves using a point as a pivot and determining which of two other points are the most clockwise from each other.

Before I watched more of the lecture, I was determined to figure out an algorithm that would solve it in a reasonable amount of time. In order to "prematurely optimize" I know it's bad I was trying to make the all the comparisons only on points to the right of p, but then I would need to flip and go the other way once the max x value was reached. It was turning out to be way more complicated than it should be.

I ended up cleaning it up and just getting the algorithm where it was correct, not fast. Then once it was correct, I would make it faster. I got rid of all the code that figured out if comparison points were to the right of the pivot point. They didn't help improve the complexity. I was able to remove the sort, also. It wasn't needed. I could find my start point, the minimum x-value point, in linear time.

It didn't matter what order the comparison points were in, since I was keeping track of the maximum clockwise-dness as I went along, the same as a linear search for the maximum value in an unsorted array. I ended up with h pivot points, each comparing its n neighbors to the one with the maximum clockwise angle. So I watched the rest of the lecture and it turns out my algorithm was one of the 2 solutions. It's called the Jarvis march, aka "the gift-wrapping algorithm", published in The other algorithm, at O n log nuses a sort and then a simple single pass of all the points, and making only left turns as it goes around the perimeter counter-clockwise.

When the next point is a right turn, it backtracks past all points using a stack and popping points off until that turn turns into a left turn. This algorithm is called the Graham scan. Which algorithm is better? It depends on your points. If most of the points will lie on the hull, the n log n algorithm will be better. You could always plot a random sample of the points on a graph and then choose your algorithm from there.

I think most points that resemble randomness will benefit from the Jarvis march. Here is one of the solutions I generated in Python: So how do you do it? My idea was: sort the points from left to right least value of x to largest - O n log n where n is the number of x, y points starting with the leftmost point p: go through each point to the right of that point, and using p as a pivot, find which point is the most clockwise.

O n set the most clockwise point as the new p - O 1 loop again with new p this continues until the starting point is reached O h - where h is the number of hull points In order to "prematurely optimize" I know it's bad I was trying to make the all the comparisons only on points to the right of p, but then I would need to flip and go the other way once the max x value was reached.In this post, we will learn how to find the Convex Hull of a shape a group of points.

A Convex object is one with no interior angles greater than degrees. A shape that is not convex is called Non-Convex or Concave. An example of a convex and a non-convex shape is shown in Figure 1. Therefore, the Convex Hull of a shape or a group of points is a tight fitting convex boundary around the points or the shape. The Convex Hull of the two shapes in Figure 1 is shown in Figure 2.

The Convex Hull of a convex object is simply its boundary. The Convex Hull of a concave shape is a convex boundary that most tightly encloses it. Given a set of points that define a shape, how do we find its convex hull? The algorithms for finding the Convext Hull are often called Gift Wrapping algorithms.

The video below explains a few algorithms with excellent animations:. Easy, huh? A lot of things look easy on the surface, but as soon as we impose certain constraints on them, things become pretty hard. For example, the Jarvis March algorithm described in the video has complexity O nh where n is the number of input points and h is the number of points in the convex hull.

Is an O n algorithm possible? The answer is YES, but boy the history of finding a linear algorithm for convex hull is a tad embrassing. The first O n algorithm was published by Sklansky in It was later proven to be incorrect. Between and16 different linear algorithms were published and 7 of them were found to be incorrect later on! This reminds me of a joke I heard in college. Every difficult problem in mathematics has a simple, easy to understand wrong solution!

Now, here is an embarrassing icing on the embarrassing cake. The algorithm implemented in OpenCV is one by Sklansky It is still a popular algorithm and in a vast majority of cases, it produces the right result. This algorithm is implemented in the convexHull class in OpenCV.

The Concave Hull of a Set of Points

By now we know the Gift Wrapping algorithms for finding the Convex Hull work on a collection of points.GitHub is home to over 40 million developers working together to host and review code, manage projects, and build software together.

Skip to content. Permalink Dismiss Join GitHub today GitHub is home to over 40 million developers working together to host and review code, manage projects, and build software together. Sign up. Branch: master. Find file Copy path. Cannot retrieve contributors at this time. Raw Blame History. TH convex hull problem has several applications in geometrical problems, computer graphics and game development. Two algorithms have been implemented for the convex hull problem here.

A divide-and-conquer algorithm which runs in O n log n There are other several other algorithms for the convex hull problem which have not been implemented here, yet. Acceptable types so far are lists, tuples and sets. Returns points: a list where each item is of type Point.

This contains only objects which can be converted into a Point. All points must have at least 2 coordinates. Ignoring deformed point 2. All points" " must have at least 2 coordinates. The elements of points must be either lists, tuples or Points. Exception ValueError: if points is empty or None, or if a wrong data structure like a scalar is passed TypeError: if an iterable but non-indexable object eg. The sign indicates the direction of c relative to ab. A Positive value means c is above ab to the leftwhile a negative value means c is below ab to the right. As a side note, 0. Returns det: float, abs det is the distance of c from ab. The sign indicates which side of line segment ab c is.

The algorithm basically considers all combinations of points i, j and uses the definition of convexity to determine whether i, j is part of the convex hull or not.

Drawing Boundaries In Python

The union of the convex hull from smaller hulls is the solution to the convex hull of the larger problem. Parameter points: array-like of object of Points, lists or tuples.

The state of convex-set gets updated by this function Note For the line segment 'ab', 'a' is on the left and 'b' on the right. You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. The convex hull problem is problem of finding all the vertices of convex polygon, P of.

TH convex hull problem has several applications in geometrical problems. A divide-and-conquer algorithm which runs in O n log n.By using our site, you acknowledge that you have read and understand our Cookie PolicyPrivacy Policyand our Terms of Service. It only takes a minute to sign up. I'm trying to follow this tutoriel to do a concave hull script : Drawing Boundaries In Python. Of course, I drop all steps for plot results.

But at the and of my script I have an error. This is last lines :. Like it's said here in Workaround 2, you have to import shapely first and fiona after. Sign up to join this community. The best answers are voted up and rise to the top. Home Questions Tags Users Unanswered.

Creating concave hull with Python? Ask Question. Asked 2 years, 2 months ago. Active 6 months ago. Viewed 5k times. I'm trying to follow this tutoriel to do a concave hull script : Drawing Boundaries In Python Of course, I drop all steps for plot results.

Abort trap: 6 What is wrong here? Tim C. Which line exactly triggers that? Do you use a spatial index? For spatial index, I don't think so. Jan 23 '18 at Seems like a bug! Please see github. If not, please try to make a bug report with the data that leads to this. Active Oldest Votes. 