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 |