如何为 UnFill 绘制一个小段?

如何为 UnFill 绘制一个小段?
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));
}

结果:

在此处输入图片描述

相关内容