[metapost] Feature Request: Get envelope of path stroked with arbitrary pen

Karel horakk at math.cas.cz
Fri Feb 9 13:11:29 CET 2018

```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 <krfkeith at gmail.com> 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
>
>
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://tug.org/pipermail/metapost/attachments/20180209/3aedafd8/attachment.html>
```

More information about the metapost mailing list