algorithmic modeling for Rhino

How do I decompose 2 intersecting surfaces then recompose as 1?

One of the GH-based tools I’m developing is one that allows me to position various synthesized surfaces so that they interact spatially. When an interesting interaction between the two surfaces is found the tool can create a single surface having the texture of the original input surfaces. (Visualize two waves interacting on the surface of a body of water.) But a surface intersection operations is producing unexpected results, putting my entire algorithm at risk of failing.

I’ve enclosed a .GH that has a simplified version of the algorithm I intended to use to produce a single surface from the two input surfaces. How it works is to use the Brep | Brep component to generate a set of curves where the input surfaces meet. I then apply these cutting curves to a Surface Split component on each input surface. I intended to then programmatically cull the set of brep’s from the split operations, removing all those that aren’t on the face of the target surface. Finally, I would join all the remaining prep’s into a synthesized surface that reflects the facial interactions of the originals.

This algorithm is however not completing successfully because the outputs of the Brep | Brep don’t appear to accurately reflect the complete set of curves at the intersections of the 2 faces. I think it’s because of these incomplete set of curves that the Surface Split operations are returning a very incomplete set of sub-surfaces. This sparse set of results don’t allow me to reassemble the sub-surfaces to form a complete synthesized face.

This posting includes the Grasshopper document, as well as a screenshot of the GH code. The GH Intersection and split operations take a long time to complete. So I’ve enclosed Bake’d versions of the important geometries in the layers of the 3dm document as indicated below. But this results in a 12MB document, which is larger than the discussion can handle. But i can be downloaded from here. (my Google drive)

Scaled Waves                   - Layer 1
Brep | Brep out                - Layer 2
top Surface Split out         - Layer 3
bot Surface Split out         - Layer 4

I think there are problems in Rhino/Grasshopper related to intersections and splits. But I’m also open to somebody suggesting a better way to accomplish my objective — including workarounds.

Thanks for any help,

- Bob

Views: 1951


Replies to This Discussion

BTW: Given the opportunity and rather a "bit" off-topic  ... well ... in fact I'm involved in the decorative objects market sector but only related with stuff for planets outside earth (lot's of tax free cash).

See the notorious Alien spine cuppa def that does alien cuppas (what else?). Notice the holes carefully placed purely for ergonomic reasons - weird Alien hands. Also available solely via C#.

And a happy client that just took delivery of the thing:


The texture shown in my last post is the interior of two interlaced surfaces. However I more commonly want to create a texture based on the exterior of the two input surfaces. So I've enclosed updated GH code consisting of two groups -- MilledInterior and MilledExterior -- that generate both versions.

- Bob


BTW: Jokes apart the real reason that I've posted the Alien cuppa thingy has as follows:

1. You said that you are after organic shapes. This means stuff with some kind of "randomness".  But ... well ... then you put (or drill) rather "canonical" patterns that formulate the inner/outer skin (or both).

2. The above approach hits 3 walls: (a) very slow response (Rhino is a surface modeller) (b) booleans/fillets potential issues (Rhino is a surface modeller) (c) a potential aesthetic  antithesis between the liberty of the "whole" VS the "strict" rules of the "details".

3. Since you opt to work with Rhino It could be worth considering playing his own game: deforming surfaces that is ... by working against control points or via the Morph methods. Then join them and get the decorative thingy as "solid".

Images below are from a C# that actually gets the control points of Surfaces in Lists and "deforms" them according a gazillion of options (a) via any "on-the-fly" defined pattern (Take or skip this control point: shift branches/items that is) (b) using any number of attractors in any push/pull mode (c) using chaotic vector values (d) using ... well too many ways to list them here.

Imagine what the Alien cuppa def does (modifies "diagonally" control points) ... multiplied by 1000.

See these as well



Thanks for providing your Alien code. It's good to have as a reference. I've been drawn so far to various attractor constructs to create the organic feeling I'm looking for. It was my initial sense that morphing was going to be too direct, too explicit. But you've introduced an additional level of indirection my morphing control points. And interesting idea.

- Bob

Another more "canonical" approach is to divide a given surface (or BrepFace) with a variety of ways (and/or discard some pieces by taking care to have ONE island [for obvious reasons]) and them Morph some sort of "solid" thing into them and then use the sum of things as drilling profiles etc etc.

For the division/discard part see these 2 screenshots (mode: recursive random division, discard gradually pieces randomly: off/on, island detection: off/off).






  • Add Photos
  • View All

© 2022   Created by Scott Davidson.   Powered by

Badges  |  Report an Issue  |  Terms of Service