Inhaltsverzeichnis

29.3.5 Vector

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.

29.3.5.1 Vektor-Begriff

Ein Vektor kann als Zeilen- oder Spalten-Vektor so dargestellt werden:

Vector

29.3.5.2 Eigenschaften

Die Klasse Vector hat zwei Eigenschaften:

EigenschaftDatentypBeschreibung
CountIntegerGibt die Anzahl der Koordinaten oder Komponenten eines Vektors zurück.
HandleZeigerGibt einen Zeiger (Pointer) auf das interne GSL-Vektor-Objekt zurück.

Tabelle 29.3.5.2.1 : Eigenschaften der Klasse Vector

29.3.5.3 Methoden

Die Klasse Vector besitzt diese fünf Methoden:

MethodeRückgabetypBeschreibung
ConjDot ( Vector As Vector ) VariantZurückgegeben wird das komplexe konjugierte Skalar-Produkt zwischen dem aktuellen Vektor und einem weiteren Vektor.
Copy ( ) VectorZurückgegeben wird eine Kopie des Vektors.
Dot ( Vector As Vector ) VariantZurückgegeben wird das Skalar-Produkt zwischen dem aktuellen Vektor und einem weiteren Vektor.
Norm ( )FloatEs wird der Betrag oder die Länge eines Vektors zurückgegeben.
ToString ([ Local As Boolean ])StringZurü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:

29.3.5.4 Erzeugen von Vektoren

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)

29.3.5.5 Operationen und Relationen

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

29.3.5.6 Projekt

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.

Arbeit mit Vektoren

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.

Download