Metapost:沿线的文本

Metapost:沿线的文本

接下来是一小段代码,用于显示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;

相关内容