OpenSCAD 使用者手冊/數學函式
三角函式使用 C 語言數學函式,而這些函式又基於二進位制浮點數數學,在計算過程中使用實數的近似值。 OpenSCAD 的數學函式使用 C++ 的 'double' 型別,在 Value.h/Value.cc 中,
有關 C 庫數學函式細節的良好資源(例如有效輸入/輸出範圍)可以在 Open Group 網站找到 math.h 和 acos
度的數學 餘弦 函式。 參見 餘弦
引數
- <degrees>
- 十進位制。角度以度為單位。
| 使用示例 | |
for(i=[0:36])
translate([i*10,0,0])
cylinder(r=5,h=cos(i*10)*50+60);
|
數學 正弦 函式。 參見 正弦
引數
- <degrees>
- 十進位制。角度以度為單位。
| 使用示例 1 | |
for (i = [0:5]) {
echo(360*i/6, sin(360*i/6)*80, cos(360*i/6)*80);
translate([sin(360*i/6)*80, cos(360*i/6)*80, 0 ])
cylinder(h = 200, r=10);
}
|
| 使用示例 2 | |
for(i=[0:36])
translate([i*10,0,0])
cylinder(r=5,h=sin(i*10)*50+60);
|
數學 正切 函式。 參見 正切
引數
- <degrees>
- 十進位制。角度以度為單位。
| 使用示例 | |
for (i = [0:5]) {
echo(360*i/6, tan(360*i/6)*80);
translate([tan(360*i/6)*80, 0, 0 ])
cylinder(h = 200, r=10);
}
|
數學 反餘弦 或 反餘弦,以度為單位表示。 參見:反三角函式
數學 反正弦 或 反正弦,以度為單位表示。 參見:反三角函式
數學 反正切 或 反正切 函式。 以度為單位返回 x 的反正切的主值。 atan 無法區分 y/x 和 -y/-x,並返回 -90 到 +90 的角度。 參見:atan2 以及 反三角函式
數學 二引數反正切 函式 atan2(y,x) 涵蓋完整的 360 度。 此函式返回 x 軸與向量(x,y) 之間形成的完整角度(0-360),以度為單位表示。
使用示例
atan2(5.0,-5.0); //result: 135 degrees. atan() would give -45 atan2(y,x); //angle between (1,0) and (x,y) = angle around z-axis
數學 絕對值 函式。 返回帶符號十進位制數的正值。
使用示例
abs(-5.0); returns 5.0 abs(0); returns 0.0 abs(8.0); returns 8.0
數學 向上取整 函式。
透過向上舍入值(如有必要)返回下一個最高的整數值。
參見:向上取整函式
echo(ceil(4.4),ceil(-4.4)); // produces ECHO: 5, -4
[注意: 需要版本 2015.03]
返回一個新的向量,它是附加了提供的向量的元素的結果。
如果一個引數是向量,則向量的元素將被單獨附加到結果向量。 字串在這種情況下與向量不同。
使用示例
echo(concat("a","b","c","d","e","f")); // produces ECHO: ["a", "b", "c", "d", "e", "f"]
echo(concat(["a","b","c"],["d","e","f"])); // produces ECHO: ["a", "b", "c", "d", "e", "f"]
echo(concat(1,2,3,4,5,6)); // produces ECHO: [1, 2, 3, 4, 5, 6]
向量向量
echo(concat([ [1],[2] ], [ [3] ])); // produces ECHO: [[1], [2], [3]]
注意: 傳遞給函式的所有向量都會失去一個巢狀級別。 當新增諸如單個元素 [x, y, z] 元組(也是向量)之類的元素時,在連線之前,元組需要用向量(即額外的括號)括起來。 在下面的示例中,一個第四點被新增到多邊形路徑中,該路徑以前類似於三角形,現在將其變成一個正方形
polygon(concat([[0,0],[0,5],[5,5]], [[5,0]]));
與字串對比
echo(concat([1,2,3],[4,5,6])); // produces ECHO: [1, 2, 3, 4, 5, 6]
echo(concat("abc","def")); // produces ECHO: ["abc", "def"]
echo(str("abc","def")); // produces ECHO: "abcdef"
計算 3D 或 2D 空間中兩個向量的叉積。 如果兩個向量都在 3D 中,結果是一個垂直於兩個輸入向量的向量。 如果兩個向量都在 2D 空間中,它們的叉積具有 [0,0,z] 的形式,並且叉積函式僅返回叉積的 z 值
cross([x,y], [u,v]) = x*v - y*u
請注意,這是 2x2 矩陣 [[x,y],[u,v]] 的行列式。 使用任何其他型別,長度不同於 2 或 3 的向量,或者長度不同的向量會產生 'undef'。
使用示例
echo(cross([2, 3, 4], [5, 6, 7])); // produces ECHO: [-3, 6, -3] echo(cross([2, 1, -3], [0, 4, 5])); // produces ECHO: [17, -10, 8] echo(cross([2, 1], [0, 4])); // produces ECHO: 8 echo(cross([1, -3], [4, 5])); // produces ECHO: 17 echo(cross([2, 1, -3], [4, 5])); // produces ECHO: undef echo(cross([2, 3, 4], "5")); // produces ECHO: undef
對於 2D 或 3D 中的任何兩個向量 a 和 b,以下成立
cross(a,b) == -cross(b,a)
數學 **exp** 函式。返回 x 的以 e 為底的指數函式,即 e 的 x 次方。參見:指數
echo(exp(1),exp(ln(3)*4)); // produces ECHO: 2.71828, 81
數學 **floor** 函式。floor(x) = 不大於 x 的最大整數
參見:向下取整函式
echo(floor(4.4),floor(-4.4)); // produces ECHO: 4, -5
數學 **自然對數**。參見:自然對數
數學 **長度** 函式。返回陣列、向量或字串引數的長度。
使用示例
str1="abcdef"; len_str1=len(str1); echo(str1,len_str1); a=6; len_a=len(a); echo(a,len_a); array1=[1,2,3,4,5,6,7,8]; len_array1=len(array1); echo(array1,len_array1); array2=[[0,0],[0,1],[1,0],[1,1]]; len_array2=len(array2); echo(array2,len_array2); len_array2_2=len(array2[2]); echo(array2[2],len_array2_2);
結果
WARNING: len() parameter could not be converted in file , line 4 ECHO: "abcdef", 6 ECHO: 6, undef ECHO: [1, 2, 3, 4, 5, 6, 7, 8], 8 ECHO: [[0, 0], [0, 1], [1, 0], [1, 1]], 4 ECHO: [1, 0], 2
此函式允許(例如)解析陣列、向量或字串。
使用示例
str2="4711";
for (i=[0:len(str2)-1])
echo(str("digit ",i+1," : ",str2[i]));
結果
ECHO: "digit 1 : 4" ECHO: "digit 2 : 7" ECHO: "digit 3 : 1" ECHO: "digit 4 : 1"
請注意,當將簡單變數作為引數傳遞時,len() 函式未定義並會引發警告。
這在處理模組引數時很有用,類似於形狀可以定義為單個數字,也可以定義為 [x,y,z] 向量;即 cube(5) 或 cube([5,5,5])
例如
module doIt(size) {
if (len(size) == undef) {
// size is a number, use it for x,y & z. (or could be undef)
do([size,size,size]);
} else {
// size is a vector, (could be a string but that would be stupid)
do(size);
}
}
doIt(5); // equivalent to [5,5,5]
doIt([5,5,5]); // similar to cube(5) v's cube([5,5,5])
[注意: 需要版本 2015.03]
在表示式中對變數進行順序賦值。以下表達式將在 let 賦值的上下文中進行求值,可以使用這些變數。這主要用於透過將中間結果分配給變數來使複雜的表示式更具可讀性。
引數
let (var1 = value1, var2 = f(var1), var3 = g(var1, var2)) expression
使用示例
echo(let(a = 135, s = sin(a), c = cos(a)) [ s, c ]); // ECHO: [0.707107, -0.707107]
Let 也可以用於在 函式 中建立變數。 (另請參見:“Let 語句”)
數學 **對數** 以 10 為底。例如:log(1000) = 3。參見:對數
在表中查詢值,如果不存在精確匹配,則進行線性插值。第一個引數是要查詢的值。第二個是查詢表——一個鍵值對向量。
引數
- key
- 查詢鍵
- <key,value> 陣列
- 鍵和值
存在一個錯誤,即超出範圍的鍵會返回列表中的第一個值。較新版本的 Openscad 應使用表的頂部或底部作為替代。
**使用示例:** 建立一個由不同高度的圓柱體組成的 3D 圖表。
返回引數的最大值。如果給定一個向量作為引數,則返回該向量的最大元素。
引數
max(n,n{,n}...)
max(vector)
- <n>
- 兩個或多個小數
- <vector>
- 單個小數向量 [注意: 需要 2014.06 版本].
使用示例
max(3.0,5.0) max(8.0,3.0,4.0,5.0) max([8,3,4,5])
結果
5 8 8
返回引數的最小值。如果給定一個向量作為引數,則返回該向量的最小元素。
引數
min(n,n{,n}...)
min(vector)
- <n>
- 兩個或多個小數
- <vector>
- 單個小數向量 [注意: 需要 2014.06 版本].
使用示例
min(3.0,5.0) min(8.0,3.0,4.0,5.0) min([8,3,4,5])
結果
3 3 3
僅出於清晰度包含在本文件中。OpenSCAD 中存在“模”運算,作為一個運算子 %,而不是一個函式。參見 模運算子 (%)
返回向量的 歐幾里得範數。請注意,這會返回實際的數值長度,而 **len** 會返回向量或陣列中的元素數量。
使用示例
a=[1,2,3,4]; b="abcd"; c=[]; d=""; e=[[1,2,3,4],[1,2,3],[1,2],[1]]; echo(norm(a)); //5.47723 echo(norm(b)); //undef echo(norm(c)); //0 echo(norm(d)); //undef echo(norm(e[0])); //5.47723 echo(norm(e[1])); //3.74166 echo(norm(e[2])); //2.23607 echo(norm(e[3])); //1
結果
ECHO: 5.47723 ECHO: undef ECHO: 0 ECHO: undef ECHO: 5.47723 ECHO: 3.74166 ECHO: 2.23607 ECHO: 1
數學 **冪** 函式。
從 2021.01 版本開始,可以使用 冪運算子 ^ 代替。
引數
- <base>
- 小數。底數。
- <exponent>
- 小數。指數。
使用示例
for (i = [0:5]) {
translate([i*25,0,0]) {
cylinder(h = pow(2,i)*5, r=10);
echo (i, pow(2,i));
}
}
echo(pow(10,2)); // means 10^2 or 10*10 // result: ECHO: 100 echo(pow(10,3)); // means 10^3 or 10*10*10 // result: ECHO: 1000 echo(pow(125,1/3)); // means 125^(0.333...), which calculates the cube root of 125 // result: ECHO: 5
隨機數生成器。生成一個偽隨機數的常量向量,非常類似於陣列。這些數字是雙精度浮點數,而不是整數。當只生成一個數字時,您仍然需要使用 variable[0] 來呼叫它。
引數
- min_value
- 隨機數範圍的最小值
- max_value
- 隨機數範圍的最大值
- value_count
- 要作為向量返回的隨機數數量
- seed_value(可選)
- 用於隨機數生成器的種子值,以獲得可重複的結果。在 2015 年底之前的版本中,seed_value 會四捨五入到最接近的整數
使用示例
// get a single number single_rand = rands(0,10,1)[0]; echo(single_rand);
// get a vector of 4 numbers
seed=42;
random_vect=rands(5,15,4,seed);
echo( "Random Vector: ",random_vect);
sphere(r=5);
for(i=[0:3]) {
rotate(360*i/4) {
translate([10+random_vect[i],0,0])
sphere(r=random_vect[i]/2);
}
}
// ECHO: "Random Vector: ", [8.7454, 12.9654, 14.5071, 6.83435]
“round”運算子分別返回最大或最小整數部分,如果數值輸入為正或負。
使用示例
round(5.4); round(5.5); round(5.6); round(-5.4); round(-5.5); round(-5.6);
結果
5 6 6 -5 -6 -6
數學 **符號** 函式。返回一個單位值,提取值的符號,參見:符號函式
引數
- <x>
- 小數。要查詢符號的值。
使用示例
sign(-5.0); sign(0); sign(8.0);
結果
-1.0 0.0 1.0
數學 **平方根** 函式。
- 使用示例
translate([sqrt(100),0,0])sphere(100);
OpenSCAD 如何處理 (1/0) 之類的輸入?基本上,行為是從 OpenSCAD 所用語言 C++ 語言及其浮點數型別以及相關的 C 數學庫繼承而來的。此係統允許透過特殊值“Inf”或“-Inf”來表示正無窮大和負無窮大。它還允許將像 sqrt(-1) 或 0/0 這樣的內容表示為“NaN”,它是“非數字”的縮寫。可以在網上找到解釋,例如 Open Group 關於 math.h 的網站 或 維基百科關於 IEEE 754 數字格式的頁面。但是,OpenSCAD 是一種獨立的語言,因此它可能不完全匹配 C 中發生的所有情況。例如,OpenSCAD 在三角函式中使用度而不是弧度。另一個例子是 sin() 在輸入為 1/0 時不會丟擲“域錯誤”,儘管它確實返回 NaN。
以下是一些示例,說明 2015 年底 OpenSCAD 迴歸測試系統中對 OpenSCAD 數學函式的無窮輸入及其結果輸出。
| 0/0: nan | sin(1/0): nan | asin(1/0): nan | ln(1/0): inf | round(1/0): inf |
| -0/0: nan | cos(1/0): nan | acos(1/0): nan | ln(-1/0): nan | round(-1/0): -inf |
| 0/-0: nan | tan(1/0): nan | atan(1/0): 90 | log(1/0): inf | sign(1/0): 1 |
| 1/0: inf | ceil(-1/0): -inf | atan(-1/0): -90 | log(-1/0): nan | sign(-1/0): -1 |
| 1/-0: -inf | ceil(1/0): inf | atan2(1/0, -1/0): 135 | max(-1/0, 1/0): inf | sqrt(1/0): inf |
| -1/0: -inf | floor(-1/0): -inf | exp(1/0): inf | min(-1/0, 1/0): -inf | sqrt(-1/0): nan |
| -1/-0: inf | floor(1/0): inf | exp(-1/0): 0 | pow(2, 1/0): inf | pow(2, -1/0): 0 |


