接下来是一小段代码,用于显示along
一行文本。“bar”是我想要的。我的问题是如何获得“bar”的情况,无论是从“A 到 B”还是“B 到 A”。
一般都是画一条线,然后沿着线写文字,为了方便(不用考虑哪个点是起点哪个点是终点),文字的角度跟线的角度一致,没关系,谢谢from -- to
。
outputtemplate := "%j-%c.eps";
prologues := 1 ;
beginfig(1)
pair A, B;
A = (0,0);
B = (3cm,3cm);
draw A -- B;
label.top ("foo", origin) rotated angle(A-B) shifted 1/2[A, B];
label.top ("bar", origin) rotated angle(B-A) shifted 1/2[A, B];
endfig;
答案1
为了使文本大致从左到右移动,当角度不在 -90 到 90 的区间内时,可以向角度添加 180 度。(据我所知,输出angle
在 -180 到 180 的区间内。)
outputtemplate := "%j-%c.eps";
prologues := 3 ;
beginfig(1)
pair A, B, X, Y;
numeric ang;
def angletoright(expr P, Q) =
begingroup save ang;
ang := angle(P-Q);
if (ang <=-90) or (ang > 90): ang+180 else: ang fi
endgroup
enddef;
A = (0,0);
B = (3cm,3cm);
draw A -- B;
label.top ("bar", origin) rotated angletoright(B,A) shifted 1/2[A,B];
X = A shifted (.5cm,0);
Y = B shifted (.5cm,0);
draw X -- Y;
label.top ("foo", origin) rotated angletoright(X,Y) shifted 1/2[X,Y];
endfig;
end
的另一种定义angletoright
是取差向量并确保其xpart
为正,然后计算角度:
def lefttoright(expr P, Q) =
begingroup save Z; pair Z;
Z := P-Q;
if (xpart Z) < 0: -Z else: Z fi
endgroup
enddef;
def angletoright(expr P, Q) =
angle(lefttoright(P,Q))
enddef;