Die Klasse Vector aus der Komponente gb.gsl implementiert einen Vektor mit reellen oder komplexen Koordinaten oder Komponenten. Ein Vektor kann wie ein Lese-/Schreib-Array verwendet werden. Die Klasse Vector verfügt über zwei Eigenschaften und fünf Methoden.
Ein Vektor kann als Zeilen- oder Spalten-Vektor so dargestellt werden:
Die Klasse Vector hat zwei Eigenschaften:
Eigenschaft | Datentyp | Beschreibung |
---|---|---|
Count | Integer | Gibt die Anzahl der Koordinaten oder Komponenten eines Vektors zurück. |
Handle | Zeiger | Gibt einen Zeiger (Pointer) auf das interne GSL-Vektor-Objekt zurück. |
Tabelle 29.3.5.2.1 : Eigenschaften der Klasse Vector
Die Klasse Vector besitzt diese fünf Methoden:
Methode | Rückgabetyp | Beschreibung |
---|---|---|
ConjDot ( Vector As Vector ) | Variant | Zurückgegeben wird das komplexe konjugierte Skalar-Produkt zwischen dem aktuellen Vektor und einem weiteren Vektor. |
Copy ( ) | Vector | Zurückgegeben wird eine Kopie des Vektors. |
Dot ( Vector As Vector ) | Variant | Zurückgegeben wird das Skalar-Produkt zwischen dem aktuellen Vektor und einem weiteren Vektor. |
Norm ( ) | Float | Es wird der Betrag oder die Länge eines Vektors zurückgegeben. |
ToString ([ Local As Boolean ]) | String | Zurückgegeben wird der Vektor als String-Repräsentation – in Abhängigkeit vom Parameter 'Local'. |
Tabelle 29.3.5.3.1 : Methoden der Klasse Vector
Hinweis:
Es gibt unterschiedliche Möglichkeiten um Vektoren zu erzeugen:
(A) Deklaration einer Variablen vom Daten-Typ Vector mit direkter Wertzuweisung.
(B) Deklaration einer Variablen vom Daten-Typ Vector und spätere Zuweisung der Koordinaten in einem Array.
(C) Kopie eines Vektors anlegen.
(D) Konvertierung einer Zeichenkette aus einer geeigneten (Eingabe-)Komponente in einen Vektor als Teil-Quelltext in einem Projekt.
Beispiel A
Public voA As New Vector(3, False)
Beispiel B
Dim voD As Vector voD = New Vector(4, False) voD = [-3.4, 5, -6, 2] ' Print voD.ToString(True)
Beispiel C
Dim voA, voB As Vector voA = New Vector(3, False) voA = [5, -6, 2] voB = voA.Copy() ' Print voB.ToString(True)
Für Vektoren sind u.a. die folgenden Operationen erklärt:
Dim voA, voB, voC As Vector voA = [1, 1, 2] voB = [5, -4, 3] voC = [3, 6, 7] Print "Ortsvektor OA: "; voA.ToString(True) Print "Ortsvektor OB: "; voB.ToString(True) Print "Ortsvektor OC: "; voC.ToString(True) Print "-----------------------------------------" Print "Vektor-Summe: OA+OB = " & (voA + vob).ToString(True) Print "Vektor-Differenz: OA-OB = " & (voA - voB).ToString(True) Print "Skalar-Produkt: OA" & String.Chr(&H22C5) & "OB = z = "; voA.Dot(voB) Print "Vergleich: OA ungleich Kopie von OB? » "; voA <> voB.Copy() Print "Vergleich: OC gleich OB? » "; voc = voB
In der IDE-Konsole lesen Sie:
Ortsvektor OA: [1 1 2] Ortsvektor OB: [5 -4 3] Ortsvektor OC: [3 6 7] ----------------------------------------- Vektor-Summe: OA+OB = [6 -3 5] Vektor-Differenz: OA-OB = [-4 5 -1] Skalar-Produkt: OA⋅OB = z = 7 Vergleich: OA ungleich Kopie von OB? » True Vergleich: OC gleich OB? » False
Das folgende Projekt setzt die vierte Variante (D) zur Erzeugung eines Vektors über die Konvertierung einer Zeichenkette aus einer geeigneten (Eingabe-)Komponente um.
Public Sub Form_Open() ... ' Dezimaltrennzeichen nach Locale setzen If Left$(Format$(0, ".0")) = "," Then txbInputA.Text = "1,0|1,0|2,0" Else txbInputA.Text = "1.0|1.0|2.0" Endif End ' Form_Open() Public Sub CheckInput(sAllowed As String) ' Idee: Charles Guerin Select Case Key.Code Case Key.Left, Key.Right, Key.BackSpace, Key.Delete, Key.End, Key.Home, Key.Enter, Key.Return Return Default If Key.Text And If InStr(sAllowed, Key.Text) Then Return Endif End Select Stop Event End ' CheckInput(sAllowed As String) Public Sub TBGroup_KeyPress() ' Gilt für die *TextBox-Gruppe* TBGroup aus 3 Textboxen! If Left$(Format$(0, ".0")) = "," Then CheckInput("+-,|0123456789") Else CheckInput("+-.|0123456789") Endif End ' TBGroup_KeyPress() Public Function Convert2Vector(sInput As String) As Vector ' Eingabe-String → Vektor Dim sSubject, sPattern As String Dim vVector As Vector Dim aArray As String[] sSubject = sInput sSubject = Replace(sSubject, " ", "") sSubject = Replace$(sSubject, ",", ".") sPattern = "^([-+]?[0-9]*\\.?[0-9]+[|])([-+]?[0-9]*\\.?[0-9]+[|])([-+]?[0-9]*\\.?[0-9]+)$" If sSubject Match sPattern Then aArray = Split(sInput, "|") vVector = [Val(aArray[0]), Val(aArray[1]), Val(aArray[2])] Return vVector Else Return Error.Raise("Eingabefehler Koordinaten") Endif End ' Convert2Vector(..)
Im Projekt werden fast alle Eigenschaften und Methoden der Klasse Vector eingesetzt. Die drei Ortsvektoren legen ein Dreieck im Raum fest, von dem einige Eigenschaften berechnet werden.
Abbildung 29.3.5.6.1: Demonstration der Arbeit mit Vektoren
Mit der Funktion IsVector(txbInputA.Text) können Sie zum Beispiel prüfen, ob die aus einer Textbox für den Punkt A ausgelesene Zeichenkette als Punkt in einem kartesischen Koordinatensystem interpretiert werden kann.
Die o.a. Funktion wird im Projekt nicht verwendet. Es wird aber das gleiche Suchmuster in einem regulären Ausdruck wie bei der Funktion Convert2Vector(..) verwendet.
Private Function IsVector(sInput As String) As Boolean Dim sSubject, sPattern As String sSubject = sInput sSubject = Replace(sSubject, " ", "") sSubject = Replace$(sSubject, ",", ".") sPattern = "^([-+]?[0-9]*\\.?[0-9]+[|])([-+]?[0-9]*\\.?[0-9]+[|])([-+]?[0-9]*\\.?[0-9]+)$" If sSubject Not Match sPattern Then Return False Return True End ' IsVector(sInput As String) As Boolean
Die Berechnung des Kreuzproduktes V1✘V2 zweier Vektoren wird durch diese Funktion realisiert:
Public Function SetAxB(vV1 As Vector, vV2 As Vector) As Vector ' Kreuzprodukt vV1✘vV2 Dim fx, fy, fz As Float fx = vV1[1] * vV2[2] - vV2[1] * vV1[2] fy = vV1[0] * vV2[2] - vV2[0] * vV1[2] fz = vV1[0] * vV2[1] - vV2[0] * vV1[1] Return [fx, - fy, fz] End ' Function SetAxB(vV1, vV2)
Den vollständigen, hinreichend kommentierten Quelltext finden Sie im Download-Bereich.