[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
## a boundary-pushing challenge for drawing commands

**From**: |
G. Branden Robinson |

**Subject**: |
a boundary-pushing challenge for drawing commands |

**Date**: |
Tue, 3 Sep 2024 05:11:59 -0500 |

I was reading groff_diff(7)'s short and simple description of the GNU
troff drawing command extension, `\D'P'`.
\D'P h1 v1 ... hn vn'
As \D'p', but the polygon is filled.
Instantly (or not, given that I must have read this sentence dozens of
times before without finding it noteworthy), a problem occurred to me.
How does the formatter know which parts to fill?
I have a vague conception that finding determining whether a point is
interior to a polygon is something of an open question. Call it a rumor
one hears among mathematics undergraduates in the break room. This, I
gather, is why applied topologists go on about "convex hulls". (I don't
have a _proper_ understanding of these things.)
If the question seems easy, it's probably because you're thinking of
conventional convex polygons, and maybe even regular ones, with all
sides the same length.
But those are especially well-behaved specimens of polygon.
Haughtily, I figured I could break GNU troff at once.
$ cat EXPERIMENTS/concave-filled-polygon.groff
.sp
Try to make a filled bowtie.
.sp
Let's see what happens.
.sp
\D'P 0 1i 1i -1i 0 1i'
...but it worked!
Clearly the formatter can figure out simple cases like this.
But, if I'm right about polygon concavity being a killer, ultimately one
can get the formatter to go wrong, either by misrendering, failing an
assertion, or going computationally asymptotic as it struggles with
interiority like a character from a Bergman film.
If someone would test GNU troff's boundaries so that I can document what
those boundaries are, I'd appreciate it.
Same if you can disabuse me of my misguided mathematical notions.
Regards,
Branden

**
**`signature.asc`

*Description:* PGP signature

**a boundary-pushing challenge for drawing commands**,
*G. Branden Robinson* **<=**