Grasshopper

generative modeling for Rhino

# Rheotomic surfaces and flowline generation tool

Around 3 years ago I wrote an essay on my blog about what I called rheotomic surfaces - a type of surface I had developed related to fluid flow and electrostatics, and a technique for their generation using complex numbers.

Since then I have received a lot of questions from people interested in the details of exactly how these surfaces and their associated curvilinear orthogonal grids were generated.

Now I've packaged it up into a Grasshopper object with an easy interface, and am releasing it publicly so anyone can experiment with this tool.

(See this video for an example of it in action)

When the idea of using the streamlines of a flow to generate a surface first occurred to me, I thought the way to go about this would be to integrate a 2d vector field from various seed points and then move these lines vertically and loft between them - but after a lot of head scratching and experimentation, I was amazed to discover that it is actually possible to skip that step altogether.

In this technique, the surface is generated first, by moving the points of a mesh vertically from the complex plane according to the scalar values of their real and imaginary components, to generate 2 separate meshes. One of these meshes gives the rheotomic surfaces described in my essay, with helicoid shaped regions near the sources and sinks, and its contours are the streamlines of the flow (hence the name). The other mesh has sharp funnel shaped regions, and its contours give the equipotentials of the flow, orthogonal to the streamlines.

One of the advantages this technique has over vector field integration methods is that there is no problem of choosing seed points for streamline placement, and nice even spacing happens automatically. We also avoid the difficulties with cumulative error common to such methods.

By multiplying by other complex factors it is also possible to generate lines at specific angles to the streamline/equipotential directions and create various grid types.

Also because of the mesh contouring technique, these are actual vector curves being created, not just pixel based mappings.

Because the complex logarithm function is multivalued, dealing with the mesh in a way that avoids a sudden jump at the branch cuts does require a bit of special treatment, and it is not quite a straightforward height map, but I found that it is possible to avoid the usual techniques for contouring a 3d scalar field.

This definition outputs both the curves and the meshes. The meshes produced are singly periodic - you can make copies vertically shifted by 2*Pi to get a continuously spiralling surface, and if you also shift them by 1*Pi you get the other half of the helicoids, and it can all be joined into a complete and smooth surface.

So enjoy, I hope you find some interesting and original ways of using and developing this. Please do remember to attribute properly - a lot of effort has gone into this, but I'm freely sharing it in the hope that will be respected.

I've chosen not to compile or obfuscate anything, so you can easily pull it apart and see how it is all working. The original essay linked to at the start contains some suggestions of further reading if you want to learn more about complex numbers and flows.

The file: Rheotomic_Surfaces.gh

Views: 9021

Comment

Join Grasshopper

Comment by witness on May 13, 2012 at 8:58pm

awesome!!thks daniel.

Comment by Eli Meltzer on March 21, 2012 at 9:45pm

I've solved my previous questions by looking in to the cluster and playing around a bit, however, I see that the C# component that you've written to post process the mesh obliterates any list structure one might have and only outputs one mesh, causing me a problem if I want to generate anything beyond equipotential lines.  Is there a work around for this?

Thanks!

Comment by Eli Meltzer on March 21, 2012 at 8:45am

Hi Daniel, is there a way to control the size of the sample mesh, and to give the component multiple lists of points?  For example, to create a taxonomy like the attached:

Comment by castroecosta on March 13, 2012 at 7:54am

♥ rheotomic

Comment by richie hawtin on March 12, 2012 at 10:24am

hey guys anyone would now why i cant open it?

thanx again

Comment by richie hawtin on March 3, 2012 at 12:22pm

hey daniel!

well the error message is the following:

This document contains the messages that were recorded during the most recent Grasshopper® file read/write. Whenever a read/write operation fails or behaves unexpectedly, this summary will be compiled and put on display. If you experience problems saving or opening files, please include this log with any bug-report you file. You can use the Send... button to mail this report directly, or you can save the log and attach it to a personal email message. This log contains no personal information beyond what you supply, nor any other information that is not directly related to Grasshopper.

Developer contact

Message log start (chronological):

Data at the root level is invalid. Line 1, position 1.

and then i click ok and it doesnt open the definition, where in other similar situations i can usually see the definition....

if you could help me open it somehow would be great, since i would really like to explore it...

thanx again!

Comment by Daniel Piker on March 1, 2012 at 2:34pm

richie - what error message do you get ?

Comment by richie hawtin on March 1, 2012 at 2:25pm

hey daniel!

great work!

I tried to download the file  but somehow i canot open the file in grasshopper. I curently have version 080066, would you have any idea why this is happening?

thanx alot!

Comment by Michael Pryor on February 25, 2012 at 12:59pm

Excellent!

Comment by Daniel Piker on February 25, 2012 at 11:22am

Good idea Michael - I could also throw in a few of the other bits and pieces I've done over the last few years - DLA, 4Drotations, inversion... Expect a 'bonus' tab in the next Kangaroo release!

by Alex

by Alex

by Alex

• View All