如何在箭头中放置整齐的刻度?

如何在箭头中放置整齐的刻度?

我有以下代码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);

和图片

在此处输入图片描述

初始答案: 因为currentpenroundcap(参见文档),所以第一个刻度(在矢量的开头)与矢量左侧的边缘不匹配。一种可能性是使用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*2mm2mm标记size/2的良好偏移。您可以使用p=linewidth(1bp)笔来控制标记,而p=insivible是不可见的笔(不重新绘制路径p)。

奥格

相关内容