Single line continuous Art

Hello All,

I am an artist and i am working on a research project on portraits.
I am looking to create a single line continuous art like the image attached**( image 1,2,3).**

1.I Passed a set of points through the image sampler
2. culled away the points in the bright area using the values from the image sampler
3. interpolated a curve through the points using a simple closest pt component.
4. This is what i was able to achieve. ( image 4) .

I am looking to create something like in image 1,2,3. A continuous free-flowing curve overlapping line.

Where am I going wrong? Should the curve interpolate more in areas which are dark.?
I am really not great at scriptable components. But if you guys can guide me on this.


200108_Continuous line (381.4 KB)


nice work!

some random thoughts hopefully helpful :slight_smile:

would it work to have circle-packing your image, then generating different amount of random points inside each circle depending on its size (smaller circle = identifies a darker area = more points) ?

this way you would have different point density in your canvas

the other thought is about how to connect the points with a single line
right now, with the VisualBasic script component in use, (I guess) if you have several coincident points they will generate nothing (a length = 0 line)

but it would maybe interesting to use a different approach, in such a way the curve can go back to that very same point again and again to produce more intersections (which will mean darker area, so a more intricate pattern)

I will try to sketch this idea down in GH as soon as I’ll be back to my PC :slight_smile:

1 Like

Not cool you didn’t learn from what was given in previous discussion !!!
Point generation was discussed, same link as said by @inno

You’ll see also some one curve drawing here

If you don’t want lines to cross it is named TSP drawing.

Thanks a lot for the reply. My bad i didnot completly explore or so to say understand how you suppressed the points using the graph mapper. That said, as i write this message i have now understood it.

I Have taken the inputs from @inno and @laurent_delrieu … Will update you guys with what i come up.

Hallo Inno,

Thanks for the reply.
Dividing the circle based on the size makes sense as darker areas gets more points.

Will work on it and keep you posted.

Thanks ,

Hello @inno & @laurent_delrieu,

You guys are right ,
1.i tried to popullate the image by circle packing method, It worked great. The popullation is regular .
2. And generated different amount of random points inside each circle depending on its size (smaller circle = identifies a darker area = more points) .

For sure the image looks nice with a good ligthing to shading gradiant.
Please find the attached image below.( Iamge 1 & Image 2)

But i feel if there is more overlapping of the line path it would make it a bit more intereiguing.

How do it do it ?

200108_Continuous line_SHR with circle packing (132.9 KB)


I was thinking how to feed multiple identical points to your VB component to get more knots,
I thought to not duplicate them “in place” but array their duplicates vertically, just over the original ones

I don’t know if you like this, I personally really like that dense scribbling in dark areas :slight_smile: and you can always project the final curve to XY if you want it to be planar

another thing that I tried (but I don’t know if it was a smart choice…)
after the circle packing, I didn’t like that much the idea that the next set of points (depending on circle radius => depending on dark areas) was forced to be generated just on the circumference of the circles
so I passed the circles through a mesh component (which generates 5k meshes…) and then PopulateGeometry on the meshes (using the already calculated amount of points => instead of points on the circumference, you get the very same amount of points but randomly inside the area of each circle)

(now that I look at it from a closer distance, they look anyway mostly distributed very close to the edges of the meshes… what the hell lol )

last thing, but I think it’s really important… this slider that scales up and down the circle min/max radius for the Kangaroo part, I think this is super useful because lets you find perfect balance

lower the slider -> reset the kangaroo solver -> slowly raise the slider until you see that circles are covering the full area

file with internalized circles: 200108_Continuous line_SHR with circle packing (283.2 KB)

partial results (to be much improved probably tomorrow)
it’s not at all Scarlett yet :frowning:

but I like the very scribblishly knots :slight_smile:

image from google images:

1 Like

Hey inno,

To start with it looks cool.

  1. I really like the logic of duplicating the points vertically and for sure it helps in creating denser and intricate notes.( May be just a thought we can move the vertically moved points further in x or y direction thus creating further intricate notes)

(upload:// (136.0 KB)

  1. I took the script you modified and I just added one feature to the script i culled out the areas which are completly bright. This give really amazing effects and further control. I a few tests and the results are promising.

  1. AS a step further to make the curves intricate, i was thinking now the VB scripts find the next closest point and then forms a line.
    Instead is it possible for it to go finding the 1,2,3& 4 point abd then loop back to 2nd point and then to the 5 th point ( like the image 6 attached)
    Does it make sense? will it help? VB Scripting is Greek and latin to me.;(

The idea is to create a knot or a overlapin the line as frequent as possible.

200109_Continuous line_SHR with circle packing logic (136.0 KB)



this should work, after the control polygon component

Hey @inno,

It worked great. Thanks. See you again with a new problem to solve :wink:

Here are some screenshots.


Thanks for sharing!
Seems you need a high contrast photo and plenty of patience.

1 Like

Yeah it takes a bit of time,

you need to slighly work on the image before using it :wink:

That’s really an interesting project with a very artistic result!

@inno do you have an idea on how to avoid the handful of super long curves (except by deleting)?

those super long curves exist because of the method used to connect all the dots, which at the moment is nearest unvisited neighbor (in the VB script): at a certain point it happens that the next unvisited closest point is very very far away, and you get those very long lines

I don’t have a clear idea how to tackle this, we are dealing with a huge amount of points, calculation time can increase very fast

theoretically it might be solvable using graph theory and some kind of triangulation to generate graph edges between points (delaunay? proximity?) but this approach might result into a real lot of time considering we will end up with around 10K points to process and around 30K vertexes :slight_smile:

maybe also clustering the points and entirely connect only each cluster, one after each other, might be an idea (in this case I’m worried about the lack of connections between points which are “visually close” but end up belonging to different clusters, so not connected together. But anyway the “nearest unvisited neighbor” method would have the very same “long lines” downside, even if applied in smaller scale)

Thanks for your extensive answer. Shortly after I posted my message I also found out “why” the long lines exist. In the end these long lines also have some artistic appeal. :slight_smile:

Well … after finding the points (easy) in theory is a classicTSP case (Traveling … blah, blah). If you use the fast iterative proximity (Point3dList etc) … then obviously “long” segments would appear (but you can cheat a bit).

In fact some client with a big dose of vanity wants an absurdy big plaza with his portrait on it (don’t ask). So I did a test C# that does a variety of graphs from an image (knitting, continuous proximity, TSP, mesh, voronoi etc etc) … but needs some tweeks here and there for decent Elapsed times (my threshold is around 200 ms … or quit he project [and reject the client]).

BTW: From the C# available options … these are the best: graph as Del mesh [The Lord and his Dog]. Just call Buchtal/Agrob Gmbh with a zillion in your pocket.

1 Like

wow, super interesting!
also how to get those incredibly low calculation time :slight_smile: wow

after Del-meshing the points to get the graph → maybe culling graph-edges whose length is higher than a given value, this way the max length of each curve will be “kind-of” set (expecially if the connection is done by interpolation)

the only other option that I see as viable is to manually cull graph edges that you -visually- see would be “unpleasant” in the final composition?

It is also possible to limit the intersection using “MST heuristics”
using Minimum Spanning Tree from SuperDelaunay then some tree


That’s the easiest of things: since we are talking MeshFaces (i.e. triangles) for sending them to that German ceramic tile giant … any filter imaginable is easy/possible (angles, edge ratios, edge sizes, area, cats, dogs etc etc). That said the Del thingy is done with a Mesh as output for obvious reasons (geometry is nothing, connectivity is everything)

But the challenging option is the knitting (in some milliseconds). Currently I’m testing some revolutionary ways to deal with the candidate line success ratio big thing.

I.e. pixelize the line - so to speak - get index pairs - NOT points (that could be ultra slow/stupid) - and test them against a bool [ , ] that marks the points sampled due to the filter used (brightness, hue, saturation etc etc). Plus I could do the lines with some drone and cover them with a trasparent epoxy coat : skip the tiles and save the zillions.

In the mean time:

BTW : I hate Voronoi things like my sins … but in this occasion … well …