在我的課程中,我被授予了一項家庭作業,要求我們Google Metapost語言,並找到語言中解決方程式功能的用法。 閱讀了Metapost用戶手冊的前十幾頁之後,我發現只有一個理由說明它爲什麼很有用,它是「允許許多程序以 寫成一個很大程度上聲明式的風格。」 除了聲明它使得編程更加「聲明性」(根據我的理解,這意味着我們告訴語言該做什麼而不是如何去做)我想不出爲什麼解決方案有用的任何其他原因。 任何人都可以幫我嗎?Metapost Equation
2
A
回答
2
下面是如何解決MetaPost —和聲明性編程中的方程式,對此—可能有用。
假設我們要畫一個die:
要做到這一點,讓我們先定義一個宏,這將引起芯片的單個面上:上面有數字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");
接下來,我們需要一個頂面和右側面。爲了繪製它們,我們將不得不組成一個仿射變換來扭曲它們。這可能是棘手的,因爲傾斜的唯一可用的基元轉換是slanted 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
,根據該三個點,我們指定移動到我們指定的其他三個點。原來,這個唯一地確定一個平面變換,我們得到了相同的圖片:
把所有在一起(代碼是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
相關問題
- 1. Java Script Mathmatic Equation
- 2. Intermembral index equation
- 3. Python scipy.special.mathieu equation
- 4. SQL Equation =>圖像?
- 5. 奇怪MetaPost的括號錯誤
- 6. 是否有可能包含一個MetaPost文件到另一個?
- 7. MetaPost的:使用循環變量在標籤
- 8. 是否有預覽LaTeX和MetaPost文件的工具?
- 9. 如何使用metapost生成多邊形數字圖形?
- 10. MATLAB:找到與「solve」的交點[circle + linear equation]
- 11. 如何將Open Xml Math Equation轉換爲MathML
- 12. Frontier Equation - 將多項式擬合到數據集的頂部
- 13. 如何使用jQuery-Tooltip或類似工具編輯「MathJax equation」?
- 14. 函數集成貝塞爾函數
- 15. 在Ruby上製作計算器時出錯?
- 16. SymPy:爲什麼如果公式列表中的「solve」有時會失敗?
- 17. WinEdt highliting開關:如何跳過嵌套的STOP符號?
- 18. Java - 正則表達式替換美元符號之間的文本
- 19. 失蹤$插入
- 20. 如何從二次方程得到ABC參數?
- 21. Emacs組織模式:使用膠乳預覽增加公式編號
- 22. 支持轉換爲Boolean但仍然已經使用的ToString
- 23. 用戶輸入字符串公式,轉換爲int答案C#
- 24. 只計算在計算器上的工作
- 25. int形式的字符串方程式答案
- 26. 以這種方式處理方程是否安全?
- 27. 計算器微軟視覺工作室2010
- 28. 錯誤的行爲
- 29. 如何在字符串中添加十進制數字?
- 30. ValueError異常:不支持的格式字符「
我會避免在SO上問作業問題。 – dardo