OpenSCAD用戶手冊/數學函數
三角函數
編輯三角函數使用的是C語言的數學函數,基於二進制浮點運算,即在計算過程中採用的是實數的近似值。OpenSCAD的數學函數使用的是Value.h/Value.cc's文件中的C++ 'double'類型。
如果對C語言庫中的數學函數規範(例如有效的輸入/輸出範圍)感興趣,可以查閱Open Group網站math.h & acos
cos
編輯數學中的餘弦函數,以角度為單位。參見 餘弦
參數
- <degrees>
- 十進制數。以角度為單位表示的旋轉角。
用例: | |
for(i=[0:36])
translate([i*10,0,0])
cylinder(r=5,h=cos(i*10)*50+60);
|
sin
編輯數學中的正弦函數。參見 正弦
參數
- <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);
|
tan
編輯數學中的正切函數。參見正切
參數
- <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);
}
|
acos
編輯數學中的反餘弦函數,以角度為單位。參見: 反三角函數
asin
編輯數學中的反正弦函數,以角度為單位。參見:反三角函數
atan
編輯數學中的反正切函數。返回x反正切函數的主值,以角度為單位。參見:反三角函數
atan2
編輯數學中的two-argument atan函數,取y作為其第一個參數。返回y/x反正切函數的主值,以角度為單位。參見:atan2
其他數學函數
編輯abs
編輯數學中的求絕對值函數。返回帶符號十進制數的正值。
用例:
abs(-5.0); abs(0); abs(8.0);
結果:
5.0 0.0 8.0
ceil
編輯數學中的'向上取整函數。
若目標數為小數,則返回大於它的最小整數;否則返回其自身。
See: 向上取整函數
echo(ceil(4.4),ceil(-4.4)); // 生成结果ECHO: 5, -4
concat
編輯[請注意: 需要使用版本 2015.03]
返回由參數所構成的向量。
若參數是一個向量,則將其中元素依次取出構成返回的結果向量。此函數處理字符的方式與向量不同。
用例:
echo(concat("a","b","c","d","e","f")); // 生成结果ECHO: ["a", "b", "c", "d", "e", "f"] echo(concat(["a","b","c"],["d","e","f"])); // 生成结果ECHO: ["a", "b", "c", "d", "e", "f"] echo(concat(1,2,3,4,5,6)); // 生成结果ECHO: [1, 2, 3, 4, 5, 6]
處理以向量為元素的向量
echo(concat([ [1],[2] ], [ [3] ])); // 生成结果ECHO: [[1], [2], [3]]
將向量與字符串的處理結果進行對比
echo(concat([1,2,3],[4,5,6])); // 生成结果ECHO: [1, 2, 3, 4, 5, 6] echo(concat("abc","def")); // 生成结果ECHO: ["abc", "def"] echo(str("abc","def")); // 生成结果ECHO: "abcdef"
cross
編輯計算兩個3D向量的叉積。結果是一個正交於兩個輸入向量的向量。
輸入無效參數(例如,長度不為3的向量或其他類型)將產生一個無定義的結果。
用例:
echo(cross([2, 3, 4], [5, 6, 7])); // 生成结果ECHO: [-3, 6, -3] echo(cross([2, 1, -3], [0, 4, 5])); // 生成结果ECHO: [17, -10, 8] echo(cross([2, 3, 4], "5")); // 生成结果ECHO: undef
exp
編輯數學中的exp函數。返回以e為底,參數x為冪的結果。參考:Exponent
echo(exp(1),exp(ln(3)*4)); // 生成结果ECHO: 2.71828, 81
floor
編輯數學中的floor函數。floor(x)返回的是不大於參數x的最大整數。
echo(floor(4.4),floor(-4.4)); // 生成结果ECHO: 4, -5
ln
編輯數學中的自然對數。參見:Natural logarithm
len
編輯數學中的length函數。返回數組、向量或字符串參數的長度。
用例:
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);
結果:
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为一个数,就把它作为x、y、z(原本undef) do([size,size,size]); } else { // 若size是一个向量(也可能是一个字符串,但是这也太蠢了) do(size); } } doIt(5); // 等价于[5,5,5] doIt([5,5,5]); // similar to cube(5) v's cube([5,5,5])
let
編輯[請注意: 需要使用版本 2015.03]
為表達式中的一系列變量進行賦值。let函數後的表達式可以用賦值後的變量進行計算。此函數的主要功能在於:通過將多個中間結果賦予對應變量,令複雜的表達式更具可讀性。
參數
let (var1 = value1, var2 = f(var1), var3 = g(var1, var2)) 表达式
用例:
echo(let(a = 135, s = sin(a), c = cos(a)) [ s, c ]); // ECHO: [0.707107, -0.707107]
log
編輯數學中以10位底的對數。例如:log(1000) = 3。參見:Logarithm
lookup
編輯查找表中的值,如果沒有完全匹配的值,則進行線性插值。第一個參數為待查值。第二個參數為待查表——由鍵-值對構成的向量。
參數
- key
- 待查鍵
- <key,value> 數組
- 鍵值對集合
此函數存在一個bug,若查找的鍵不在待查範圍之中,將返回鍵值對列表中的第一個值。在Openscad的較新版本中,應當採用最近的表值加以取代。
用例:
| |
function get_cylinder_h(p) = lookup(p, [
[ -200, 5 ],
[ -50, 20 ],
[ -20, 18 ],
[ +80, 25 ],
[ +150, 2 ]
]);
for (i = [-100:5:+100]) {
// echo(i, get_cylinder_h(i));
translate([ i, 0, -30 ]) cylinder(r1 = 6, r2 = 2, h = get_cylinder_h(i)*3);
}
|
max
編輯返回參數中的最大值。若參數指定的是一個向量,則返回數組中的最大元素。
參數
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
編輯返回參數中的最小值。若參數指定的是一個向量,則返回向量中的最小元素。
參數
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
Looking for
mod - 它並不是一個函數,參見 modulo operator (%)
norm
編輯返回向量的[[w:Norm_(mathematics)|歐幾里得範數]。請注意, 當用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
pow
編輯數學中的冪函數。
參數
- <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)); // 意即10^2 或 10*10 // 结果: ECHO: 100 echo(pow(10,3)); // 意即10^3 或 10*10*10 // 结果: ECHO: 1000 echo(pow(125,1/3)); // 意即125^(0.333...),等价于计算125的立方根 // 结果: ECHO: 5
rands
編輯隨機數生成器。生成偽隨機數構成的常向量(很像數組)。其中的元素皆為雙精度浮點數而非整數。當生成一個數時,您仍可用變量[0]來調用它。
參數
- min_value
- 隨機數範圍中的最小值
- max_value
- 隨機數範圍中的最大值
- value_count
- 返回向量中的隨機數數量
- seed_value (可選項)
- 應對可重複結果而為隨機數生成器設置的種子值。在2015近期之前的各版本中,seed_value將被取整為最接近的整數。
用例:
// 获取单个随机数 single_rand = rands(0,10,1)[0]; echo(single_rand);
// 获取由4个元素构成的向量 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"運算符返回參數的四捨五入值。
一些示例:
round(x.5) = x+1.
round(x.49) = x.
round(-(x.5)) = -(x+1).
round(-(x.49)) = -x.
round(5.4); //-> 5
round(5.5); //-> 6
round(5.6); //-> 6
sign
編輯數學中的符號函數。返回帶有參數符號的單位值,參見:Signum function
參數
- <x>
- 十進制數。待查符號的值。
用例:
sign(-5.0); sign(0); sign(8.0);
結果:
-1.0 0.0 1.0
sqrt
編輯數學中的平方根函數。
用例:
translate([sqrt(100),0,0])sphere(100);
Infinities and NaNs
編輯How does OpenSCAD deal with inputs like (1/0)? Basically, the behavior is inherited from the language OpenSCAD was written in, the C++ language, and its floating point number types and the associated C math library. This system allows representation of both positive and negative infinity by the special values "Inf" or "-Inf". It also allow representation of creatures like sqrt(-1) or 0/0 as "NaN", an abbreviation for "Not A Number". Some very nice explanations can be found on the web, for example the Open Group's site on math.h or Wikipedia's page on the IEEE 754 number format. However OpenSCAD is it's own language so it may not exactly match everything that happens in C. For example, OpenSCAD uses degrees instead of radians for trigonometric functions. Another example is that sin() does not throw a "domain error" when the input is 1/0, although it does return NaN.
Here are some examples of infinite input to OpenSCAD math functions and the resulting output, taken from OpenSCAD's regression test system in late 2015.
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 |