Metafun:点和路径的相对定位

Metafun:点和路径的相对定位

我读完了 Metafun 手册的大部分内容,但似乎找不到任何关于相对定位系统的提及。我想到了两个用例。首先,我想根据与先前点相关的路径定位点,类似于++tikz 中的符号。其次,我想将复杂的形状彼此相距一定距离。

我不知道如何使用 Metafun 来处理第一种情况,但这里有一个工作示例(在 ConTeXt 中),用于在 tikz 中通过连续加法增量绘制一条线:

%&context
\usemodule[tikz]
\starttext

\starttikzpicture
  \path[draw, black] (0cm, 0cm) -- ++(1cm, 0cm) -- ++(0cm, 1cm);
\stoptikzpicture

% vs. absolute positioning in Metafun

\startMPcode
  draw (0cm, 0cm) -- (1cm, 0cm) -- (1cm, 1cm);
\stopMPcode

\stoptext

对于最简单的情况,可以用第二种情况来解决xshifted,但如果路径/图片的尺寸发生变化,就需要进行多次编辑。

%&context 
\starttext

\startMPcode
  path P;  
  % Works with one set of sizes
  P = fullcircle;
  draw P scaled 1cm;
  draw P scaled 1cm xshifted 2cm;
\stopMPcode

\startMPcode
  path P;
  % xshift distance must be manually adapted with size changes
  P = fullcircle;
  draw P scaled 2cm;
  draw P scaled 1cm xshifted 1cm;
\stopMPcode

\stoptext

我在类似命令中找到了相对定位的示例label.rt,并且我知道盒装,但如果存在的话,我正在寻找一种更通用的方法——比如设置路径上任意点之间的距离,而不是定义边界框。

答案1

在我看来,MetaPost 是一种比 TikZ 更具声明性的语言。因此,如果需要相对坐标,我只需定义它们:

\starttext

\startMPpage[offset=1mm]
  z0 = origin;
  z1 = z0 + (1cm, 0cm);
  z2 = z1 + (0cm, 1cm);

  draw z0 -- z1 -- z2;
\stopMPpage

\stoptext

可以沿着路径分配变量,但这并不好看!

\starttext
\startMPpage[offset=1mm]
  z0 = origin;

  draw z0 -- hide (z1 = z0 + (1cm,0cm);) z1
       -- hide (z2 = z1 + (0cm, 1cm);) z2;
\stopMPpage
\stoptext

但是,将其包装在宏后面并获得更好的界面相对简单:

\starttext
\startMPdefinitions
  pair _interpolated_point;
  primarydef a --++ b = 
      a -- hide (_interpolated_point := a + b;)
      _interpolated_point
  enddef;
\stopMPdefinitions

\startMPpage[offset=1mm]
  draw origin --++ (1cm, 0) --++ (0, 1cm);
\stopMPpage

\stoptext

我不太清楚第二个问题问的是什么。

相关内容