跳至內容

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);
OpenSCAD餘弦函數示例‎

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);
OpenSCAD正弦函數示例


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的最大整數。

參見:Floor Function

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的較新版本中,應當採用最近的表值加以取代。
用例:
  • 此例將創建一張由不同高度的圓柱體構成的3D圖表。
 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);
 }
OpenSCAD查找函數示例

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