我有以下代码testingarrowheads.asy
:
settings.outformat="pdf";
unitsize(1cm);
draw((0,0)--(2.82842,2.82842), arrow=Arrow(size=9), blue + linewidth(2.5pt));
path tick = (-0.1,0.1) -- (0,0);
draw(tick);
path tick = ((0.607,0.807) -- (0.707,0.707), linewidth(1.5pt));
draw(tick);
path tick = (1.314,1.514) -- (1.414,1.414);
draw(tick);
path tick = (2.021,2.221) -- (2.121,2.121);
draw(tick);
path tick = (2.728,2.928) -- (2.828,2.828);
draw(tick);
当我使用 cmd 窗口使用命令运行代码时:
asy testingarrowheads.asy
出现以下警告:
testingarrowheads.asy: 6.13: no matching function 'operator tuple(guide, pen)'
另外,我怎样才能使 4 个刻度以相等的距离放置?
如何使矢量两侧的两个刻度与矢量的边缘真正重合。(目前,矢量开头的刻度与矢量左侧的边缘不匹配)。
答案1
编辑于2017/03/22:
由于提出的两种解决方案仅限于直线,并且用户必须指定角度才能进行垂直标记,因此我采用了 的解决方案markers.asy
。实际上,markers.asy
似乎只有自动旋转的标记(相对于路径的局部切线)可用于 n+1 个均匀间隔标记之间的中点(以弧长为单位)。请参阅 Asymptote 文档中的示例。可以在细分点上进行标记,但它们具有固定的方向。
因此,我调整了一些例程,在路径的(等距、弧长)细分点上放置自动旋转标记。请查看以下代码
import markers;
unitsize(1cm);
pen pen1=blue+linewidth(2.5pt)+squarecap;
path p=(0,0)..(1,1)..(2,0);
draw(p, pen1,arrow=Arrow(size=9), TrueMargin(0pt,1.25pt));
markroutine markext_interval(int n=1, frame f, bool rotated=false)
{
return new void(picture pic=currentpicture,frame mark, path g) {
markuniform(centered=false,n,rotated)(pic,f,g);
};
}
draw(p,marker(markext_interval(10,stickframe(1,size=4mm,space=0mm,angle=0,offset=I*2mm,p=linewidth(3bp)+yellow), rotated=true)),p=invisible);
和图片
初始答案:
因为currentpen
是roundcap
(参见文档),所以第一个刻度(在矢量的开头)与矢量左侧的边缘不匹配。一种可能性是使用squarecap
。对于矢量的右侧部分,我没有完美的解决方案:使用TrueMargin(real begin, real end)
哪个(参见文档)允许直接以单位指定边距PostScript
,与笔线宽度无关。您可以在绘图矢量的开头和/或结尾添加边距。
此外,在您的代码中,第 6 行不正确。linewidth
应该在draw
命令中指定,而不是在中指定path
。
我获得
unitsize(1cm);
pen p1=blue+linewidth(2.5pt)+squarecap;
draw((0,0)--(2.82842,2.82842), p1,arrow=Arrow(size=9), TrueMargin(0pt,1.25pt));
path tick = (-0.1,0.1) -- (0,0);
draw(tick);
path tick = ((0.607,0.807) -- (0.707,0.707));//, linewidth(1.5pt));
draw(tick,linewidth(1.5pt));
path tick = (1.314,1.514) -- (1.414,1.414);
draw(tick);
path tick = (2.021,2.221) -- (2.121,2.121);
draw(tick);
path tick = (2.728,2.928) -- (2.828,2.828);
draw(tick);
下图
如果您愿意roundcap
尝试的话TrueMargin(1.25pt,1.25pt)
。
编辑于2017/03/20:Asymptote 包含一些用于放置标记的特定例程。
import markers;
path p=(0,0)--(2.82842,2.82842);
draw(p,marker(stickframe(1,size=4mm,angle=45,p=linewidth(1bp),offset=rotate(45)*I*2mm),markuniform(4)),p=invisible);
请注意angle=45
是垂直标记,而offset=rotate(45)*I*2mm
是2mm
标记size/2
的良好偏移。您可以使用p=linewidth(1bp)
笔来控制标记,而p=insivible
是不可见的笔(不重新绘制路径p
)。
奥格