Metapost 元柱方程

Metapost 元柱方程,metapost,Metapost,我的一门课程给了我一个家庭作业,要求我们用谷歌搜索Metapost语言,并在该语言中找到方程求解功能的用法。 在浏览了Metapost用户手册的前十几页后,我发现只有一个原因说明了它为什么有用,那就是“允许编写许多程序” 基本上是陈述式的风格。” 除了说明它使编程更加“声明性”(据我所知,这意味着我们告诉语言该做什么,而不是如何做)之外,我想不出任何其他原因来解释为什么方程求解是有用的。 有人能帮我吗?这里有一个例子,说明了在MetaPost和声明式编程中求解方程是如何有用的 假设我们想要画一个

我的一门课程给了我一个家庭作业,要求我们用谷歌搜索Metapost语言,并在该语言中找到方程求解功能的用法。 在浏览了Metapost用户手册的前十几页后,我发现只有一个原因说明了它为什么有用,那就是“允许编写许多程序” 基本上是陈述式的风格。” 除了说明它使编程更加“声明性”(据我所知,这意味着我们告诉语言该做什么,而不是如何做)之外,我想不出任何其他原因来解释为什么方程求解是有用的。
有人能帮我吗?

这里有一个例子,说明了在MetaPost和声明式编程中求解方程是如何有用的

假设我们想要画一个:

为此,让我们首先定义一个宏,它将绘制模具的一个面:一个上面有数字
s
的正方形

def face (expr s) = image (begingroup
    pickup pencircle scaled 1pt;
    draw (0.5, 0.5) -- (0.5, 9.5) -- (9.5, 9.5) -- (9.5, 0.5) -- cycle;
    label (s, (5, 5));
endgroup) scaled 10 enddef;
现在,我们可以绘制它并获得图片:

draw face ("1");

接下来,我们需要一个上脸和一个右脸。为了绘制它们,我们必须组成一个仿射变换来倾斜它们。这可能很棘手,因为唯一可用的倾斜基本体转换是倾斜a,它将点
(x,y)
转换为
(x+ay,y)
。这是我们的图片倾斜1:

draw face ("2") slanted 1;

然后(或者更确切地说,在此之前)我们必须按其中一个坐标进行缩放:

draw face ("2") yscaled 0.35 slanted 1;

同样的方法不适用于第三个面:

draw face ("3") xscaled 0.35 slanted 1;

经过一点实验,我们找到了正确的代码:

draw face ("3") rotated 90 yscaled 0.35 slanted -1 rotated -90;

但是为什么要这么单调呢?我们确切地知道我们需要什么样的转变。表达它的一种自然方式是使用原语。但若这被证明是不直观的,就像我们的最后一行一样,那个么只指定平面的哪些点转换到哪个点可能会更舒服

transform t;
(0, 0) transformed t = (0, 0);
(0, 1) transformed t = (0.35, 0.35);
(1, 0) transformed t = (1, 0);
draw face ("3") transformed t;
这基本上告诉了MetaPost:有一个变换
t
,在该变换下,我们指定的三个点移动到我们指定的其他三个点。结果表明,这唯一地决定了平面变换,我们得到了相同的图片:

draw face ("1");

把所有这些放在一起(文章末尾的代码是
beginfig(7)
),让我们终于看到了死亡:

在这种简单的情况下,“坐标和方程”方法的难度与“原始变换”方法相当。现在,想象一下我们想让立方体稍微倾斜一下。使用相同的声明性方法,在不调用三维几何体的情况下仍然是可能的(文章末尾的代码是
beginfig(8)
):


完整的程序如下

prologues := 3;

def face (expr s) = image (begingroup
    pickup pencircle scaled 1pt;
    draw (0.5, 0.5) -- (0.5, 9.5) -- (9.5, 9.5) -- (9.5, 0.5) -- cycle;
    label (s, (5, 5));
endgroup) scaled 10 enddef;

beginfig (1)
    draw face ("1");
endfig;

beginfig (2)
    draw face ("2") slanted 1;
endfig;

beginfig (3)
    draw face ("2") yscaled 0.35 slanted 1;
endfig;

beginfig (4)
    draw face ("3") xscaled 0.35 slanted 1;
endfig;

beginfig (5)
    draw face ("3") rotated 90 yscaled 0.35 slanted -1 rotated -90;
endfig;

beginfig (6)
    transform t;
    (0, 0) transformed t = (0, 0);
    (0, 1) transformed t = (0, 1);
    (1, 0) transformed t = (0.35, 0.35);
    draw face ("3") transformed t;
endfig;

beginfig (7)
    transform t [];

    draw face ("1");

    (0, 0) transformed t[1] = (0, 0);
    (0, 1) transformed t[1] = (0.35, 0.35);
    (1, 0) transformed t[1] = (1, 0);
    draw face ("2") transformed t[1] shifted (0, 100);

    (0, 0) transformed t[2] = (0, 0);
    (0, 1) transformed t[2] = (0, 1);
    (1, 0) transformed t[2] = (0.35, 0.35);
    draw face ("3") transformed t[2] shifted (100, 0);
endfig;

beginfig (8)
    transform t [];
    pair Ox, Oy, Oz;
    Ox = (0.86, -0.21);
    Oy = (0.21, 0.86);
    Oz = (0.29, 0.44);

    (0, 0) transformed t[1] = (0, 0);
    (1, 0) transformed t[1] = Ox;
    (0, 1) transformed t[1] = Oy;
    draw face ("4") transformed t[1];

    (0, 0) transformed t[2] = (0, 0);
    (1, 0) transformed t[2] = Ox;
    (0, 1) transformed t[2] = Oz;
    draw face ("5") transformed t[2] shifted (Oy scaled 100);

    (0, 0) transformed t[3] = (0, 0);
    (1, 0) transformed t[3] = Oz;
    (0, 1) transformed t[3] = Oy;
    draw face ("6") transformed t[3] shifted (Ox scaled 100);
endfig;

end

这样我就不会问家庭作业问题了。