Rounding corners
Hi,
I'm finding that the results from the round segments node are not always what I'm looking for.
Attached are two screenshots of the pretty much the same shape, other made with Nodebox's rounding node and other with Illustrator's corner rounding. As you can see the results are pretty different. Nodebox distorts the shape in a way that is not normally my intention. Do you know if there's Illustrator style rounding node/code available for Nodebox 3?
The results what I'm looking for are pretty much shown in this article:
https://gorillasun.de/blog/an-algorithm-for-polygons-with-rounded-corners
Keyboard shortcuts
Generic
? | Show this help |
---|---|
ESC | Blurs the current field |
Comment Form
r | Focus the comment reply box |
---|---|
^ + ↩ | Submit the comment |
You can use Command ⌘
instead of Control ^
on Mac
Support Staff 1 Posted by john on 13 Oct, 2022 11:04 PM
Jussi,
Thanks for this interesting and important question.
You're right: the round_segments node often does not give us the results we desire. As you can tell from reading that article you linked to, rounding the corners of a polygon is a surprisingly tricky business. I believe even the algorithm described there would fail in certain corner cases (like self-intersecting paths),
A few years ago I took a run at this problem using a different algorithm I found. My fit_curve node calculates a curved path from scratch but produces results not much different than round_segment. In fact, I later removed it from my library for that reason. In some cases, though, it is slightly better, so I've been thinking about restoring it or trying to make a better one.
For simple shapes like rectangles, an alternative is to use the roundness parameter on the rect node. By using this with a compound node, you can sometimes produce the paths you want. You can also use my explode and curve nodes to construct exact paths from scratch. This can be rather cumbersome, but it is possible.
The attached demo provides a summary of options in the particular case of a cross (see screenshot).
So to answer your question: no, I do not currently know of a general purpose polygon rounding node that would produce results like Illustrator apparently does.
But the algorithm you found gives me new hope. It could certainly be implemented as a subnetwork node. I also followed a link in one of the comments from that article to what appears to be an even more general-purpose algorithm. I'm a tad busy at the moment, but when I get a chance I might try implementing that algorithm and see how well it works.
Even in Illustrator I think you will find that providing a single roundness or radius value is often not sufficient to produce the path you really want. For ideal results you may need to provide a different level of roundness for each corner (or even pick and choose which corners you want to round). In Illustrator this can be done by adjusting the spline curves by hand. The more general-purpose algorithm I found also provides a way of overriding the roundness value for particular corners; that might be feasible for simple shapes but would become cumbersome for shapes with hundreds or thousands of corners.
Sorry I don't have a quick fix for this one. If I come up with something more I will respond to this thread.
John
2 Posted by florisdejonge on 02 Nov, 2022 05:46 PM
Hi John and Jussi,
I tried a different approach to rounding corners earlier. Don't know to what extent it proves useful for other cases, but I used the resampling of a shape, of which corners are omitted and the points subsequently traced. Attached the example.
Kind regards,
Floris
3 Posted by Jussi Jokinen on 02 Nov, 2022 08:28 PM
Floris,
Wow, that's very clever! And the result (at least with specifically set parameters) is just what I was after. If only one could detect the indices of the corner points of any kind of shape, then this solution could be much more generic.
- Jussi
Support Staff 4 Posted by john on 03 Nov, 2022 08:06 AM
Floris,
I think removing the corners altogether and then replacing them with nearby points on the original path is an inspired idea. It inspired me to play with the idea and take up Jussi's challenge to make it more generic.
I did that and was pleasantly surprised how well it works!
Attached is a demo of a new node called soften. Soften removes all the corners from a closed path and replaces them with two points moved off a given distance along that path. I then replace each pair of corner points with a curve using the original corner point as control points. This produces a gentle curve where the corner used to be.
I also limit the amount of softening to no more than half way along the edges leading to each corner. This prevents wierdness and places an upper limit on how curvy you can make the path.
I tried it out on a variety of shapes and was surprised how well it worked (see screenshot). In the demo I show three variants for each shape:
The softened cross looks exactly like what Jussi originally asked for: all 12 corner softened with straight lines in between. A rectangle softens just the corners without causing an unsightly bulge along the edges. Even very pointy stars turn out just right. Arbitrary shapes (made by wiggling polygons or connecting scattered points) do well with both concave and convex segments.
I didn't intend on using this node with curved splines like ellipses or text paths, but to my surprise even those shapes weren't TOO bad - at least they don't explode. If you ever do need to soften a shape that already has curves, I would just resample it first.
The demo allows you experiment with many more shapes. You can fiddle with the existing shapes (e.g. change the dimensions, number of sides, wiggle parameters or random seeds) or the amount of softening. Or come up with even crazier shapes to test.
Please give this node a workout. If you guys think it's worthwhile, I will add it to the next release of my node library.
John
Support Staff 5 Posted by john on 03 Nov, 2022 08:47 AM
UPDATE
Attached is an improved version of soften that can also handle open paths. Please use this version with your tests.
6 Posted by Jussi Jokinen on 03 Nov, 2022 01:40 PM
John,
Based on some quick testing your solution seems superior to that of Illustrator's :)
Whereas in Illustrator rounding is limited to the maximum rounding of the corner with smallest distance to its' neighbours, in your solution such limit doesn't exist. Very nice and please add this to your library.
7 Posted by florisdejonge on 04 Nov, 2022 06:03 PM
John,
That's a terrific node once again! After I posted this I started thinking about making it more genereric (I was experimenting with it to apply it to my generated landscapes). Attached is what I could come up with (right). As a test, I compared it to your solution (left). And I must say, the latter is far superior and yields more clean results and probably more control. So, please add it to the next update of your library! (I've might have got some requests/questions btw, but I'll add them to the thread on your library). Thanks.
Floris
Support Staff 8 Posted by john on 05 Nov, 2022 08:40 AM
Thanks, Floris!
I have added the soften node to version 3.1 of my library. I hope to release it sometime soon.
John