I've come up with a crude function that's doing more like what I want. I have two problems with it:
1. The most important: I need to differentiate the equations that generate a superellipse, in order to find the tangent at the defined vertices. I have failed to do this and so use a crude arbitrary power function. 2. Less important: what is the equivalent in METAFONT of the 'return' keyword? I just want superellipse() to return the shape, rather than draw it. James def superellipse(expr r,t,l,b,s)= pair tr, tl, bl, br; tr = (s[xpart t,xpart r],s[ypart r,ypart t]); tl = (s[xpart t,xpart l],s[ypart l,ypart t]); bl = (s[xpart b,xpart l],s[ypart l,ypart b]); br = (s[xpart b,xpart r],s[ypart r,ypart b]); numeric theta; if s > 0.5: % Behave as in the normal superellipse function theta = 0; else: % This is a crude mockup of the kind of function that is required % to generate shapes with s<0.5 (apparently called astroids). % This satisfies: % % s = 0.5, theta = 0.5 % s = 0, theta = 90 % % But to find the actual function, % we need to differentiate, at an endpoint, % the equation that would produce one quadrant of the shape. theta = 90 - (s*s*s*7.11378661); fi fill r{dir(90+theta)} ... tr{t-r} ... {dir(180-theta)}t & t{dir(180+theta)} ... tl{l-t} ... {dir(270-theta)}l & l{dir(270+theta)} ... bl{b-l} ... {dir(-theta)}b & b{dir(theta)} ... br{r-b} ... {dir(90-theta)}r & cycle; enddef; beginfig(0); superellipse( ( 100, 50 ), ( 50, 100 ), ( 0, 50 ), ( 50, 0 ), 0.6 ); endfig; end; On Mon, Mar 1, 2010 at 4:20 PM, Rory Molinari <quo...@gmail.com> wrote: > James's explanation appears to be right. > > On p 126 of the METAFONTbook Knuth says that the "superness should be > between 0.5 (when you get a diamond) and 1.0 (when you get a square)". > > Exercise 14.6 asks the reader to "Try superellimpse with superness > values less than 0.5 or greater than 1.0; explain why you get weird > shapes in such cases." The answer is "There are inflection points, > because there are no bounding triangles for the '...' operations in > the superellipse macro ... unless 0.5 \leq s \leq 1." > > Cheers, > Rory > > On Mon, Mar 1, 2010 at 8:04 AM, James Fisher <jameshfis...@gmail.com> > wrote: > > I should say that the vertices of the superellipse are calculated > > correctly. The problem, it seems, is that for the vertices at right, > top, > > left, and bottom, the angles of entry and exit need to be explicitly > > defined, rather than just relying on the '...' which coincidentally works > > for s>=0.5. > > > > I should say at this point that I am no maths whiz. But, sticking with > the > > 'right ... topright ... top' line, the angle calculation needs to > satisfy, > > for the exit angle of the first vertex: > > > > For s=0, angle = 180 degrees (vector to the left) > > For s = 0.5, angle = 135 degrees (45 degrees to the top left, producing a > > straight line to create the diamond shape) > > For s>0.5, angle = 90 degrees (vector vertically upwards) > > > > Suffice to say that I don't know how to produce that elegantly. > > > > > > > > James > > > > > > On Mon, Mar 1, 2010 at 3:54 PM, James Fisher <jameshfis...@gmail.com> > wrote: > >> > >> Hi again, > >> > >> > >> Another METAPOST problem. For the sake of curiosity, I've been looking > at > >> and playing with the superellipse() function in plain METAPOST. This is > all > >> fine and dandy until I try values of 'superness' less than 0.5, in which > >> case it generates shapes that are seemingly not superellipses. At > s=0.5, > >> the function generates a diamond shape -- which, AFAIK, is correct. > >> However, s<0.5, the points of the diamond immediately turn to curves. > (My > >> knowledge of superellipses here is just from > >> http://en.wikipedia.org/wiki/Superellipse -- try the image at > >> http://en.wikipedia.org/wiki/File:Lame_anima.gif to see how I expect > the > >> shape to change with varying values of superness). > >> > >> Some code follows -- perhaps someone could run it and tell me if, for > >> starters, they get the same as me. (See > http://i49.tinypic.com/2ijqatl.jpg > >> for superellipse() with s=0.3). > >> > >> > >> Best, > >> > >> > >> James > >> > >> > >> > >> % The following is a superellipse function at > >> < > http://lists.foundry.supelec.fr/pipermail/metapost-commits/2008-June/000340.html > >; > >> % I think it's the superellipse function in my copy of METAPOST; it at > >> least has the same behaviour. > >> % It seems to calculate the vertices correctly, but not the way they > join > >> (try changing all ... to --). > >> % > >> %def superellipse(expr r,t,l,b,s)= > >> % r ... (s[xpart t,xpart r],s[ypart r,ypart t]){t-r} ... > >> % t ... (s[xpart t,xpart l],s[ypart l,ypart t]){l-t} ... > >> % l ... (s[xpart b,xpart l],s[ypart l,ypart b]){b-l} ... > >> % b ... (s[xpart b,xpart r],s[ypart r,ypart b]){r-b} ... cycle > >> %enddef; > >> > >> def supertest expr s = > >> superellipse( > >> ( 100, 50 ), > >> ( 50, 100 ), > >> ( 0, 50 ), > >> ( 50, 0 ), > >> s > >> ); > >> enddef; > >> > >> % These >0 supernesses are fine, I think ... > >> > >> beginfig(0); > >> draw supertest 2; > >> endfig; > >> > >> beginfig(1); > >> draw supertest 1.01; > >> endfig; > >> > >> % The following, 0.5>=superness<=1, > >> % are from visual reference definitely right > >> > >> beginfig(2); > >> draw supertest 1; > >> endfig; > >> > >> beginfig(3); > >> draw supertest 0.99; > >> endfig; > >> > >> beginfig(4); > >> draw supertest 0.7; > >> endfig; > >> > >> beginfig(5); > >> draw supertest 0.51; > >> endfig; > >> > >> beginfig(6); > >> draw supertest 0.5; > >> endfig; > >> > >> % Now, for <0.5, > >> % things get problematic -- > >> % the points in the shape generated by s=0.5 > >> % should stay 'pointy' > >> > >> beginfig(7); > >> draw supertest 0.49; > >> endfig; > >> > >> beginfig(8); > >> draw supertest 0.3; > >> endfig; > >> > >> beginfig(9); > >> draw supertest 0.01; > >> endfig; > >> > >> beginfig(10); > >> draw supertest 0; > >> endfig; > >> > >> end; > >> > > > > > > > ___________________________________________________________________________________ > > If your question is of interest to others as well, please add an entry to > > the Wiki! > > > > maillist : ntg-context@ntg.nl / > > http://www.ntg.nl/mailman/listinfo/ntg-context > > webpage : http://www.pragma-ade.nl / http://tex.aanhet.net > > archive : http://foundry.supelec.fr/projects/contextrev/ > > wiki : http://contextgarden.net > > > ___________________________________________________________________________________ > > > > > > ___________________________________________________________________________________ > If your question is of interest to others as well, please add an entry to > the Wiki! > > maillist : ntg-context@ntg.nl / > http://www.ntg.nl/mailman/listinfo/ntg-context > webpage : http://www.pragma-ade.nl / http://tex.aanhet.net > archive : http://foundry.supelec.fr/projects/contextrev/ > wiki : http://contextgarden.net > > ___________________________________________________________________________________ >
___________________________________________________________________________________ If your question is of interest to others as well, please add an entry to the Wiki! maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context webpage : http://www.pragma-ade.nl / http://tex.aanhet.net archive : http://foundry.supelec.fr/projects/contextrev/ wiki : http://contextgarden.net ___________________________________________________________________________________