Zum Inhalt springen

OpenSCAD Benutzerhandbuch/Mathematische Operatoren

Aus Wikibooks

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.

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);
OpenSCAD – Kosinus-Funktion

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);
OpenSCAD – Sinus-Funktion

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);
}

Mathematischer Arkuskosinus (Umkehrfunktion des Kosinus) – Ergebnis in Grad. Siehe auch: Inverse trigonometrische Funktionen

Mathematischer Arkussinus (Umkehrfunktion des Sinus) – Ergebnis in Grad. Siehe auch: Inverse trigonometrische Funktionen

Mathematischer ArkustangensErgebnis 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]

Liefert den absoluten Betrag einer Zahl (immer positiv).

Beispiele:

abs(-5.0);  // → 5.0
abs(0);     // → 0.0
abs(8.0);   // → 8.0

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)"

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

Natürlicher Logarithmus (Basis e). Siehe: Natural logarithm

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]

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.

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

function get_cylinder_h(p) = lookup(p, [
    [ -200, 5 ],
    [ -50, 20 ],
    [ -20, 18 ],
    [ +80, 25 ],
    [ +150, 2 ]
]);

for (i = [-100:5:+100]) {
    translate([ i, 0, -30 ]) cylinder(r1 = 6, r2 = 2, h = get_cylinder_h(i)*3);
}
OpenSCAD – Lookup-Funktion

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

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

Existiert nicht als Funktion! Die Modulo-Operation wird nur als Operator "%" unterstützt. Siehe: Modulo-Operator (%).

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".

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

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

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