Zum Inhalt springen

OpenSCAD Benutzerhandbuch/Mathematischer Operatoren

Aus Wikibooks

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]

Vorlage:Requires

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

Vorlage:BookCat

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.

 C = A*B; eine Matrix der Größe Vorlage:Math mit Elementen:  
 .  
 u = A*v; ein Vektor der Länge Vorlage:Math mit:  
 .  
 → Dies entspricht der Multiplikation einer Matrix mit einem Spaltenvektor.
 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 .