[HN Gopher] Triangulation of a polyline with thickness (a.k.a. l...
       ___________________________________________________________________
        
       Triangulation of a polyline with thickness (a.k.a. line strip)
        
       Author : jvernay
       Score  : 64 points
       Date   : 2025-01-03 20:12 UTC (2 days ago)
        
 (HTM) web link (jvernay.fr)
 (TXT) w3m dump (jvernay.fr)
        
       | overhead4075 wrote:
       | Doing something pretty similar with u,v coordinates to project
       | half-edge arrows onto triangle faces.
        
       | Taterr wrote:
       | Funny timing on this post, I just finished implementing this a
       | couple days ago for a little effect in a game. I followed the
       | math in this comment that is now only viewable from the archive
       | http://web.archive.org/web/20190614093605/https://forum.libc...
       | 
       | I notice you use 4 triangles per segment but I believe it's
       | always possible to use only 2 if you only have miter and bevel
       | caps.
        
         | jvernay wrote:
         | You can use 2 triangles with miter join, I've started with this
         | approach, but the bevel join creates (in general) a pentagon,
         | thus this should be doable with 3 triangles I suppose.
        
         | GuB-42 wrote:
         | For miter caps, you need 2, for bevel caps, you need 3.
         | 
         | But it is actually way more complicated than that in the
         | general case. Notice how there is some overlap, not very pretty
         | with transparency. There are ways around this problem, for
         | example using a stencil buffer, but if you don't want that
         | either and instead go a proper triangulation, this becomes
         | quite involved.
         | 
         | The problem is when segments are shorter than the inner
         | intersection point. In the example in the article, that's when
         | I1 is outside of [A1, A1'] or [B1, B1']. Doing it properly
         | would require taking the geometry of the entire figure into
         | account, you can't just draw it segment by segment and fix the
         | joints.
         | 
         | For example, if you draw a closed polygon that is smaller than
         | the line thickness, all internal geometry will disappear so you
         | have to triangulate the shape using only the outer vertices.
         | How to calculate that looks like an interesting problem that
         | would need a much longer blog post...
        
       | thomassmith65 wrote:
       | Aw, I looking forward to seeing the author's implementation for
       | the other two cap types, but it was a nice read regardless. These
       | types of links - right between general interest and too niche for
       | most readers to care - are why HN is such a great site.
        
       | dahart wrote:
       | I used something close to this to implement a whiteboard marker
       | with texture and transparency. If your browser supports WebGL,
       | feel free to try https://limnu.com/d/new.html (BTW It's a multi-
       | player whiteboard you can share & collab.) Is that a shameless
       | plug? I'm not involved anymore and won't make any money, but I'm
       | proud of the implementation, and happy if the current stewards of
       | the site get some traffic or business.
       | 
       | Aside from that, for the sake of discussion and playing devil's
       | advocate I'll take a small pedantic issue with the very first
       | sentence. There are multiple ways to do this kind of thing
       | without triangulating. (And I'm currently working on making one
       | available publicly.) Clever shaders are one way to render lines
       | without triangles. Ray tracing is another. Triangles are useful
       | and easy and have broad support, so they make sense, but they
       | aren't the only option.
        
       | styczen wrote:
       | ok, how compiling this? Why can wrote Makefile?
        
       ___________________________________________________________________
       (page generated 2025-01-05 23:00 UTC)