Celtic Knotwork self-intersections and intersections

I’m not going to install plugins to make @seghierkhaled’s version work, I recommend @maje90’s V3 which I just posted again, celtic knotwork V3_2022Oct3aa.gh

1 Like

ok, thanks. Are plugins risky or slow down stuff? Should I not install everything? I’ll try @maje90 's this evening. Must do some paid work for a few hours :grimacing:


found the topography BTW, delete :face_exhaling:

I don’t.

I rushed to post code this morning (containing Riccardo’s V3), then re-posted as ‘aa’ to fix a bug I hadn’t noticed, and you won’t see it all day? Sigh. This forum doesn’t work well as a chat room.

1 Like

PS I’ve made a V3.1 … more correct dis-ambiguity between Curve and NurbsCurve…

1 Like

Not much time nowadays but wanted to test an idea:

If this was a curve drawn by hand, the curve would go over the already drawn curve at an intersection.

The definition below uses pipes instead of offset. Since the larger diameter pipes are open surfaces they only subtract geometry from the initial pipe where they intersect and not where they are “co-axial” with the pipe.

offset_curve_with_gaps.gh (14.2 KB)


GROUP EFFORT! - Raytraced, satin titanium material:

NOTE: I’m seeing a very different result from baking RailRev and Flow components (above) vs. baking SUnion (below). I have no idea why? :thinking:

I finished chopping off the ends (orange group) and copied the ring creation and flow code from what you posted this morning (celtic_ring2_definition.gh).

This image of the canvas (below) has the code I wrote or heavily modified (from your second post in this thread) at the top, Riccardo’s V3 in the middle (white group) and your code from today at the bottom.

celtic knotwork V3_2022Oct3b.gh (57.8 KB)

I replaced my ‘Circumference’ slider with the actual circumference from the Flow ‘C1’ (Target) input. I had to recreate the Flow ‘C0’ input (baseline curve) to match the circumference.

Repeat pattern ‘Count’ is reduced from 40 to 18. You can easily add a slider to the Scale NU ‘Y’ input to adjust the pattern width, independent of its length (‘X’, circumference).


Hey @Joseph_Oster , the first one looks great! is there an end in it that had to be rhinoed?

I was scratching my gin soaked head last night when you said that the ‘join’ components were not doing anything becasue the ends weren’t joining. Now I remember, I must have forgotten to save the corrected curve. With some delicate fiddling, I can get the end of the knot2 curve to meet with its arrayed counterpart, creating a join. This left me with 2 joined curves derived from 80 intertwined curves. Anyhow, just so you know, in not just addicted to join components :face_with_spiral_eyes:

So now I’ll play with some of these tricks you’ve been working on.

@martinsiegrist 's looks very eloquent.

1 Like

Your solution has brough it to my attention that I need to enable GPU processing. Might help :nail_care:

Please look only at the last one, celtic knotwork V3_2022Oct3b.gh

There is too much clutter on this thread already.

1 Like

that is pretty stunning. It’s flawless!

If the celts had known about this, imagine what they’d have done! I think I’ll stick to doing the solid Union in Rhino as the chugchug single cylinder tower is struggling under the load of the parameters let alone that last bit.

thanks a load!

Very cool, simple and smart logic!


I agree, very clever and beautifully simple.

1 Like

Clever, though a little fragile, easy to break. Hard coded values in the Domain input expressions (x-5 and x+5) could be parameter driven. I wonder how well it works on a long knot curve like we’ve been working with in this thread?

offset_curve_with_gaps_2022Oct3a.gh (7.4 KB) (no improvements, just internalized curve)

my computer wouldn’t do it unfortunately

Thanks @Joseph_Oster

Of course the domains would need to be parameter driven. I might give it a go with a longer curve in a few days.

Try replacing Riccardo’s (@maje90) white group in this post:

I didn’t know, I’m salivating :+1: this is just A W E S O M E

don’t know if the +/- value to t is the best solution (even if it’s parametrized with an independent number slider)… I think averaging the self-intersection parameters along the curve is probably the easiest way, and kind of accounts for ̶a̶l̶l̶ most cases just by itself

works nicely and it’s pretty fast, the only thing is to always have the “generator curve” to maintain a minimum distance from itself equal to the pipe diameter, otherwise it makes weird stuff :slight_smile:

offset_curve_with_gaps_ALL_HAIL_MARTIN.gh (17.0 KB)
[in the def I’m using an utility component from an external plugin that generates random colors for the preview, sorry for that]


Thank you @inno :slight_smile: