gpt4 book ai didi

Metapost 方程

转载 作者:行者123 更新时间:2023-12-04 05:26:02 35 4
gpt4 key购买 nike

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

最佳答案

这是一个说明如何在 MetaPost 中求解方程 - 以及声明式编程,就此而言 - 可能是有用的。

假设我们要画一个 die :

pic 0

为此,让我们首先定义一个宏来绘制骰子的单个面:一个编号为 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");

pic 1

接下来,我们需要一个上脸和一个右脸。为了绘制它们,我们必须编写一个仿射变换来扭曲它们。这可能很棘手,因为唯一容易获得的用于倾斜的原始变换是 slanted a转换点 (x, y)进入 (x + ay, y) .这是我们倾斜1的图片:
draw face ("2") slanted 1;

pic 2

然后(或者更确切地说,在此之前)我们必须按以下坐标之一进行缩放:
draw face ("2") yscaled 0.35 slanted 1;

pic 3

同样的方法不适用于第三张脸:
draw face ("3") xscaled 0.35 slanted 1;

pic 4

经过一些实验,我们找到了正确的代码:
draw face ("3") rotated 90 yscaled 0.35 slanted -1 rotated -90;

pic 5

但为什么所有的乏味?我们确切地知道我们需要什么样的转变。表达它的一种自然方式是使用基元。但如果这被证明是不直观的,就像我们的最后一行一样,只指定平面的哪些点变换到哪些点可能会更舒服。
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 ,在其下我们指定的三个点移动到我们指定的其他三个点。事实证明,这唯一地确定了平面变换,我们得到了相同的图片:

pic 6

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

pic 7

在这个简单的例子中,“坐标和方程”方法在难度上与“原始变换”方法相当。现在,想象一下我们想要稍微倾斜我们的立方体。使用相同的声明式方法,仍然可以不调用三维几何(代码为 beginfig (8) 在帖子末尾):

pic 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

关于Metapost 方程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13201891/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com