odToad Posted December 8, 2017 Share Posted December 8, 2017 Hope its ok to post an answer rather than a question here too. I was looking for a way to compute the convex hull for a bunch of 2D points and found no obvious node/HDA so I wrote one. Example problem in the attached picture: from all the shown points, eliminate all the yellow ones and create a polygon around with the blue ones. This is an example of a convex hull (wikipedia) Just create a Attribute Wrangle, set it to "Run Over" "Detail (only once)" and paste the following code into it: Quote // https://en.wikipedia.org/wiki/Gift_wrapping_algorithm // jarvis wrapping algorithm for finding the convex hull // output will always be clockwise in top view // note this wrangle is getting its data from input 1, not 0. // This makes sure the input points dont get spit out as well // just the convex hull polygon int n = npoints(1); vector pts[]; int i; // find leftmost point in source poly/points vector minP = { 1e30,0,0 }; for( i=0;i<n;i++ ) { pts = point(1,"P",i); if( pts.x < minP.x ) minP = pts; } vector pointOnHull, newHullPointCandidate; vector hull[]; // convex hull to be created int isLeftOf( vector a; vector p0; vector p1 ) { vector va = normalize(a-p0); vector vp1 = normalize(p1-p0); vector normal = set( -vp1.z,0,vp1.x ); return dot(va,normal)>0; } // this is from the wikipedia page pointOnHull = minP; int hi=0; // hull last point index as we build hull newHullPointCandidate = {0,0,0}; // just to keep uninited warning off do { hull[hi] = pointOnHull; newHullPointCandidate = pts[0]; for( i=1;i<n;i++ ) if( newHullPointCandidate==pointOnHull || isLeftOf( pts, hull[hi], newHullPointCandidate ) ) newHullPointCandidate = pts; hi++; pointOnHull = newHullPointCandidate; } while( newHullPointCandidate!=hull[0] ); // finally, create the convex hull polygon as output int pr = addprim(1,"poly"); for( hi=0;hi<len(hull);hi++ ) { int pt = addpoint(0,hull[hi]); addvertex(1,pr,pt); } Now connect input 1 (thats the second one, not the first one) to a collection of points or a prim The output of this Convex Hull Wrangle will be a single polygon, clockwise when viewed from above (+y) The reason input 1 rather than input 0 is used is that no source geometry/points appears on the output this way, just the convex hull polygon. This code assumes that your points all live in the XZ plane, ie y=0 for all points. It only creates a 2D convex hull, not 3D polyhedra. 1 Quote Link to comment Share on other sites More sharing options...

Noobini Posted December 8, 2017 Share Posted December 8, 2017 sorry for posting non-H stuff here...but did mine (not exact but similar) in 3D, I can't show you the code coz it's done with MCG but I can guarantee you there was not one bit of 'code'...it was all based on what I called 'sweeping radar' approach (where on the radar screen, you see a line sweeping radially, when it hits something it goes PIIIIIING !). Shows you being a non-coder should not discourage you from doing something. This was done because BBox doesn't conform to the contours of your geo...so I wrote my own BSh (ape). Quote Link to comment Share on other sites More sharing options...

## Recommended Posts

## Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Note:Your post will require moderator approval before it will be visible.