2D- und 3D-Vektoren

Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Neue Antwort erstellen

 

timmeTheOnly

Betreff: 2D- und 3D-Vektoren

BeitragDi, Jun 19, 2012 18:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Leute,

ich habe mir den Spaß gemacht und Klassen für das Berechnen von Vektoren im zwei-, sowie im dreidimensionalen Raum geschrieben, die ich euch nicht vorenthalten möchte.

Die Klassen beinhalten die wichtigen Operationen der analytischen Geometrie (11. Klasse) und sind - meiner Meinung nach - einfach anzuwenden.

----------

Vector2 - Vektoren im zweidimensionalen Raum

BlitzMax: [AUSKLAPPEN]

Type Vector2
Field x:Float, y:Float

Function Create:Vector2(x:Float, y:Float)
Local tmp:Vector2 = New Vector2

tmp.x = x
tmp.y = y

Return tmp
End Function

Function Add:Vector2(a:Vector2, b:Vector2)
Return Vector2.Create(a.x + b.x, a.y + b.y)
End Function

Function Subtract:Vector2(a:Vector2, b:Vector2)
Return Vector2.Create(a.x - b.x, a.y - b.y)
End Function

Function Multiply:Vector2(a:Vector2, s:Float)
Return Vector2.Create(a.x * s, a.y * s)
End Function

Function Divide:Vector2(a:Vector2, s:Float)
If s <> 0
Return Vector2.Create(a.x / s, a.y / s)
End If
End Function

Function DotProduct:Float(a:Vector2, b:Vector2)
Return a.x * b.x + a.y * b.y
End Function

Function AngleBetween:Float(a:Vector2, b:Vector2)
Return ACos(Vector2.DotProduct(a, b) / (a.Absolute() * b.Absolute()))
End Function

Function Normal:Vector2(a:Vector2, s:Byte = 0)
If s
Return Vector2.Divide(Vector2.Create(a.y, -a.x), a.Absolute())
Else
Return Vector2.Divide(Vector2.Create(-a.y, a.x), a.Absolute())
End If
End Function

Method Absolute:Float()
Return Sqr(Self.x ^ 2 + Self.y ^ 2)
End Method

Method Draw(repX:Int, repY:Int)
DrawOval repX - 2, repY - 2, 4, 4
DrawLine repX, repY, repX + Self.x, repY + Self.y
End Method
End Type


Erläuterung:

(Ich werde Vektoren mit kleinen, lateinischen Buchstaben ohne Pfeil bennen, weil man diesen im ASCII Alphabet vergeblich sucht...)

Code: [AUSKLAPPEN]

Klasse Vector2:

  Funktionen:

    Create:Vector2(x:Float,y:Float)
      Erstellt einen neuen Vektor mit den Komponenten x und y und gibt ihn als Vector2 zurück

    Add:Vector2(a:Vector2,b:Vector2)
      Addiert die zwei Vektoren a und bund gibt das Ergebnis als Vector2 zurück

      c = a + b

    Subtract:Vector2(a:Vector2,b:Vector2)
      Subtrahiert Vektor b von Vektor a und gibt das Ergebnis als Vector2 zurück

      c = a - b

    Multiply:Vector2(a:Vector2,s:Float)
      Multipliziert den Vektor a mit dem Skalar s und gibt das Ergebnis als Vector2 zurück

      c = s (Skalar) * a

    Divide:Vector2(a:Vector2,s:Float)
      Dividiert den Vektor a durch den Skalar s und gibt das Ergebnis als Vector2 zurück
      Wenn gilt s = 0, dann gibt die Funktion null zurück

      c = a / s (Skalar)

    DotProduct:Float(a:Vector2,b:Vector2)
      Berechnet das Skalar- / Punktprodukt der Vektoren a und b und gibt das Ergebnis als Float zurück

      s (Skalar) = a ○ b

    AngleBetween:Float(a:Vector2,b:Vector2)
      Berechnet den durch die Vektoren a und b eingeschlossenen Winkel und gibt ihn als Float zurück

           a ○ b
      φ = -------
          |a|*|b|

    Normal:Vector2(a:Vector2,s:Byte=0)
      Berechnet einen der beiden Normalvektoren (s=0 oder s=1), bringt dessen Betrag auf 1 und gibt ihn als Vector2 zurück

  Methoden:

    Absolute:Float()
      Gibt den Betrag des Vektors der Instanz a als Float zurück

      s (Skalar) = |a|

    Draw(repX:Int, repY:Int)
      Zeichnet einen Repräsentanten des Vektors der Instanz a an die Stelle repX, repY, wobei der Punkt den Anfang des Repräsentanten symbolisiert


----------

Vector3 - Vektoren im dreidimensionalen Raum

BlitzMax: [AUSKLAPPEN]

Type Vector3
Field x:Float, y:Float, z:Float

Function Create:Vector3(x:Float, y:Float, z:Float)
Local tmp:Vector3 = New Vector3

tmp.x = x
tmp.y = y
tmp.z = z

Return tmp
End Function

Function Add:Vector3(a:Vector3, b:Vector3)
Return Vector3.Create(a.x + b.x, a.y + b.y, a.z + b.z)
End Function

Function Subtract:Vector3(a:Vector3, b:Vector3)
Return Vector3.Create(a.x - b.x, a.y - b.y, a.z - b.z)
End Function

Function Multiply:Vector3(a:Vector3, s:Float)
Return Vector3.Create(a.x * s, a.y * s, a.z * s)
End Function

Function Divide:Vector3(a:Vector3, s:Float)
If s <> 0
Return Vector3.Create(a.x / s, a.y / s, a.z / s)
End If
End Function

Method Absolute:Float()
Return Sqr(Self.x ^ 2 + Self.y ^ 2 + Self.z ^ 2)
End Method

Function DotProduct:Float(a:Vector3, b:Vector3)
Return a.x * b.x + a.y * b.y + a.z * b.z
End Function

Function VectorProduct:Vector3(a:Vector3, b:Vector3)
Return Vector3.Create(a.y * b.z - a.z - b.y, a.z * b.x - a.x * b.z, a.x * b.y - a.y * b.x)
End Function

Function AngleBetween:Float(a:Vector3, b:Vector3)
Return ACos(Vector3.DotProduct(a, b) / (a.Absolute() * b.Absolute()))
End Function

Function Normal:Vector3(a:Vector3, b:Vector3)
Local tmp:Vector3 = Vector3.VectorProduct(a, b)
Return Vector3.Divide(tmp, tmp.Absolute())
End Function

Method Draw(repX:Int, repY:Int)
DrawOval repX - 2, repY - 2, 4, 4
DrawLine repX, repY, repX + Self.x - Cos(45) * Self.z, repY + Self.y - Sin(45) * Self.z
End Method
End Type


Erläuterung:

(Ich werde Vektoren mit kleinen, lateinischen Buchstaben ohne Pfeil bennen, weil man diesen im ASCII Alphabet vergeblich sucht...)

Code: [AUSKLAPPEN]

Klasse Vector3:

  Funktionen:

    Create:Vector3(x:Float,y:Float,z:Float)
      Erstellt einen neuen Vektor mit den Komponenten x, y und z und gibt ihn als Vector3 zurück

    Add:Vector3(a:Vector3,b:Vector3)
      Addiert die zwei Vektoren a und b und gibt das Ergebnis als Vector3 zurück

      c = a + b

    Subtract:Vector3(a:Vector3,b:Vector3)
      Subtrahiert Vektor b von Vektor a und gibt das Ergebnis als Vector3 zurück

      c = a - b

    Multiply:Vector3(a:Vector3,s:Float)
      Multipliziert den Vektor a mit dem Skalar s und gibt das Ergebnis als Vector3 zurück

      c = s (Skalar) * a

    Divide:Vector3(a:Vector3,s:Float)
      Dividiert den Vektor a durch den Skalar s und gibt das Ergebnis als Vector3 zurück
      Wenn gilt s = 0, dann gibt die Funktion null zurück

      c = a / s (Skalar)

    DotProduct:Float(a:Vector3,b:Vector3)
      Berechnet das Skalar- / Punktprodukt der Vektoren a und b und gibt das Ergebnis als Float zurück

      s (Skalar) = a ○ b

    VectorProduct:Vector3(a:Vector3,b:Vector3)
      Berechnet das Kreuz- / Vektorprodukt der Vektoren a und b und gibt das Ergebnis als Vector3 zurück

      c = a x b

    AngleBetween:Float(a:Vector3,b:Vector3)
      Berechnet den durch die Vektoren a und b eingeschlossenen Winkel und gibt ihn als Float zurück

           a ○ b
      φ = -------
          |a|*|b|

    Normal:Vector3(a:Vector3,b:Vector3)
      Berechnet den Normalvektor der Vektoren a und b in einem Rechtssystems, bringt dessen Betrag auf 1 und gibt das Ergebnis als Vector3 zurück

  Methoden:

    Absolute:Float()
      Gibt den Betrag des Vektors der Instanz a als Float zurück

      s (Skalar) = |a|

    Draw(repX:Int, repY:Int)
      Zeichnet einen Repräsentanten des Vektors der Instanz a an die Stelle repX, repY, wobei der Punkt den Anfang des Repräsentanten symbolisiert und der z-Achse unveränderlich um den Faktor sqr(2)/2 gestaucht ist


----------

Beispiel - wofür braucht man den Mist denn jetzt und wie wendet man die Klassen an?


Code: [AUSKLAPPEN]

Berechnung des Volumens des Spates, der durch die Vektoren a, b und c definiert ist

a:Vector3 = Vector3.Create(3, 0, 0)
b:Vector3 = Vector3.Create(3, 4, 0)
c:Vector3 = Vector3.Create(3, 5, 6)

v:Float = Vector3.DotProduct(Vector3.VectorProduct(a,b), c)

-------

Mathematisch:

V = (a x b) ○ c



-------

Ich hoffe die Klassen helfen ein wenig...

Gruß,
Tim

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group