首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Metapost方程

Metapost方程
EN

Stack Overflow用户
提问于 2012-11-03 03:35:53
回答 1查看 221关注 0票数 2

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

EN

回答 1

Stack Overflow用户

发布于 2014-03-28 18:10:51

这里有一个用MetaPost和声明性编程求解方程式的例子,可能会很有用。

假设我们想要绘制一个die

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

代码语言:javascript
复制
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;

现在我们可以绘制它并得到图片:

代码语言:javascript
复制
draw face ("1");

接下来,我们需要一个上面和一个右面。为了绘制它们,我们将不得不组成一个仿射变换来倾斜它们。这可能很棘手,因为唯一现成的用于偏斜的原语转换是slanted a,它将点(x, y)转换为(x + ay, y)。这是我们的图片倾斜了1:

代码语言:javascript
复制
draw face ("2") slanted 1;

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

代码语言:javascript
复制
draw face ("2") yscaled 0.35 slanted 1;

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

代码语言:javascript
复制
draw face ("3") xscaled 0.35 slanted 1;

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

代码语言:javascript
复制
draw face ("3") rotated 90 yscaled 0.35 slanted -1 rotated -90;

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

代码语言:javascript
复制
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,在该转换下,我们指定的三个点移动到我们指定的其他三个点。事实证明,这唯一地决定了一个平面变换,我们得到了相同的图像:

把所有这些放在一起(post末尾的代码是beginfig (7) )让我们最终看到我们的骰子:

在这种简单的情况下,“坐标和方程”方法在难度上与“基元变换”方法相当。现在,假设我们想让立方体稍微倾斜一下。使用相同的声明式方法,仍然可以在不调用三维几何图形的情况下实现(代码在post结束时为beginfig (8) ):

完整的程序如下。

代码语言:javascript
复制
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
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13201891

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档