我是渐近线方面的初学者。
我想从点 B 到点 A 画一条线(带箭头的曲线),该线的张力比正常情况下更大(导致环路更小)。我决定创建一个函数来计算 A 和 B 之间的点 C,然后创建一条经过该点的路径,如下所示:B..C..A。
使用“dot”绘制点时,我发现它的位置很好。但是,在 add(...) 中使用“dot”,该点的位置不同,因此(红)线的位置也不同。
我错过了什么?
这是我得到的代码和图像:
real u = 8cm;
unitsize(u);
real m = 3mm;
pair inbetween(pair a, pair b, real y)
{
return ( (b.x - a.x)*0.5 + a.x, y );
}
pair pos3 = (3,0);
pair pos4 = (4,0);
object n3 = draw("n3",box,pos3,m);
object n4 = draw("n4",box,pos4,m);
pair p4_3 = inbetween(pos3, pos4, -1);
dot(p4_3);
add(new void(picture pic, transform t) {
path c = point(n4,E,t){SE}..{NE}point(n3,W,t);
draw(pic, c, Arrow );
dot(pic,p4_3,red);
path c = point(n4,E,t){SE}..p4_3..{NE}point(n3,W,t);
draw(pic, c, red, Arrow );
});
答案1
这并不能直接回答您的问题,但我认为它提供了一种更简单的方法来完成您想要完成的任务:
real u = 8cm;
unitsize(u);
real m = 3mm;
pair inbetween(pair a, pair b, real y)
{
return ( (b.x - a.x)*0.5 + a.x, y );
}
pair pos3 = (3,0);
pair pos4 = (4,0);
// Using currentpicture.copy() preserves the size information.
picture n3=currentpicture.copy(), n4=currentpicture.copy();
draw(n3,"n3",box,pos3,m);
add(n3);
draw(n4,"n4",box,pos4,m);
add(n4);
pair p4_3 = inbetween(pos3, pos4, -1);
dot(p4_3);
pair a = truepoint(n4,E,user=true);
pair b = truepoint(n3,W,user=true);
draw(a{SE} .. p4_3 .. {NE}b, arrow=Arrow());
结果:(请注意,如果您愿意使用,那么巨大的边界框是固定的settings.outformat = "pdf";
。)
我还要指出的是,还有另一种内置方法来指定张力,尽管结果与你所做的并不相同:
settings.outformat="pdf";
real u = 8cm;
unitsize(u);
real m = 3mm;
pair pos3 = (3,0);
pair pos4 = (4,0);
// Using currentpicture.copy() preserves the size information.
picture n3=currentpicture.copy(), n4=currentpicture.copy();
draw(n3,"n3",box,pos3,m);
add(n3);
draw(n4,"n4",box,pos4,m);
add(n4);
pair a = truepoint(n4,E,user=true);
pair b = truepoint(n3,W,user=true);
//A more built-in way to handle tension:
int n = 5;
for (int i = 1; i <= n; ++i) {
real weight = i/n;
pen thepen = weight*blue + (1-weight)*red;
draw(a{SE} .. tension i .. {NE}b, p=thepen, arrow=Arrow(TeXHead));
}