Re: Feature Request: Get envelope of path stroked with arbitrary pen
Karel <[email protected]> Fri, 09 Feb 2018 13:11:29 +0100
| Newsgroups | gmane.comp.tex.metapost |
|---|---|
| Message-ID | <[email protected]> |
Nice, Luigi, but the envelope seems to be quite new and not yet documented in mp manual? All the best, Karel > On Fri, Feb 9, 2018 at 4:36 AM, Kevin Keith <[email protected]> wrote: > >>> Among other issues, the envelope of a path defined by cubic splines is not >>> itself a cubic spline, so you need to do some approximation, and coming up >>> with rules for how close the approximation needs to be, that cover all >>> cases, >>> is difficult. >>> >> Of course, but how does Metapost output pen strokes to eps or svg as it is? >> Surely >> it must already have a mechanism to approximate these higher-order splines >> with >> cubic bezier curves? >> >> >>> I can think about it, but first I need a small set of significant >>> examples (quite unlikely that I will implement something new for the >>> next texlive, btw) . >>> >> I'll give you the main issue I've run into: say I'm trying to design a font >> which >> is composed of pen strokes, but I want them to be joined smoothly. This is a >> rather >> contrived example, but I've put together an illustration of what I mean: >> https://i.stack.imgur.com/pzy8e.png >> >> > envelope of a cubic spline is tricky > and Metafont makes a polygonal approximation of the elliptical pen > (ie a linearization of the problem). > Metapost has the envelope instruction that works with > polygonal pen; > one can make an approximation of a pen and with the availability of > several numbersystem > the precision is not more a problem. > > > beginfig(1); > path p[] ; > pen mypen ; > pen mypenC; > numeric L ; > numeric S ; > L:=10; > Sa:=1; > Sb:=2; > Rot=32; > p[-1] := ( (Sa*cosd(0),Sb*sind(0)) for i=1 upto L-1: -- > (Sa*cosd(i/L*360), Sb*sind(i/L*360)) endfor -- cycle ) rotated Rot; > mypen := makepen(p[-1]) ; > mypenC:= (pencircle xscaled 2Sa yscaled 2Sb) rotated Rot; > p0 := (0,0){down} .. {up} (100,0) ; > p1 := envelope mypen of p0 ; > message "length p1=" & decimal(length(p1)); > draw p1 withcolor blue withpen pencircle scaled 0.25pt ; > > draw p0 withcolor 0.8white withpen mypenC; > > for t=1 upto length(p1): > draw (point t of p1) withcolor red withpen pencircle scaled 0.3pt; > endfor; > > currentpicture := currentpicture scaled 10 ; > endfig; > end > > > -- http://tug.org/metapost/