OpenSCAD Benutzerhandbuch/Mathematischer Operatoren
Skalare arithmetische Operatoren
[Bearbeiten]Skalare arithmetische Operatoren nehmen Zahlen als Operanden und liefern eine neue Zahl.
| + | Addition |
| - | Subtraktion |
| * | Multiplikation |
| / | Division |
| % | Modulo (Rest bei Division) |
| ^ | Potenz Vorlage:Requires |
Das - kann auch als Präfix-Operator verwendet werden, um eine Zahl zu negieren.
Vor Version 2021.01 wurde statt des Potenzoperators ^ die eingebaute Funktion pow() verwendet.
- Beispiel:
a = [ for(i=[0:10]) i%2 ];
echo(a); // ECHO: [0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0]
Eine Zahl modulo 2 ist 0, wenn sie gerade ist, und 1, wenn sie ungerade ist.
Bitweise arithmetische Operatoren
[Bearbeiten]| | | Bitweises ODER |
| & | Bitweises UND |
| << | Linksverschiebung |
| >> | Rechtsverschiebung (mit Vorzeichen-Erhaltung) |
| ~ | Bitweises NICHT (unär) |
Ganzzahlige Werte werden für bitweise Operationen in mindestens 64-Bit vorzeichenbehaftete Ganzzahlen umgewandelt und danach wieder zurückkonvertiert. Beachte: OpenSCAD-Zahlen haben mindestens 53 Bit Genauigkeit – bitweise Operationen über 2⁵³ hinaus können ungenau sein.
Vergleichsoperatoren
[Bearbeiten]Vergleichsoperatoren liefern ein boolesches Ergebnis aus zwei Operanden.
| < | kleiner als |
| <= | kleiner oder gleich |
| == | gleich |
| != | ungleich |
| >= | größer oder gleich |
| > | größer als |
- Bei Zahlen ist die Bedeutung offensichtlich.
- Bei Zeichenketten wird alphabetisch sortiert: z. B. ""ab" > "aa" > "a"".
- Bei Booleans gilt: "true > false".
* Beim Vergleich von Boolean und Zahl wird "true" als "1", "false" als "0" behandelt. * Alle anderen Ungleichheitsvergleiche mit Booleans liefern "false".
- Bei Vektoren liefert "==" nur dann "true", wenn beide Vektoren identisch sind.
* Ungleichheitsvergleiche mit Vektoren liefern immer "false" – z. B. ist "[1] < [2]" → "false".
- Unterschiedliche Typen sind nie gleich ("==" → "false", "!=" → "true").
* Ausnahme: Booleans und Zahlen (siehe oben). * Beispiel: "[1] == 1" → "false" (Vektor ≠ Zahl).
- "undef" ist nur gleich "undef" – alle anderen Vergleiche mit "undef" liefern "false".
- "nan" ist nicht einmal sich selbst gleich – alle Vergleiche mit "nan" liefern "false".
Logische Operatoren
[Bearbeiten]Logische Operatoren verarbeiten Booleans und liefern einen Boolean. Nicht-boolesche Werte werden vor der Auswertung in Booleans umgewandelt.
| && | logisches UND |
| || | logisches ODER |
| ! | logisches NICHT (unär) |
Beachte: Da "[false]" als wahr gilt (es ist ein nicht-leerer Vektor), ist "false || [false]" ebenfalls wahr.
Logische Operatoren verhalten sich bei Vektoren anders als Vergleichsoperatoren:
- "[1, 1] > [0, 2]" → "false" (Vergleich)
- "[false, false] && [false, false]" → "true" (logisch: beide Vektoren sind „wahr“)
Bedingungsoperator
[Bearbeiten]Der ?:-Operator wertet bedingt einen von zwei Ausdrücken aus – genau wie in C-artigen Sprachen.
| ? : | Bedingungsoperator |
| Beispiel: |
a = 1;
b = 2;
c = a == b ? 4 : 5;
Wenn "a" gleich "b" ist,** wird "c" auf 4 gesetzt, sonst auf 5. Der Ausdruck vor dem "?" muss zu einem booleschen Wert ausgewertet werden. |
Vektor-Zahl-Operatoren
[Bearbeiten]Diese Operatoren nehmen einen Vektor und eine Zahl und liefern einen neuen Vektor.
| * | Multipliziert jedes Element des Vektors mit der Zahl |
| / | Dividiert jedes Element des Vektors durch die Zahl |
- Beispiel
L = [1, [2, [3, "a"] ] ];
echo(5*L);
// ECHO: [5, [10, [15, undef]]]
Vektor-Operatoren
[Bearbeiten]Vektor-Operatoren verarbeiten Vektoren elementweise und liefern einen neuen Vektor.
| + | Elementweise Addition |
| - | Elementweise Subtraktion |
Das - kann auch als Präfix-Operator verwendet werden, um einen Vektor elementweise zu negieren.
- Beispiel
L1 = [1, [2, [3, "a"] ] ];
L2 = [1, [2, 3] ];
echo(L1+L1); // ECHO: [2, [4, [6, undef]]]
echo(L1+L2); // ECHO: [2, [4, undef]]
Bei Vektoren unterschiedlicher Länge wird das Ergebnis auf die Länge des kürzeren Vektors abgeschnitten.
Skalarprodukt (Vektor-Punktprodukt)
[Bearbeiten]Wenn beide Operanden der Multiplikation einfache Vektoren sind, wird das Skalarprodukt berechnet:
c = u*v; ergibt .
Haben die Vektoren unterschiedliche Längen, ist das Ergebnis undef.
Matrixmultiplikation
[Bearbeiten]Wenn einer oder beide Operanden der Multiplikation Matrizen sind, wird gemäß den Regeln der linearen Algebra multipliziert.
Im Folgenden seien Vorlage:Math Matrizen und Vorlage:Math Vektoren. Indizes Vorlage:Math bezeichnen Elementpositionen.
- Für eine Matrix Vorlage:Math der Größe Vorlage:Math und eine Matrix Vorlage:Math der Größe Vorlage:Math ist das Produkt
C = A*B; eine Matrix der Größe Vorlage:Math mit Elementen:
.
C = B*A;ergibtundef, es sei denn, Vorlage:Math.
- Für eine Matrix Vorlage:Math (Vorlage:Math) und einen Vektor Vorlage:Math (Länge Vorlage:Math) ist
u = A*v; ein Vektor der Länge Vorlage:Math mit:
.
→ Dies entspricht der Multiplikation einer Matrix mit einem Spaltenvektor.
- Für einen Vektor Vorlage:Math (Länge Vorlage:Math) und eine Matrix Vorlage:Math (Vorlage:Math) ist
u = v*A; ein Vektor der Länge Vorlage:Math mit:
.
→ Dies entspricht der Multiplikation eines Zeilenvektors mit einer Matrix.
Wichtig: Matrixmultiplikation ist nicht kommutativ: und .