[HN Gopher] How to draw S-curved arrows between boxes ___________________________________________________________________ How to draw S-curved arrows between boxes Author : alex_stoddard Score : 240 points Date : 2021-12-22 17:11 UTC (5 hours ago) (HTM) web link (dragonman225.js.org) (TXT) w3m dump (dragonman225.js.org) | nescioquid wrote: | I enjoyed reading this because it reminded me of a moment of | hubris as junior developer. I was working with a complicated data | structure I wanted to visualize, so I decided to write some quick | code to basically read the data structure and output a graph as | rectangles and lines connecting them. | | I was chastened by the complexity of just drawing the lines | between boxes so that they didn't overlap (as much as possible) | and were drawn on facing sides (one of the later problems | discussed in the article). I don't recall how I did it, but I do | remember a sudden refresher on matrix multiplication. | | It drove home how simple things can be more complicated than you | might expect. | | EDIT: also, I appreciated the way the article was written. No | cruft. | kazinator wrote: | Today (or twenty years ago, for that matter) I'd just output | the data structure in graphviz syntax and throw it at the dot | tool. | pintxo wrote: | If you want to add another level of complexity, add (non- | overlapping) labels to your boxes and arrows ... | [deleted] | allenu wrote: | I've had similar experiences on many projects. You start out | thinking something is going to be super simple and you provide | estimates that match your naive design and later find it'll | take 2.5x-5x longer than you wanted. It's definitely humbling. | | Nowadays when I have new work that has a lot of unknowns, I try | to jump in and create a proof of concept as quickly as I can, | even if it requires a ton of hacks. I want to know right off | the bat if there's something obvious that's going to make the | task take much longer than I wanted. | kazinator wrote: | In cases when the boxes overlap, there are ways to choose an | arrow which will not cross the boxes. But this is prevented by | the constraint that the starting and ending points must be on the | midpoint of a box edge. If the midpoint of the a given edge is | occluded by a box, or occludes a box, then that edge is not | considered, even though it is partially visible and has a viable | point for the arrow. | | E.g. if we could start an arrow in the middle of the small | protruding "ledge" of the bottom box, we could do this: | ,-------. : : : v : | +----------------+ : | | | +----------------+ | | |--+ | | | +----------------+ | | It's not written in stone that box-and-arrow diagrams must be | connected by edge midpoints. That can't even work well any time | you have multiple arrows emanating or terminating on the same | edge. | | Very good first iteration round, though. | klyrs wrote: | Such an innocent-sounding problem, but I've drawn tons of figures | in inkscape, tikz and matplotlib and I swear, I'd never stop | fidgeting with curved arrows if time was immaterial. | | But of course, I have Opinions that would keep me from using this | in practice. For example, my favorite style is similar to a half | curly-bracket (or, taste depending, an integral symbol) -- two | small semicircles connected by an axis-aligned line. | | Edit: oh, and question from the peanut gallery... what if one box | is fully within the other, and _centered_? | javajosh wrote: | _> I have Opinions_ | | Good. Then fork the library and modify it to your liking, | optionally republish. | | _> one box is fully within the other, and centered_ | | This implies containment/stacking and wouldn't require an | arrow. However, you could do worse than drawing 4 arrows from | the edges of the surrounding rectangle. | jedberg wrote: | We recently redid our landscaping, which included making the edge | of the driveway and S curve. I thought my landscaper was pretty | clever. | | He took a flimsy pvc pipe, nailed it down at the beginning and | end of the curve, and it bent into a perfect S curve that he then | spray painted down to follow. | | It's amazing how physics and nature can solve these problems for | you! | anonymous532 wrote: | It's cute and definitely a great way to "draw S-curved arrow | between boxes", but, under the assumption of being built to be | used within a real project with dozens or hundreds of overlapping | connections, this, like many other node systems, fails to be | usable unless you push the complexity somewhere else. | anamexis wrote: | > under the assumption of being built to be used within a real | project with dozens or hundreds of overlapping connections | | This is an odd assumption to make. | AceJohnny2 wrote: | Not so weird. Here's a random example, from Wikipedia: | | https://en.wikipedia.org/wiki/Force- | directed_graph_drawing#/... | TobTobXX wrote: | These are straight lines. Not sure you even _want_ Bezier | curves in this context, striaght lines are probably clearer | in these graphs with hundreds of connections. | dragonwriter wrote: | Is someone selling it as some kind of universal solution for | production diagramming problems of all scales, or is this just | unnecessary negativity? | quickthrower2 wrote: | In that case the tool would need to lay out everything | holistically but while it might do great arrow wise it could be | useless for the user if they wanted the diagram a certain way | for a reason. | anonymous532 wrote: | Yes, that is what I've noticed too. On medium/big projects | macro-level(holistic) arrow functionality is far more | important than having beautifully curved arrows from node A | to node B. Solving that problem strangely resembles routing | on a circuit board with buses, labels, colors, layers etc. | kevin_thibedeau wrote: | There is a section in Graphics Gems 3 that describes a | layout system for an Atari ST DAW app. | Minor49er wrote: | This reminds me of a project I worked on that had an interface | with draggable boxes just like this. The library that we used | rendered the boxes as divs while the arrows were drawn as SVGs. | Apparently there was a bug on Internet Explorer 11 where CSS | transforms being applied to SVGs would cause the browser to slow | to a crawl, or crash entirely if too many were happening at once. | | To get around it, I switched the line drawing function for IE11 | so that it would draw two divs that would extend from the middle | of each box and touch corners in the middle (basically figure 4 | in the article), then style them with a curved border on the | appropriate side. While not as elegant as what's shown here, it | was convincing enough that nobody noticed any visual difference | between it and the regular version. | gunshowmo wrote: | Fantastic article. This kind of insight into how people break | down complicated problems into more manageable pieces is | extremely valuable. | emmanueloga_ wrote: | GUI algorithms like these are not well documented anywhere | (except, of course, all over the web and in source code! :-) ... | | Would be nice to have a site, maybe a wiki, dedicated to this | kind of thing. | | Other interesting problems in this area: | | * Layout algorithms | | * Automatic assignment of keys for navigation (for nav w/o using | a mouse) | | * Popup menu prediction [1] | | * Text breaking / paragraph layout [2] | | * Etc, etc, etc ... | | 1: https://bjk5.com/post/44698559168/breaking-down-amazons- | mega... | | 2: https://xxyxyz.org/line-breaking/ | TacticalCoder wrote: | That line-breaking link is really great, I enjoyed it a lot! | However it barely scratches the surface: there's no good line- | breaking without hyphenation. And then even once you have a | great H & J algorithm (Hyphenation and Justification), you have | the visual problem of "rivers" (be it text or print): a "river" | behind when on one line you have the space between two words | nearly matching another space between two words on the next | line, then third line, etc. | | I don't know if modern typesetting software like InDesign do | solve this automatically or not. The web certainly don't | (although with CSS and the "shy" Unicode char you at least get | some control on the 'H' part of "H & J"). Back in my | typesetting days QuarkXPress had nothing to help with rivers: | you had to detect them visually and then "fudge" the paragraph | a bit (by forcing a line-break or an hyphenation). | | I always wondered: certainly if you start with a good H & J | algorithm, it must be possible to try a few candidates and | determine, programatically, which one has the least obvious | rivers? Fascinating stuff IMHO. | | P.S: I also wonder if it's because algorithms for layout out | paragraphs are _so_ bad on the web that justification is | typically frowned upon on the Web? (it certainly rules king in | printed books) | vjeux wrote: | Back in 2012 I made a series of blog posts about all the unique | image algorithms I could find: | | - Facebook (that I designed): | https://blog.vjeux.com/2012/image/image-layout-algorithm-fac... | | - Google Plus: https://blog.vjeux.com/2012/javascript/image- | layout-algorith... | | - Google Plus, finding best breaks, which also explains fancy | text layout algorithm: | https://blog.vjeux.com/2014/image/google-plus-layout-find-be... | | - Lightbox: https://blog.vjeux.com/2012/javascript/image- | layout-algorith... | | - Lightbox Android: | https://blog.vjeux.com/2012/javascript/image-layout-algorith... | | - 500px: https://blog.vjeux.com/2012/javascript/image-layout- | algorith... | | I hope that's useful! | runeb wrote: | Very interesting, thank you for this! Just a note that your | demos do not seem to load images. | melony wrote: | One of the most difficult programming challenges I have | encountered is calculating and displaying automatic drag and | drop alignment guidelines/rulers (like those in Figma and | PowerPoint that show up when you drag two element close to each | other or near certain ratios) efficiently. They are not | documented anywhere despite being a very common pattern. Most | drag and drop libraries and framework don't have out of the box | support for it as it requires deep low level integration. ___________________________________________________________________ (page generated 2021-12-22 23:00 UTC)