OpenSCAD Benutzerhandbuch/Mathematische Operatoren
Trigonometrische Funktionen
[Bearbeiten]Die trigonometrischen Funktionen in OpenSCAD nutzen die Mathematik-Bibliothek der C-Sprache, die auf Binärer Gleitkommaarithmetik basiert. Das bedeutet: Alle Berechnungen verwenden Näherungswerte für reelle Zahlen. Intern arbeitet OpenSCAD mit dem C++-Datentyp "double".
Eine gute Referenz zu den genauen Eigenschaften (gültige Eingaben, Wertebereiche etc.) findest du bei der Open Group: math.h und acos.
cos
[Bearbeiten]Mathematische Kosinus-Funktion – Eingabe in Grad.
Parameter
- <degrees>
- Dezimalzahl. Winkel in Grad.
| Beispiel: | |
for(i=[0:36])
translate([i*10,0,0])
cylinder(r=5,h=cos(i*10)*50+60);
|
sin
[Bearbeiten]Mathematische Sinus-Funktion – Eingabe in Grad.
Parameter
- <degrees>
- Dezimalzahl. Winkel in Grad.
| Beispiel 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);
}
|
| Beispiel 2: | |
for(i=[0:36])
translate([i*10,0,0])
cylinder(r=5,h=sin(i*10)*50+60);
|
tan
[Bearbeiten]Mathematische Tangens-Funktion – Eingabe in Grad.
Parameter
- <degrees>
- Dezimalzahl. Winkel in Grad.
| Beispiel: | |
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
[Bearbeiten]Mathematischer Arkuskosinus (Umkehrfunktion des Kosinus) – Ergebnis in Grad. Siehe auch: Inverse trigonometrische Funktionen
asin
[Bearbeiten]Mathematischer Arkussinus (Umkehrfunktion des Sinus) – Ergebnis in Grad. Siehe auch: Inverse trigonometrische Funktionen
atan
[Bearbeiten]Mathematischer Arkustangens – Ergebnis in Grad, im Bereich –90 bis +90. "atan" kann nicht zwischen "(y/x)" und "(-y/-x)" unterscheiden. Für volle 360°-Abdeckung verwende stattdessen "atan2". Siehe auch: atan2 und Inverse trigonometrische Funktionen
atan2
[Bearbeiten]Zweistellige Arkustangens-Funktion "atan2(y,x)", die den vollen Winkel um 360° abdeckt. Gibt den Winkel zwischen der X-Achse und dem Vektor "(x,y)" zurück – im Bereich –180 < Winkel ≤ 180.
Beispiele:
atan2(5.0,-5.0); // Ergebnis: 135 Grad (atan() würde -45 liefern)
atan2(y,x); // Winkel zwischen (1,0) und (x,y) → Drehung um Z-Achse
Weitere mathematische Funktionen
[Bearbeiten]abs
[Bearbeiten]Liefert den absoluten Betrag einer Zahl (immer positiv).
Beispiele:
abs(-5.0); // → 5.0
abs(0); // → 0.0
abs(8.0); // → 8.0
ceil
[Bearbeiten]Aufrunden auf die nächste ganze Zahl.
Siehe: Ceil Function
echo(ceil(4.4), ceil(-4.4)); // → ECHO: 5, -4
concat
[Bearbeiten]Vorlage:Requires Verkettet mehrere Vektoren oder Werte zu einem neuen Vektor.
- Bei Vektoren werden deren Elemente einzeln angehängt.
- Zeichenketten bleiben als Ganzes erhalten (im Gegensatz zu "str()").
Beispiele:
echo(concat("a","b","c","d","e","f")); // → ["a","b","c","d","e","f"]
echo(concat(["a","b","c"],["d","e","f"])); // → ["a","b","c","d","e","f"]
echo(concat(1,2,3,4,5,6)); // → [1,2,3,4,5,6]
// Vektor von Vektoren
echo(concat([ [1],[2] ], [ [3] ])); // → [[1],[2],[3]]
// Tipp: Um einen Punkt an einen Polygonpfad anzuhängen:
polygon(concat([[0,0],[0,5],[5,5]], [[5,0]])); // → Quadrat statt Dreieck
Unterschied zu Zeichenketten:
echo(concat([1,2,3],[4,5,6])); // → [1,2,3,4,5,6]
echo(concat("abc","def")); // → ["abc","def"]
echo(str("abc","def")); // → "abcdef"
cross
[Bearbeiten]Berechnet das Kreuzprodukt zweier Vektoren:
- In 3D: Ergebnis ist ein Vektor senkrecht zu beiden Eingabevektoren.
- In 2D: Liefert nur die z-Komponente als Skalar: "cross([x,y], [u,v]) = x*v - y*u"
Ungültige Eingaben (falsche Länge, gemischte Dimensionen etc.) liefern "undef".
Beispiele:
echo(cross([2, 3, 4], [5, 6, 7])); // → [-3, 6, -3]
echo(cross([2, 1, -3], [0, 4, 5])); // → [17, -10, 8]
echo(cross([2, 1], [0, 4])); // → 8
echo(cross([1, -3], [4, 5])); // → 17
echo(cross([2, 1, -3], [4, 5])); // → undef
echo(cross([2, 3, 4], "5")); // → undef
Für alle Vektoren gilt: "cross(a,b) == -cross(b,a)"
exp
[Bearbeiten]Exponentialfunktion zur Basis e: "exp(x) = e^x"
echo(exp(1), exp(ln(3)*4)); // → ECHO: 2.71828, 81
floor
[Bearbeiten]Abrunden auf die nächstkleinere ganze Zahl.
Siehe: Floor Function
echo(floor(4.4), floor(-4.4)); // → ECHO: 4, -5
ln
[Bearbeiten]Natürlicher Logarithmus (Basis e). Siehe: Natural logarithm
len
[Bearbeiten]Gibt die Anzahl der Elemente in einem Vektor, Array oder String zurück.
Beispiele:
str1="abcdef"; len_str1=len(str1); echo(str1,len_str1); // → "abcdef", 6
a=6; len_a=len(a); echo(a,len_a); // → 6, undef (Warnung!)
array1=[1,2,3,4,5,6,7,8]; echo(array1,len(array1)); // → [...], 8
array2=[[0,0],[0,1],[1,0],[1,1]]; echo(len(array2)); // → 4
echo(len(array2[2])); // → 2
Wichtig: "len()" funktioniert nicht mit einfachen Zahlen – es erscheint eine Warnung und der Rückgabewert ist "undef".
Das ist nützlich, um Module flexibel zu gestalten – z. B. wie bei "cube(5)" vs. "cube([5,5,5])":
module doIt(size) {
if (len(size) == undef) {
do([size,size,size]); // size ist eine Zahl
} else {
do(size); // size ist ein Vektor
}
}
doIt(5); // → [5,5,5]
doIt([5,5,5]); // → [5,5,5]
let
[Bearbeiten]Vorlage:Requires Erlaubt sequenzielle Zuweisungen innerhalb eines Ausdrucks – ideal, um komplexe Formeln lesbarer zu machen.
Syntax:
let(var1 = wert1, var2 = f(var1), ...) ausdruck
Beispiel:
echo(let(a = 135, s = sin(a), c = cos(a)) [s, c]); // → [0.707107, -0.707107]
"let" kann auch in Funktionen verwendet werden.
log
[Bearbeiten]Logarithmus zur Basis 10. Beispiel: "log(1000) = 3". Siehe: Logarithm
lookup
[Bearbeiten]Sucht einen Wert in einer Tabelle und interpoliert linear, falls kein exakter Treffer vorhanden ist.
Parameter
- key
- Gesuchter Wert
- <key,value>-Array
- Tabelle aus Schlüssel-Wert-Paaren
Hinweis: In älteren Versionen liefert ein außerhalb liegender Schlüssel fälschlich den ersten Tabellenwert. Neuere Versionen nutzen stattdessen den Randwert.
Beispiel: 3D-Diagramm aus Zylindern unterschiedlicher Höhe
max
[Bearbeiten]Gibt den größten Wert zurück – entweder aus mehreren Zahlen oder aus einem Vektor.
Beispiele:
max(3.0,5.0) // → 5
max(8.0,3.0,4.0,5.0) // → 8
max([8,3,4,5]) // → 8
min
[Bearbeiten]Gibt den kleinsten Wert zurück – entweder aus mehreren Zahlen oder aus einem Vektor.
Beispiele:
min(3.0,5.0) // → 3
min(8.0,3.0,4.0,5.0) // → 3
min([8,3,4,5]) // → 3
mod
[Bearbeiten]Existiert nicht als Funktion! Die Modulo-Operation wird nur als Operator "%" unterstützt. Siehe: Modulo-Operator (%).
norm
[Bearbeiten]Berechnet die euklidische Länge eines Vektors:
Im Gegensatz zu "len()" liefert "norm()" die geometrische Länge, nicht die Anzahl der Elemente.
Beispiele:
a=[1,2,3,4,5,6]; echo(norm(a)); // → 9.53939
c=[]; echo(norm(c)); // → 0
e=[[1,2,3,4],[1,2,3],[1,2],[1]];
echo(norm(e[0])); // → 5.47723
Zeichenketten oder leere Strukturen liefern "undef".
pow
[Bearbeiten]Potenzfunktion: "pow(basis, exponent)"
Ab Version 2021.01 kannst du stattdessen den Operator "^" verwenden.
Beispiele:
echo(pow(10,2)); // → 100 (10²)
echo(pow(10,3)); // → 1000 (10³)
echo(pow(125,1/3)); // → 5 (Kubikwurzel)
for (i = [0:5]) {
translate([i*25,0,0]) {
cylinder(h = pow(2,i)*5, r=10);
echo(i, pow(2,i));
}
}
rands
[Bearbeiten]Erzeugt Pseudo-Zufallszahlen als Vektor. Die Zahlen sind Dezimalwerte, keine Ganzzahlen.
Die erzeugten Werte liegen im halboffenen Intervall "[min, max)" – also ≥ min und < max.
Parameter
- min_value
- Untere Grenze
- max_value
- Obere Grenze
- value_count
- Anzahl der Zufallszahlen
- seed_value (optional)
- Startwert für reproduzierbare Ergebnisse
Beispiele:
// Eine einzelne Zahl
single_rand = rands(0,10,1)[0];
// Vektor mit 4 Zahlen (mit Seed für Wiederholbarkeit)
seed=42;
random_vect=rands(5,15,4,seed);
echo("Random Vector: ",random_vect);
// Ganzzahlige Zufallszahlen von 1 bis 10 (inklusive)
function irands(minimum, maximum, n) =
let(floats = rands(minimum, maximum+1, n))
[ for (f = floats) floor(f) ];
echo(irands(1, 10, 5)); // → [9, 6, 2, 4, 1]
round
[Bearbeiten]Rundet auf die nächste ganze Zahl („kaufmännisches Runden“).
Beispiele:
round(5.4); // → 5
round(5.5); // → 6
round(5.6); // → 6
round(-5.4); // → -5
round(-5.5); // → -6
round(-5.6); // → -6
sign
[Bearbeiten]Liefert das Vorzeichen einer Zahl:
- "1" für positive Zahlen
- "0" für Null
- "-1" für negative Zahlen
Beispiele:
sign(-5.0); // → -1.0
sign(0); // → 0.0
sign(8.0); // → 1.0
sqrt
[Bearbeiten]Quadratwurzel-Funktion.
Beispiel:
translate([sqrt(100),0,0]) sphere(100); // → Verschiebung um 10 Einheiten
Unendlichkeiten und NaNs
[Bearbeiten]OpenSCAD übernimmt das Verhalten von C++ bei Sonderwerten:
- "Inf" / "-Inf": Positive bzw. negative Unendlichkeit (z. B. "1/0")
- "NaN": „Not a Number“ – bei ungültigen Operationen wie "0/0" oder "sqrt(-1)"
Einige Beispiele aus den OpenSCAD-Tests (Stand 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 |


