algorithmic 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:

Released under the creative commons attribution share alike license 3.0

Views: 26512


You need to be a member of Grasshopper to add comments!

Join Grasshopper

Comment by Kacy Green on November 7, 2015 at 3:29pm

I am trying to do this to one single vortex and not a series of them, do you know how I might create such a lattice for a single vortex?

Comment by Maxwell Sheffield on June 25, 2015 at 8:17am

Hi daniel,

sorry for bothering. maybe i got the wrong impression, which is that the entire number of flowlines could become a continuous surface. however, i figured that depending on the number of sets of flowlines (input mode / Vectors) you create a branch each and rut it into the flat set of srf points, which creates a surface for each branch. how would they connect into a single surface? 

Thanks, Fabian

Comment by etsim on April 12, 2015 at 9:43am

hi daniel,

thanks for sharing your ideas!

Just by opening the def I get the result on the picture.

So I feed a mesh, from which I move certain points (z-axis) according to some fields. 

What I would really wanted to know is whether I could feed 3 or 4 slabs (surfaces) for example one on top of the other and then define some points (including Z coordinate) that would start creating connections between the slabs. For example a point between the first 2 slabs would make a bridging between them, another point between the second 2 slabs etc but not so much in a surface bridging technique but rather in a rheotomic surface technique.

Comment by shima sn on November 1, 2014 at 1:08pm

Hi Daniel,

Thanks for sharing the amazing component. I wonder if there a new version to this component?

I'm trying to get to the circle packing pattern for the base grid for CA based agents. The problem is since the lines start from a square shape center they create redundant intersections. Is there a way to have circles in the center like Phyllotaxis?


Comment by Tobias Power on October 26, 2014 at 6:22am


Firstly I'd just like to say this definition is amazing and great fun to play with and thanks for sharing, I have been trying to understand the maths behind how it has has been put together with my aim is to see if it is possible to have an arrangement of sinks and sources at one level, smoothly transitioning into a different arrangement at the level below. If we were to say 'one level' constitutes the combination of the final mesh combined with it's equivalent shifted vertically by 2*pi then is it possible to smoothly shift to a different arrangement at the level below to avoid repetition of the same helicoid regions at all levels. I believe this could produce some really beautiful and interesting landscapes but not really sure where to start as there is some very complicated maths that I don't really understand, I have posted my broken down the definition with what I believe each area is doing and would be extremely grateful if anyone could point me in the right direction of achieving something as the result said above and also confirm I have understood the script correctly,  many thanks

Comment by peyman on April 4, 2014 at 4:34am

i really appreciate if some body help me with that 

Comment by peyman on April 4, 2014 at 4:14am

Thank you for sharing this awesome definition Daniel , 

the problem for me is , how i can change the frame size for the field as now it is an allocated square 

Comment by posfan12 on October 2, 2013 at 2:20pm

Yes, but when you try to save the cluster it does so as a separate file. I.e. the original cluster does not get updated AFAIK.

Comment by Daniel Piker on October 2, 2013 at 6:59am

Hi - I think old clusters don't open just from double clicking, but you can still edit them by right-clicking and choosing "open cluster".

Comment by posfan12 on October 1, 2013 at 11:18pm

One more thing. Why can't I edit the cluster? Is it because it is from an old version of Grasshopper? I am running 0.9.0061.


Search Grasshopper


  • Add Photos
  • View All

© 2015   Created by Scott Davidson.   Powered by

Badges  |  Report an Issue  |  Terms of Service