summaryrefslogtreecommitdiff
path: root/Master/texmf/asymptote/plain_arrows.asy
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf/asymptote/plain_arrows.asy')
-rw-r--r--Master/texmf/asymptote/plain_arrows.asy639
1 files changed, 0 insertions, 639 deletions
diff --git a/Master/texmf/asymptote/plain_arrows.asy b/Master/texmf/asymptote/plain_arrows.asy
deleted file mode 100644
index 59b65aa4126..00000000000
--- a/Master/texmf/asymptote/plain_arrows.asy
+++ /dev/null
@@ -1,639 +0,0 @@
-real arrowlength=0.75cm;
-real arrowfactor=15;
-real arrowangle=15;
-real arcarrowfactor=0.5*arrowfactor;
-real arcarrowangle=2*arrowangle;
-real arrowsizelimit=0.5;
-real arrow2sizelimit=1/3;
-real arrowdir=5;
-real arrowbarb=3;
-real arrowhookfactor=1.5;
-real arrowtexfactor=1;
-
-real barfactor=arrowfactor;
-
-real arrowsize(pen p=currentpen)
-{
- return arrowfactor*linewidth(p);
-}
-
-real arcarrowsize(pen p=currentpen)
-{
- return arcarrowfactor*linewidth(p);
-}
-
-real barsize(pen p=currentpen)
-{
- return barfactor*linewidth(p);
-}
-
-struct arrowhead
-{
- path head(path g, position position=EndPoint, pen p=currentpen,
- real size=0, real angle=arrowangle);
- real size(pen p)=arrowsize;
- real arcsize(pen p)=arcarrowsize;
- filltype defaultfilltype(pen) {return FillDraw;}
-}
-
-real[] arrowbasepoints(path base, path left, path right)
-{
- real[][] Tl=transpose(intersections(left,base));
- real[][] Tr=transpose(intersections(right,base));
- return new real[] {Tl.length > 0 ? Tl[0][0] : 1,
- Tr.length > 0 ? Tr[0][0] : 1};
-}
-
-path arrowbase(path r, pair y, real t, real size)
-{
- pair perp=2*size*I*dir(r,t);
- return size == 0 ? y : y+perp--y-perp;
-}
-
-arrowhead DefaultHead;
-DefaultHead.head=new path(path g, position position=EndPoint, pen p=currentpen,
- real size=0, real angle=arrowangle) {
- if(size == 0) size=DefaultHead.size(p);
- bool relative=position.relative;
- real position=position.position.x;
- if(relative) position=reltime(g,position);
- path r=subpath(g,position,0);
- pair x=point(r,0);
- real t=arctime(r,size);
- pair y=point(r,t);
- path base=arrowbase(r,y,t,size);
- path left=rotate(-angle,x)*r;
- path right=rotate(angle,x)*r;
- real[] T=arrowbasepoints(base,left,right);
- pair denom=point(right,T[1])-y;
- real factor=denom != 0 ? length((point(left,T[0])-y)/denom) : 1;
- path left=rotate(-angle,x)*r;
- path right=rotate(angle*factor,x)*r;
- real[] T=arrowbasepoints(base,left,right);
- return subpath(left,0,T[0])--subpath(right,T[1],0)&cycle;
-};
-
-arrowhead SimpleHead;
-SimpleHead.head=new path(path g, position position=EndPoint, pen p=currentpen,
- real size=0, real angle=arrowangle) {
- if(size == 0) size=SimpleHead.size(p);
- bool relative=position.relative;
- real position=position.position.x;
- if(relative) position=reltime(g,position);
- path r=subpath(g,position,0);
- pair x=point(r,0);
- real t=arctime(r,size);
- pair y=point(r,t);
- path base=arrowbase(r,y,t,size);
- path left=rotate(-angle,x)*r;
- path right=rotate(angle,x)*r;
- real[] T=arrowbasepoints(base,left,right);
- pair denom=point(right,T[1])-y;
- real factor=denom != 0 ? length((point(left,T[0])-y)/denom) : 1;
- path left=rotate(-angle,x)*r;
- path right=rotate(angle*factor,x)*r;
- real[] T=arrowbasepoints(base,left,right);
- return subpath(left,T[0],0)--subpath(right,0,T[1]);
-};
-
-arrowhead HookHead(real dir=arrowdir, real barb=arrowbarb)
-{
- arrowhead a;
- a.head=new path(path g, position position=EndPoint, pen p=currentpen,
- real size=0, real angle=arrowangle)
- {
- if(size == 0) size=a.size(p);
- angle=min(angle*arrowhookfactor,45);
- bool relative=position.relative;
- real position=position.position.x;
- if(relative) position=reltime(g,position);
- path r=subpath(g,position,0);
- pair x=point(r,0);
- real t=arctime(r,size);
- pair y=point(r,t);
- path base=arrowbase(r,y,t,size);
- path left=rotate(-angle,x)*r;
- path right=rotate(angle,x)*r;
- real[] T=arrowbasepoints(base,left,right);
- pair denom=point(right,T[1])-y;
- real factor=denom != 0 ? length((point(left,T[0])-y)/denom) : 1;
- path left=rotate(-angle,x)*r;
- path right=rotate(angle*factor,x)*r;
- real[] T=arrowbasepoints(base,left,right);
- left=subpath(left,0,T[0]);
- right=subpath(right,T[1],0);
- pair pl0=point(left,0), pl1=relpoint(left,1);
- pair pr0=relpoint(right,0), pr1=relpoint(right,1);
- pair M=(pl1+pr0)/2;
- pair v=barb*unit(M-pl0);
- pl1=pl1+v; pr0=pr0+v;
- left=pl0{dir(-dir+degrees(M-pl0,false))}..pl1--M;
- right=M--pr0..pr1{dir(dir+degrees(pr1-M,false))};
- return left--right&cycle;
- };
- return a;
-}
-arrowhead HookHead=HookHead();
-
-arrowhead TeXHead;
-TeXHead.size=new real(pen p)
-{
- static real hcoef=2.1; // 84/40=abs(base-hint)/base_height
- return hcoef*arrowtexfactor*linewidth(p);
-};
-TeXHead.arcsize=TeXHead.size;
-
-TeXHead.head=new path(path g, position position=EndPoint, pen p=currentpen,
- real size=0, real angle=arrowangle) {
- static real wcoef=1/84; // 1/abs(base-hint)
- static path texhead=scale(wcoef)*
- ((0,20) .. controls (-75,75) and (-108,158) ..
- (-108,166) .. controls (-108,175) and (-100,178) ..
- (-93,178) .. controls (-82,178) and (-80,173) ..
- (-77,168) .. controls (-62,134) and (-30,61) ..
- (70,14) .. controls (82,8) and (84,7) ..
- (84,0) .. controls (84,-7) and (82,-8) ..
- (70,-14) .. controls (-30,-61) and (-62,-134) ..
- (-77,-168) .. controls (-80,-173) and (-82,-178) ..
- (-93,-178) .. controls (-100,-178) and (-108,-175)..
- (-108,-166).. controls (-108,-158) and (-75,-75) ..
- (0,-20)--cycle);
- if(size == 0) size=TeXHead.size(p);
- path gp=scale(size)*texhead;
- bool relative=position.relative;
- real position=position.position.x;
- if(relative) position=reltime(g,position);
- path r=subpath(g,position,0);
- pair y=point(r,arctime(r,size));
- return shift(y)*rotate(degrees(-dir(r,arctime(r,0.5*size))))*gp;
-};
-TeXHead.defaultfilltype=new filltype(pen p) {return Fill(p);};
-
-private real position(position position, real size, path g, bool center)
-{
- bool relative=position.relative;
- real position=position.position.x;
- if(relative) {
- position *= arclength(g);
- if(center) position += 0.5*size;
- position=arctime(g,position);
- } else if(center)
- position=arctime(g,arclength(subpath(g,0,position))+0.5*size);
- return position;
-}
-
-void drawarrow(frame f, arrowhead arrowhead=DefaultHead,
- path g, pen p=currentpen, real size=0,
- real angle=arrowangle,
- filltype filltype=null,
- position position=EndPoint, bool forwards=true,
- margin margin=NoMargin, bool center=false)
-{
- if(size == 0) size=arrowhead.size(p);
- if(filltype == null) filltype=arrowhead.defaultfilltype(p);
- size=min(arrowsizelimit*arclength(g),size);
- real position=position(position,size,g,center);
-
- g=margin(g,p).g;
- int L=length(g);
- if(!forwards) {
- g=reverse(g);
- position=L-position;
- }
- path r=subpath(g,position,0);
- size=min(arrowsizelimit*arclength(r),size);
- path head=arrowhead.head(g,position,p,size,angle);
- bool endpoint=position > L-sqrtEpsilon;
- if(cyclic(head) && (filltype == NoFill || endpoint)) {
- if(position > 0)
- draw(f,subpath(r,arctime(r,size),length(r)),p);
- if(!endpoint)
- draw(f,subpath(g,position,L),p);
- } else draw(f,g,p);
- filltype.fill(f,head,p+solid);
-}
-
-void drawarrow2(frame f, arrowhead arrowhead=DefaultHead,
- path g, pen p=currentpen, real size=0,
- real angle=arrowangle, filltype filltype=null,
- margin margin=NoMargin)
-{
- if(size == 0) size=arrowhead.size(p);
- if(filltype == null) filltype=arrowhead.defaultfilltype(p);
- g=margin(g,p).g;
- size=min(arrow2sizelimit*arclength(g),size);
-
- path r=reverse(g);
- int L=length(g);
- path head=arrowhead.head(g,L,p,size,angle);
- path tail=arrowhead.head(r,L,p,size,angle);
- if(cyclic(head))
- draw(f,subpath(r,arctime(r,size),L-arctime(g,size)),p);
- else draw(f,g,p);
- filltype.fill(f,head,p+solid);
- filltype.fill(f,tail,p+solid);
-}
-
-// Add to picture an estimate of the bounding box contribution of arrowhead
-// using the local slope at endpoint and ignoring margin.
-void addArrow(picture pic, arrowhead arrowhead, path g, pen p, real size,
- real angle, filltype filltype, real position)
-{
- if(filltype == null) filltype=arrowhead.defaultfilltype(p);
- pair z=point(g,position);
- path g=z-(size+linewidth(p))*dir(g,position)--z;
- frame f;
- filltype.fill(f,arrowhead.head(g,position,p,size,angle),p);
- pic.addBox(z,z,min(f)-z,max(f)-z);
-}
-
-picture arrow(arrowhead arrowhead=DefaultHead,
- path g, pen p=currentpen, real size=0,
- real angle=arrowangle, filltype filltype=null,
- position position=EndPoint, bool forwards=true,
- margin margin=NoMargin, bool center=false)
-{
- if(size == 0) size=arrowhead.size(p);
- picture pic;
- pic.add(new void(frame f, transform t) {
- drawarrow(f,arrowhead,t*g,p,size,angle,filltype,position,forwards,margin,
- center);
- });
-
- pic.addPath(g,p);
-
- real position=position(position,size,g,center);
- path G;
- if(!forwards) {
- G=reverse(g);
- position=length(g)-position;
- } else G=g;
- addArrow(pic,arrowhead,G,p,size,angle,filltype,position);
-
- return pic;
-}
-
-picture arrow2(arrowhead arrowhead=DefaultHead,
- path g, pen p=currentpen, real size=0,
- real angle=arrowangle, filltype filltype=null,
- margin margin=NoMargin)
-{
- if(size == 0) size=arrowhead.size(p);
- picture pic;
- pic.add(new void(frame f, transform t) {
- drawarrow2(f,arrowhead,t*g,p,size,angle,filltype,margin);
- });
-
- pic.addPath(g,p);
-
- int L=length(g);
- addArrow(pic,arrowhead,g,p,size,angle,filltype,L);
- addArrow(pic,arrowhead,reverse(g),p,size,angle,filltype,L);
-
- return pic;
-}
-
-void bar(picture pic, pair a, pair d, pen p=currentpen)
-{
- picture opic;
- Draw(opic,-0.5d--0.5d,p+solid);
- add(pic,opic,a);
-}
-
-picture bar(pair a, pair d, pen p=currentpen)
-{
- picture pic;
- bar(pic,a,d,p);
- return pic;
-}
-
-typedef bool arrowbar(picture, path, pen, margin);
-
-bool Blank(picture, path, pen, margin)
-{
- return false;
-}
-
-bool None(picture, path, pen, margin)
-{
- return true;
-}
-
-arrowbar BeginArrow(arrowhead arrowhead=DefaultHead,
- real size=0, real angle=arrowangle,
- filltype filltype=null, position position=BeginPoint)
-{
- return new bool(picture pic, path g, pen p, margin margin) {
- add(pic,arrow(arrowhead,g,p,size,angle,filltype,position,forwards=false,
- margin));
- return false;
- };
-}
-
-arrowbar Arrow(arrowhead arrowhead=DefaultHead,
- real size=0, real angle=arrowangle,
- filltype filltype=null, position position=EndPoint)
-{
- return new bool(picture pic, path g, pen p, margin margin) {
- add(pic,arrow(arrowhead,g,p,size,angle,filltype,position,margin));
- return false;
- };
-}
-
-arrowbar EndArrow(arrowhead arrowhead=DefaultHead,
- real size=0, real angle=arrowangle,
- filltype filltype=null, position position=EndPoint)=Arrow;
-
-arrowbar MidArrow(arrowhead arrowhead=DefaultHead,
- real size=0, real angle=arrowangle, filltype filltype=null)
-{
- return new bool(picture pic, path g, pen p, margin margin) {
- add(pic,arrow(arrowhead,g,p,size,angle,filltype,MidPoint,margin,
- center=true));
- return false;
- };
-}
-
-arrowbar Arrows(arrowhead arrowhead=DefaultHead,
- real size=0, real angle=arrowangle,
- filltype filltype=null)
-{
- return new bool(picture pic, path g, pen p, margin margin) {
- add(pic,arrow2(arrowhead,g,p,size,angle,filltype,margin));
- return false;
- };
-}
-
-arrowbar BeginArcArrow(arrowhead arrowhead=DefaultHead,
- real size=0, real angle=arcarrowangle,
- filltype filltype=null, position position=BeginPoint)
-{
- return new bool(picture pic, path g, pen p, margin margin) {
- real size=size == 0 ? arrowhead.arcsize(p) : size;
- add(pic,arrow(arrowhead,g,p,size,angle,filltype,position,
- forwards=false,margin));
- return false;
- };
-}
-
-arrowbar ArcArrow(arrowhead arrowhead=DefaultHead,
- real size=0, real angle=arcarrowangle,
- filltype filltype=null, position position=EndPoint)
-{
- return new bool(picture pic, path g, pen p, margin margin) {
- real size=size == 0 ? arrowhead.arcsize(p) : size;
- add(pic,arrow(arrowhead,g,p,size,angle,filltype,position,margin));
- return false;
- };
-}
-
-arrowbar EndArcArrow(arrowhead arrowhead=DefaultHead,
- real size=0, real angle=arcarrowangle,
- filltype filltype=null,
- position position=EndPoint)=ArcArrow;
-
-arrowbar MidArcArrow(arrowhead arrowhead=DefaultHead,
- real size=0, real angle=arcarrowangle,
- filltype filltype=null)
-{
- return new bool(picture pic, path g, pen p, margin margin) {
- real size=size == 0 ? arrowhead.arcsize(p) : size;
- add(pic,arrow(arrowhead,g,p,size,angle,filltype,MidPoint,margin,
- center=true));
- return false;
- };
-}
-
-arrowbar ArcArrows(arrowhead arrowhead=DefaultHead,
- real size=0, real angle=arcarrowangle,
- filltype filltype=null)
-{
- return new bool(picture pic, path g, pen p, margin margin) {
- real size=size == 0 ? arrowhead.arcsize(p) : size;
- add(pic,arrow2(arrowhead,g,p,size,angle,filltype,margin));
- return false;
- };
-}
-
-arrowbar BeginBar(real size=0)
-{
- return new bool(picture pic, path g, pen p, margin margin) {
- real size=size == 0 ? barsize(p) : size;
- bar(pic,point(g,0),size*dir(g,0)*I,p);
- return true;
- };
-}
-
-arrowbar Bar(real size=0)
-{
- return new bool(picture pic, path g, pen p, margin margin) {
- int L=length(g);
- real size=size == 0 ? barsize(p) : size;
- bar(pic,point(g,L),size*dir(g,L)*I,p);
- return true;
- };
-}
-
-arrowbar EndBar(real size=0)=Bar;
-
-arrowbar Bars(real size=0)
-{
- return new bool(picture pic, path g, pen p, margin margin) {
- real size=size == 0 ? barsize(p) : size;
- BeginBar(size)(pic,g,p,margin);
- EndBar(size)(pic,g,p,margin);
- return true;
- };
-}
-
-arrowbar BeginArrow=BeginArrow(),
-MidArrow=MidArrow(),
-Arrow=Arrow(),
-EndArrow=Arrow(),
-Arrows=Arrows(),
-BeginArcArrow=BeginArcArrow(),
-MidArcArrow=MidArcArrow(),
-ArcArrow=ArcArrow(),
-EndArcArrow=ArcArrow(),
-ArcArrows=ArcArrows(),
-BeginBar=BeginBar(),
-Bar=Bar(),
-EndBar=Bar(),
-Bars=Bars();
-
-void draw(frame f, path g, pen p=currentpen, arrowbar arrow)
-{
- picture pic;
- if(arrow(pic,g,p,NoMargin))
- draw(f,g,p);
- add(f,pic.fit());
-}
-
-void draw(picture pic=currentpicture, Label L=null, path g,
- align align=NoAlign, pen p=currentpen, arrowbar arrow=None,
- arrowbar bar=None, margin margin=NoMargin, Label legend=null,
- marker marker=nomarker)
-{
- // These if statements are ordered in such a way that the most common case
- // (with just a path and a pen) executes the least bytecode.
- if (marker == nomarker)
- {
- if (arrow == None && bar == None)
- {
- if (margin == NoMargin && size(nib(p)) == 0)
- {
- pic.addExactAbove(
- new void(frame f, transform t, transform T, pair, pair) {
- _draw(f,t*T*g,p);
- });
- pic.addPath(g,p);
-
- // Jumping over else clauses takes time, so test if we can return
- // here.
- if (L == null && legend == null)
- return;
- }
- else // With margin or polygonal pen.
- {
- _draw(pic, g, p, margin);
- }
- }
- else /* arrow or bar */
- {
- // Note we are using & instead of && as both arrow and bar need to be
- // called.
- if (arrow(pic, g, p, margin) & bar(pic, g, p, margin))
- _draw(pic, g, p, margin);
- }
-
- if(L != null && L.s != "") {
- L=L.copy();
- L.align(align);
- L.p(p);
- L.out(pic,g);
- }
-
- if(legend != null && legend.s != "") {
- legend.p(p);
- pic.legend.push(Legend(legend.s,legend.p,p,marker.f,marker.above));
- }
- }
- else /* marker != nomarker */
- {
- if(marker != nomarker && !marker.above) marker.mark(pic,g);
-
- // Note we are using & instead of && as both arrow and bar need to be
- // called.
- if ((arrow == None || arrow(pic, g, p, margin)) &
- (bar == None || bar(pic, g, p, margin)))
- {
- _draw(pic, g, p, margin);
- }
-
- if(L != null && L.s != "") {
- L=L.copy();
- L.align(align);
- L.p(p);
- L.out(pic,g);
- }
-
- if(legend != null && legend.s != "") {
- legend.p(p);
- pic.legend.push(Legend(legend.s,legend.p,p,marker.f,marker.above));
- }
-
- if(marker != nomarker && marker.above) marker.mark(pic,g);
- }
-}
-
-// Draw a fixed-size line about the user-coordinate 'origin'.
-void draw(pair origin, picture pic=currentpicture, Label L=null, path g,
- align align=NoAlign, pen p=currentpen, arrowbar arrow=None,
- arrowbar bar=None, margin margin=NoMargin, Label legend=null,
- marker marker=nomarker)
-{
- picture opic;
- draw(opic,L,g,align,p,arrow,bar,margin,legend,marker);
- add(pic,opic,origin);
-}
-
-void draw(picture pic=currentpicture, explicit path[] g, pen p=currentpen,
- Label legend=null, marker marker=nomarker)
-{
- // This could be optimized to size and draw the entire array as a batch.
- for(int i=0; i < g.length-1; ++i)
- draw(pic,g[i],p,marker);
- if(g.length > 0) draw(pic,g[g.length-1],p,legend,marker);
-}
-
-void draw(picture pic=currentpicture, guide[] g, pen p=currentpen,
- Label legend=null, marker marker=nomarker)
-{
- draw(pic,(path[]) g,p,legend,marker);
-}
-
-void draw(pair origin, picture pic=currentpicture, explicit path[] g,
- pen p=currentpen, Label legend=null, marker marker=nomarker)
-{
- picture opic;
- draw(opic,g,p,legend,marker);
- add(pic,opic,origin);
-}
-
-void draw(pair origin, picture pic=currentpicture, guide[] g, pen p=currentpen,
- Label legend=null, marker marker=nomarker)
-{
- draw(origin,pic,(path[]) g,p,legend,marker);
-}
-
-// Align an arrow pointing to b from the direction dir. The arrow is
-// 'length' PostScript units long.
-void arrow(picture pic=currentpicture, Label L=null, pair b, pair dir,
- real length=arrowlength, align align=NoAlign,
- pen p=currentpen, arrowbar arrow=Arrow, margin margin=EndMargin)
-{
- if(L != null && L.s != "") {
- L=L.copy();
- if(L.defaultposition) L.position(0);
- L.align(L.align,dir);
- L.p(p);
- }
- marginT margin=margin(b--b,p); // Extract margin.begin and margin.end
- pair a=(margin.begin+length+margin.end)*unit(dir);
- draw(b,pic,L,a--(0,0),align,p,arrow,margin);
-}
-
-// Fit an array of pictures simultaneously using the sizing of picture all.
-frame[] fit2(picture[] pictures, picture all)
-{
- frame[] out;
- if(!all.empty2()) {
- transform t=all.calculateTransform();
- pair m=all.min(t);
- pair M=all.max(t);
- for(picture pic : pictures) {
- frame f=pic.fit(t);
- draw(f,m,nullpen);
- draw(f,M,nullpen);
- out.push(f);
- }
- }
- return out;
-}
-
-// Fit an array of pictures simultaneously using the size of the first picture.
-// TODO: Remove unused arguments.
-frame[] fit(string prefix="", picture[] pictures, string format="",
- bool view=true, string options="", string script="",
- projection P=currentprojection)
-{
- if(pictures.length == 0)
- return new frame[];
-
- picture all;
- size(all,pictures[0]);
- for(picture pic : pictures)
- add(all,pic);
-
- return fit2(pictures,all);
-}