在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}
结果是:
笔记
我已将其包装在
luamplib
包装器中,因此您需要使用 编译此示例lualatex
,它将在一个步骤中生成 PDF。您不必使用此工作流程;您可以简单地从 复制到 到beginfig(1)
您endfig
现有的 MP 模板并使用您现有的工作流程。但我建议您使用界面luamplib
。您将获得完全相同的 MP 引擎,但字体处理要简单得多。话虽如此,文档仍然缺乏,调试也更困难,因此请选择最适合您的工作流程。我已经将变量声明为
numeric
- 您不必这样做,因为未声明的变量是隐式的numeric
,但我更喜欢声明它们并确保它们在我的图形开始时没有现有值。我直接使用了
mm
单位,而不是按照惯例创建自己的单位u
。这只是使用 MP 的另一种方式。然后,我将所有点声明为单独的
x
s 和y
s。按照惯例(实际上是通过普通 Metapost 中定义的宏),如果您有一个点,z0
则可以将 x 部分称为,x0
将 y 部分称为y0
等,特别是,如果方便的话,您可以单独分配x0
和。y0
为了制作
section
形状,我使用了内联 for 循环,但你显然可以将其写成section = z0--z1--z2--
...等等。这里唯一要注意的是,在循环内部,你必须将后缀放在括号中,以便正确解析它。一旦将其定义
section
为路径,您就可以复制、旋转、移动它等,如图所示。这就是为什么您不需要“相对”路径构造宏的原因。(在我看来)。
希望有所帮助。