Beefy Boxes and Bandwidth Generously Provided by pair Networks
XP is just a number
 
PerlMonks  

Re^2: Better maps with Math::Geometry::Voronoi, and a Challenge for Math Monks (minimal covers)

by tye (Sage)
on Jul 02, 2008 at 00:41 UTC ( [id://695055]=note: print w/replies, xml ) Need Help??


in reply to Re: Better maps with Math::Geometry::Voronoi, and a Challenge for Math Monks
in thread Better maps with Math::Geometry::Voronoi, and a Challenge for Math Monks

Given a large number of points and wanting the smallest area that encompasses all of the points but not wanting the convex hull, the answer would be a shape with an area of zero (assuming the at-least-not-clearly-stated additional requirement of a single connected area, a series of line segments can suffice).

So I think there must be another requirement hiding in there that I'm not inferring. :)

- tye        

Replies are listed 'Best First'.
Re^3: Better maps with Math::Geometry::Voronoi, and a Challenge for Math Monks (minimal covers)
by BrowserUk (Patriarch) on Jul 02, 2008 at 01:19 UTC

    Hm. Good point. I wasn't involved in the sourcing of the data, and don't really know what it represented. The description I was given, as best I remember it, was that the points represented scintillations on the memrane that forms the cell walls of an amoeba-like thing. The creature can stretch bits of itself out into limb-like appendages, much like you see here.

    The problem is that being 3 dimensional, you get scinitallations from all over the outer membrane, not just around the 2D edges. So reconstructing a top-down, 2D representation of the thing, required connecting the dots that formed the outer edge of it, whilst ignoring those that came from the top of it. If you plot the points, your eyes/brain allow you to "see" the outline, and people would spend hours manually tracing the outines in GDDM so that they could extract the creatures image from the background before processing it further.

    Effectively it was an "edge tracing algorithm", but as the entire image was constructed of dots, and the background had plenty of them also, it was rather more complex. First you had to low-pass filter the points to exclude noise and as much of the background as possible without lossing too much definition in the creature. then attempt to draw a single line around the thing. As the points were digital on a defined grid, you end up with a complex polygon.

    Maybe that "single line" is the extra qualification you are after?


    Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
    "Science is about questioning the status quo. Questioning authority".
    In the absence of evidence, opinion is indistinguishable from prejudice.
      That sounds a lot like a convex hull algorithm. Drawing a line around all the points pretty much defines a convex hull. If it's not then you need some other rule that tells you when to prefer to cut into the shape rather than go around...

      -sam

      Then one way to fill in the missing requirement would be a "local" convex hull, where the definition of "local" can vary. My first idea would be to define a radius length that is a bit longer than the maximum "distance to closest neighbor point" (or just set by some person), pick an extreme point (leftmost, for example), draw the radius starting at that point and pointing "away" from the other points (to the left, using the same example), then sweep it clockwise from there until it hits another point. Then draw the radius from this new point back toward the previous point and then spin the radius clockwise again to find the next point. Continue until you get back to the starting point, at which time your sequence of points will have defined a closed polygonal border at least around some (at least two) of the points (if there are points left over, repeat the process for them).

      - tye        

        Yes. That sounds very similar to the conceptual algorithm we used. We started with the lowest point (GDDM uses "ass-back'ds coordinates" with (0,0) being bottom left) and then move around the thing in one direction until you get back to where you started from.

        There are various optimisations that can be applied. For example, when you look for the second point, you can start sweeping (in either direction) from the horizontal in that direction because you know that there is no point lower. You can also apply the same optimisation to each of the left-most, right-most and top-most points, which allows you to start in four places and progress them all (moving in the same direction) until they connect up with one of the other three. You can also set out in both directions from each of the ordinal points and progress 8 moves concurrently, theough the terminating conditions are more complex.

        Because you're starting (say) lowest and moving right (anticlockwise) you can constrain the points you look at, and also look at them in a defined order of probability--though I don't remember the details of the sorting criteria.

        There was also this thing about using vector math which I recall not properly understanding the principles of even though I coded it and made it work. Needless to say, whatever understanding I did have has long since vacated my head.

        The hardest part as I remember was preventing picking up spurious outlying points. The low-pass filter removed a lot of them but still occasional hotspots made it through. The mechanism for excluding those was a statistical thing that eliminated points that weren't part of a localised cluster. Darn it I wish I could remember more.


        Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
        "Science is about questioning the status quo. Questioning authority".
        In the absence of evidence, opinion is indistinguishable from prejudice.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://695055]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others chilling in the Monastery: (2)
As of 2024-03-19 05:23 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found