settings.outformat="pdf";
settings.prc=false;
settings.render=0;
import graph;
import math;
unitsize(1cm);
size(10cm,0);
defaultpen(linewidth(1bp));
//--------------
void pstLabelAB(pair A, pair B, Label L="", pen Labelcolor=currentpen,
real dis=1, real d=6, real posLabel=0.5, bool line=true,
pen fillframe=blue, pen drawframe=green, filltype FillType=NoFill,
arrowbar arrow=None, arrowbar bar=None, pen sty=currentpen)
{
pair M,N;
M=A+dis/10*dir(degrees(B-A)+90);
N=B+dis/10*dir(degrees(B-A)+90);
path h = N--M;
real rotate_angle = degrees(dir(h));
//===================
if (line) {
draw(h,arrow,bar,p=sty);
frame f;
label(f,L,Labelcolor,FillDraw(fillframe,drawframe));
if (d==0){ add(rotate(rotate_angle)*f,position=relpoint(h,posLabel)+d/10*dir(rotate_angle-90),filltype=FillType); }
else { add(rotate(rotate_angle)*f,position=relpoint(h,posLabel)+d/10*dir(rotate_angle-90)); }
}
else
{
frame f;
label(f,L,Labelcolor,FillDraw(fillframe,drawframe));
if (d==0){ add(rotate(rotate_angle)*f,position=relpoint(h,posLabel)+d/10*dir(rotate_angle-90),filltype=FillType); }
else { add(rotate(rotate_angle)*f,position=relpoint(h,posLabel)+d/10*dir(rotate_angle-90)); }
}
}
//--------------
pair A=(3,3),B=(-3,-3);
path pathAB=A--B;
dot("A",A,red); dot("B",B,green);
//----
pstLabelAB(A,B,"Hello",dis=0,d=0,fillframe=red,drawframe=pink,FillType=UnFill(0.5),arrow=Arrows(size=5mm),bar=Bars(size=7));
pstLabelAB(A,B,rotate(90)*"Hello",dis=0,d=0,posLabel=.8,fillframe=red,drawframe=pink,FillType=UnFill(0),line=false);
pstLabelAB(A,B,rotate(-90)*"Hello",dis=0,d=0,posLabel=.2,fillframe=red,drawframe=pink,FillType=UnFill(0.01mm),line=false);
问题:
如何绘制一个小片段作为图像?
答案1
相关问题已在https://sourceforge.net/p/asymptote/discussion/409349/thread/06dad034/。问题在于旋转框架的边界框包括整个旋转区域,因此比框本身大。链接页面上的解决方案是用白色填充标签并打印而不使用 UnFill。但是,在您的示例中,标签已经填充,因此该解决方案不适用。相关方法是绘制一个白色框,其大小与标签大小相同,外加一些边距,然后在其中绘制标签(并且不使用 UnFill)。
边距被硬编码为5pt
,要更改间隙距离,您应该修改此值。请注意,只有 x 方向受影响,您可能还需要ymargin
根据标签的旋转设置 。此外,如果背景不是白色,则应该更改笔颜色。
代码:
box(f,L,xmargin=5pt,ymargin=0,p=white,filltype=Fill);
label(f,L,Labelcolor,FillDraw(fillframe,drawframe));
if (d==0){
add(rotate(rotate_angle)*f,position=relpoint(h,posLabel)+d/10*dir(rotate_angle-90),filltype=NoFill);
}
else {
add(rotate(rotate_angle)*f,position=relpoint(h,posLabel)+d/10*dir(rotate_angle-90));
}
结果: