Metapost:以相对协调的方式绘制

Metapost:以相对协调的方式绘制

在Metapost中我们这样绘制:

    draw--(0,0)--(1,0)--(1,1)    

并且所有坐标都是以原点 (0,0) 为基准的。我们可以用相对坐标系来绘制吗?例如,绘制 (0,0)--(1,0) 部分后,第三个点相对于第二个点 (1, 0) 为 (0,1),我们怎么能这样绘制 @(1,0)--(0,1)?@意思是relative to。基于同一原点定义所有点是很痛苦的。

编辑 1:添加了代码

numeric u;
u := 1;
depth := 612u;
width := 229u;
tf := 19.6u;
tw := 11.9u;
r := 14u;

b := (width - tw) / 2;
hw := depth - 2 * tf;

beginfig(1)
  pair p[];

  p1 := (0, 0);
  p2 := (width, 0);
  p3 := (width, tf);
  p4 := ((b + tw), tf);
  p5 := ((b + tw), (hw + tf));
  p6 := (width, (hw + tf));
  p7 := (width, (hw + 2 * tf));
  p8 := (0, (hw + 2 * tf));
  p9 := (0, (hw + tf));
  p10 := (b, (hw + tf));
  p11 := (b, tf);
  p12 := (0, tf);

  draw p1--p2--p3--p4--p5--p6--p7--p8--p9--p10--p11--p12--cycle;
endfig

该图是

在此处输入图片描述

编辑 2:定义相对坐标中的点。正如 Thruston 所说,应该有更有效的方法,但目前我还不知道。

接下来是Metapost代码。

outputtemplate := "%j-%c.mps";
prologues := 1;

numeric u;
u := 0.1mm; % scale: 1:10

% section
depth := 612u;
width := 229u;
tf := 19.6u;
tw := 11.9u;
r := 14u;

% some calculation
b := (width - tw) / 2;
hw := depth - 2 * tf;

% relative coordination
def draw_WB_section (expr base) =
  save p;
  pair p[];

  p1 := base;
  p2 := p1 + (width, 0);
  p3 := p2 + (0, tf);
  p4 := p3 - (b, 0);
  p5 := p4 + (0, hw);
  p6 := p5 + (b, 0);
  p7 := p6 + (0, tf);
  p8 := p7 - (width, 0);
  p9 := p8 - (0, tf);
  p10 := p9 + (b, 0);
  p11 := p10 - (0, hw);
  p12 := p11 - (b, 0);

  draw p1--p2--p3--p4--p5--p6--p7--p8--p9--p10--p11--p12--cycle;
enddef;

beginfig(1)
  pair p[];

  % absolute coordination
  p1 := (0, 0);
  p2 := (width, 0);
  p3 := (width, tf);
  p4 := ((b + tw), tf);
  p5 := ((b + tw), (hw + tf));
  p6 := (width, (hw + tf));
  p7 := (width, (hw + 2 * tf));
  p8 := (0, (hw + 2 * tf));
  p9 := (0, (hw + tf));
  p10 := (b, (hw + tf));
  p11 := (b, tf);
  p12 := (0, tf);

  draw p1--p2--p3--p4--p5--p6--p7--p8--p9--p10--p11--p12--cycle;
  draw_WB_section ((70,-10));
endfig

接下来是 Latex 代码。

\documentclass[a4paper]{article}  
\usepackage{graphics}  
\begin{document}  
\includegraphics{WB-1.mps}  
\end{document}

接下来是编译。

mpost WB.mp
pdflatex WB.tex

接下来是 PDF 输出。

在此处输入图片描述

答案1

以下是我对该图表的编码方法:

\RequirePackage{luatex85}
\documentclass[border=5mm]{standalone}
\usepackage{luamplib}
\begin{document}
\mplibtextextlabel{enable}
\begin{mplibcode}
    beginfig(1);
        numeric w, h, tf, tw;
        w = 22.9mm; h = 61.2mm; tf = 1.96mm; tw = 1.19mm;

        x0 = x7 = x8 = x11 = 0;
        x1 = x2 = x5 = x6 = w;
        x3 = x4 = 1/2(w+tw);
        x9 = x10 = 1/2(w-tw);

        y0 = y1 = 0;
        y2 = y3 = y10 = y11 = tf;
        y4 = y5 = y8 = y9 = h - tf;
        y6 = y7 = h;

        path section;
        section = for i=0 upto 11: z[i] -- endfor cycle;

        path A, B;
        A = section rotated 30;
        B = section shifted (30mm,-10mm);

        fill A withcolor 3/4[red,white]; draw A;
        fill B withcolor 3/4[blue,white]; draw B;

    endfig;
\end{mplibcode}
\end{document}

结果是:

在此处输入图片描述

笔记

  1. 我已将其包装在luamplib包装器中,因此您需要使用 编译此示例lualatex,它将在一个步骤中生成 PDF。您不必使用此工作流程;您可以简单地从 复制到 到beginfig(1)endfig现有的 MP 模板并使用您现有的工作流程。但我建议您使用界面luamplib。您将获得完全相同的 MP 引擎,但字体处理要简单得多。话虽如此,文档仍然缺乏,调试也更困难,因此请选择最适合您的工作流程。

  2. 我已经将变量声明为numeric- 您不必这样做,因为未声明的变量是隐式的numeric,但我更喜欢声明它们并确保它们在我的图形开始时没有现有值。

  3. 我直接使用了mm单位,而不是按照惯例创建自己的单位u。这只是使用 MP 的另一种方式。

  4. 然后,我将所有点声明为单独的xs 和ys。按照惯例(实际上是通过普通 Metapost 中定义的宏),如果您有一个点,z0则可以将 x 部分称为,x0将 y 部分称为y0等,特别是,如果方便的话,您可以单独分配x0和。y0

  5. 为了制作section形状,我使用了内联 for 循环,但你显然可以将其写成section = z0--z1--z2--...等等。这里唯一要注意的是,在循环内部,你必须将后缀放在括号中,以便正确解析它。

  6. 一旦将其定义section为路径,您就可以复制、旋转、移动它等,如图所示。这就是为什么您不需要“相对”路径构造宏的原因。(在我看来)。

希望有所帮助。

相关内容