2012-11-02 67 views
2

在我的課程中,我被授予了一項家庭作業,要求我們Google Metapost語言,並找到語言中解決方程式功能的用法。 閱讀了Metapost用戶手冊的前十幾頁之後,我發現只有一個理由說明它爲什麼很有用,它是「允許許多程序以 寫成一個很大程度上聲明式的風格。」 除了聲明它使得編程更加「聲明性」(根據我的理解,這意味着我們告訴語言該做什麼而不是如何去做)我想不出爲什麼解決方案有用的任何其他原因。 任何人都可以幫我嗎?Metapost Equation

+0

我會避免在SO上問作業問題。 – dardo

回答

2

下面是如何解決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)在帖子結尾)可以讓我們終於看到我們的模具:

在這個簡單的情況下,「座標和方程」方法是困難的「基本變換」方法相媲美。現在,想象我們想要我們的立方體略微傾斜。在相同的聲明的方式,這將是不調用三維幾何仍有可能(代碼爲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 
相關問題