我想使用 Asymptote 创建一个图形,该图形由很多圆圈组成,圆圈之间有线条。让我用两个圆圈举一个小例子。
pair a1=(4.5,2);
pair a2=(0,0);
real r=0.25;
path c1=circle(a1,r);
path c2=circle(a2,r);
draw(c1);
draw(c2);
现在,我尝试了几种方法来画一条简单但漂亮的线:
draw(a1--a2, arrow=MidArrow(size=8));
draw(c1--c2, arrow=MidArrow(size=8));
draw(a1+(0,-r)--a2+(0,r), arrow=MidArrow(size=8));
它们都没有给出我想要的结果。第一个在圆圈内有线段,第二个没有从逻辑位置开始线条,第三个解决方案看起来不自然。我想要的是直线a1--a2
,即两个圆圈之间的最短线条,但没有圆圈内的线段。
有没有办法将这条线的r
两边缩短?这样我就不必计算线a1--a2
与圆相交的精确坐标,因为我希望能够移动圆。
答案1
类似这样的事?
其组合删除了位于firstcut(p, c1).after
路径的部分p
前它与c1
和 的交点,删除位于 的lastcut(q, c2).before
路径部分 q
后它与 的交点c2
。请参阅 Asympote 的主手册,第 35 页。
unitsize(2cm);
pair a1=(4.5,2);
pair a2=(0,0);
real r=0.25;
path c1=circle(a1,r);
path c2=circle(a2,r);
draw(c1);
draw(c2);
//draw(a1--a2, arrow=MidArrow(size=8));
draw(lastcut(firstcut(a1--a2, c1).after, c2).before, arrow=MidArrow(size=8));
答案2
@Franck 有一个很好的答案,但也许更简单的解决方案是先画箭头,然后画并填充圆圈。
unitsize(1cm);
pair a1=(4.5,2);
pair a2=(0,0);
real r=0.25;
path c1=circle(a1,r);
path c2=circle(a2,r);
draw(a1--a2, arrow=MidArrow(size=8));
filldraw(c1, white);
filldraw(c2, white);