在 Asymptote 中向路径添加多个箭头的正确方法是什么?

在 Asymptote 中向路径添加多个箭头的正确方法是什么?

我检查了 Asymptote 文档此链接,只能按照下面的方法手动添加多个箭头。但是箭头之间的距离并不是统一的,而是取决于路径的长度,这是意料之外的。

在此处输入图片描述

// http://asymptote.ualberta.ca/
unitsize(1cm);
pair A=(1,1), B=(4,3), C=(5,1);

for (real i: new real[] {.48,.5,.52}) {
draw(A--B,Arrow(TeXHead,Relative(i)));
draw(B--C,Arrow(TeXHead,Relative(i)));
draw(A--C,Arrow(TeXHead,Relative(i)));
}

dot(A^^B^^C);
label("$A$",A,SW);
label("$B$",B,N);
label("$C$",C,E);

当我们可以添加 2 个箭头时,这有点奇怪

draw(A--B,
Arrow(TeXHead,Relative(.45)),
Arrow(TeXHead,Relative(.5))
); /// <<< OK!

但我们不能添加 3 个箭头

draw(A--B,
Arrow(TeXHead,Relative(.45)),
Arrow(TeXHead,Relative(.5)),
Arrow(TeXHead,Relative(.55))
);    // <<< not OK

问题在 Asymptote 中向路径(直线或曲线)添加多个箭头的正确方法是什么?

答案1

我得出以下解决方案,但仍有更好的解决方案。我的简单想法是将 转换arctimereltime在 中使用Arrow(Relative(i))。它适用于直线和曲线。要使箭头位于中点或刚好接触曲线的末端,需要进行更多计算。

在此处输入图片描述

unitsize(1cm);
pair A=(1,1), B=(4,3), C=(5,1);
DefaultHead=TeXHead;
// adding n arrows with distance d between arrowheads, 
// starting at point of length s from the begining of the path p
void addarrow(path p, int n=1, real s, real d=0){
for (int i=0; i<n; ++i){
pair M=arcpoint(p,s+i*d); // starting arrowhead
real TM=arctime(p,s+i*d); 
real LM=arclength(subpath(p,0,TM));
real tM=LM/arclength(p); // change to reltime
draw(p,Arrow(Relative(tM)));
}
}

addarrow(B--C,n=3,1,.1);
addarrow(A--B,n=4,2,.1);
path p=A.. controls A + dir(-45) and C+dir(-120) .. C;
addarrow(p,n=5,1.5,.15);

dot(A^^B^^C);
label("$A$",A,SW);
label("$B$",B,N);
label("$C$",C,E);

DefaultHead=HookHead;

在此处输入图片描述

addarrow(B--C,n=3,.8,.5);
addarrow(A--B,n=4,1.5,.4);
path p=A.. controls A + dir(-45) and C+dir(-120) .. C;
addarrow(p,n=5,1.5,.2);

相关内容