Beefy Boxes and Bandwidth Generously Provided by pair Networks
laziness, impatience, and hubris
 
PerlMonks  

Re^4: Better maps with Math::Geometry::Voronoi, and a Challenge for Math Monks (locally convex)

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


in reply to Re^3: Better maps with Math::Geometry::Voronoi, and a Challenge for Math Monks (minimal covers)
in thread Better maps with Math::Geometry::Voronoi, and a Challenge for Math Monks

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        

  • Comment on Re^4: Better maps with Math::Geometry::Voronoi, and a Challenge for Math Monks (locally convex)

Replies are listed 'Best First'.
Re^5: Better maps with Math::Geometry::Voronoi, and a Challenge for Math Monks (locally convex)
by BrowserUk (Patriarch) on Jul 02, 2008 at 04:14 UTC

    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://695075]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others musing on the Monastery: (5)
As of 2024-04-19 21:11 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found