Dreidimensionale Vektoren

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

DAK

Betreff: Dreidimensionale Vektoren

BeitragDo, Dez 26, 2013 1:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Habe hier mal eine kleine "Helperklasse" (weiß nicht, wie man es unter BB nennen würde, da es ja eigentlich keine Klassen gibt) geschrieben, die einem die ganze Arbeit mit dreidimensionalen Vektoren abnimmt.
Weiß nicht, ob es sowas schon gibt, ist ja nicht sonderlich schwer zu implementieren, macht aber die Arbeit doch deutlich einfacher, wenn man was mit den Dingern zutun hat.

BlitzBasic: [AUSKLAPPEN]
Type TVec3
Field x#
Field y#
Field z#
End Type

Local P1.TVec3 = CreateVec3(1,2,3)
Local P2.TVec3 = CreateVec3(4,5,6)

Delay 3000

;Erstellt einen neuen Vektor
Function CreateVec3.TVec3(x#,y#,z#)
out.TVec3 = New TVec3
out\x = x
out\y = y
out\z = z
Return out
End Function

;Gibt eine String-Repräsentation des Vektors zurück.
Function Vec3ToString$(a.TVec3)
Return "( "+a\x+" | "+a\y+" | "+a\z+" )"
End Function

;Gibt einen neuen Vektor zurück, der die
;Addition des Vektors a plus b
;darstellt.
Function Vec3Add.TVec3(a.TVec3, b.TVec3)
out.TVec3 = New TVec3
out\x = a\x+b\x
out\y = a\y+b\y
out\z = a\z+b\z
Return out
End Function

;Addiert a+b und schreibt das Resultat in Vektor a.
Function Vec3AddLocal.TVec3(a.TVec3, b.TVec3)
a\x = a\x+b\x
a\y = a\y+b\y
a\z = a\z+b\z
Return a
End Function

;Gibt einen neuen Vektor zurück, der die
;Subtraktion des Vektors a minus b
;darstellt.
Function Vec3Sub.TVec3(a.TVec3, b.TVec3)
out.TVec3 = New TVec3
out\x = a\x-b\x
out\y = a\y-b\y
out\z = a\z-b\z
Return out
End Function

;Subtrahiert a-b und schreibt das Resultat in Vektor a.
Function Vec3SubLocal.TVec3(a.TVec3, b.TVec3)
a\x = a\x-b\x
a\y = a\y-b\y
a\z = a\z-b\z
Return a
End Function

;Gibt einen neuen Vektor zurück, der die
;elementweise Multiplikation des Vektors a mal b
;darstellt.
Function Vec3MulElem.TVec3(a.TVec3, b.TVec3)
out.TVec3 = New TVec3
out\x = a\x*b\x
out\y = a\y*b\y
out\z = a\z*b\z
Return out
End Function

;Multipliziert a*b und schreibt das Resultat in Vektor a.
Function Vec3MulElemLocal.TVec3(a.TVec3, b.TVec3)
a\x = a\x*b\x
a\y = a\y*b\y
a\z = a\z*b\z
Return a
End Function

;Gibt einen neuen Vektor zurück, der die
;elementweise Multiplikation des Vektors a mal des Skalars s
;darstellt.
Function Vec3Mul.TVec3(a.TVec3, s#)
out.TVec3 = New TVec3
out\x = a\x*s
out\y = a\y*s
out\z = a\z*s
Return out
End Function

;Multipliziert a*s und schreibt das Resultat in Vektor a.
Function Vec3MulLocal.TVec3(a.TVec3, s#)
a\x = a\x*s
a\y = a\y*s
a\z = a\z*s
Return a
End Function

;Gibt einen neuen Vektor zurück, der die
;elementweise Division des Vektors a durch b
;darstellt.
;Keines der Elemente in b darf 0 sein!
Function Vec3DivElem.TVec3(a.TVec3, b.TVec3)
out.TVec3 = New TVec3
out\x = a\x/b\x
out\y = a\y/b\y
out\z = a\z/b\z
Return out
End Function

;Dividiert a/b und schreibt das Resultat in Vektor a.
;Keines der Elemente in b darf 0 sein!
Function Vec3DivElemLocal.TVec3(a.TVec3, b.TVec3)
a\x = a\x/b\x
a\y = a\y/b\y
a\z = a\z/b\z
Return a
End Function

;Gibt einen neuen Vektor zurück, der die
;elementweise Division des Vektors a durch den Skalar s
;darstellt.
;Keines der Elemente in b darf 0 sein!
Function Vec3Div.TVec3(a.TVec3, s#)
out.TVec3 = New TVec3
out\x = a\x/s
out\y = a\y/s
out\z = a\z/s
Return out
End Function

;Dividiert a/s und schreibt das Resultat in Vektor a.
;Keines der Elemente in b darf 0 sein!
Function Vec3DivLocal.TVec3(a.TVec3, s#)
a\x = a\x/s
a\y = a\y/s
a\z = a\z/s
Return a
End Function

;Gibt das Skalarprodukt des Vektors zurück.
Function Vec3DotProduct#(a.TVec3, b.TVec3)
Return a\x*b\x + a\y*b\y + a\z*b\z
End Function

;Gibt einen neuen Vektor zurück, der in die gleiche Richtung zeigt,
;wie der eingegebene Vektor, dessen Länge genau 1 beträgt.
;Die Länge des Eingabevektors muss größer als 0 sein!
Function Vec3Normalize.TVec3(a.TVec3)
length# = Sqr(a\x*a\x+a\y*a\y+a\z*a\z)
out.TVec3 = New TVec3
out\x = a\x/length
out\y = a\y/length
out\z = a\z/length
Return out
End Function

;Dividiert den Eingabevektor durch seine Länge, woduch
;seine Richtung nicht verändert wird, seine Länge aber
;auf 1 gebracht wird.
;Die Länge des Eingabevektors muss größer als 0 sein!
Function Vec3NormalizeLocal.TVec3(a.TVec3)
length# = Sqr(a\x*a\x+a\y*a\y+a\z*a\z)
a\x = a\x/length
a\y = a\y/length
a\z = a\z/length
Return out
End Function

;Gibt die Länge des Vektors zurück.
Function Vec3Length#(a.TVec3)
Return Sqr(a\x*a\x+a\y*a\y+a\z*a\z)
End Function

;Gibt das Kreuz- oder Vektorprodukt der eingegebenen Vektoren zurück.
;Dieser Rückgabewert ist ein Vektor, der normal auf die beiden
;eingegebenen Vektoren steht.
Function Vec3CrossProduct.TVec3(a.TVec3, b.TVec3)
out.TVec3 = New TVec3
out\x = a\y*b\z-a\z*b\y
out\y = a\z*b\x-a\x*b\z
out\z = a\x*b\y-a\y*b\x
Return out
End Function

;Setzt a auf das Kreuz- oder Vektorprodukt der eingegebenen Vektoren.
;Dieser Rückgabewert ist ein Vektor, der normal auf die beiden
;eingegebenen Vektoren steht.
Function Vec3CrossProductLocal.TVec3(a.TVec3, b.TVec3)
x# = a\y*b\z-a\z*b\y
y# = a\z*b\x-a\x*b\z
z# = a\x*b\y-a\y*b\x
a\x = x
a\y = y
a\z = z
Return a
End Function

;Gibt den Winkel zwischen zwei Vektoren zurück. Länge der Vektoren muss größer als 0 sein!
Function Vec3Angle#(a.TVec3, b.TVec3)
length# = Sqr(a\x*a\x+a\y*a\y+a\z*a\z)
dot# = a\x*b\x + a\y*b\y + a\z*b\z
Return ACos(dot#/length#)
End Function


Ist eigentlich auch ganz gut ausdokumentiert, sagt aber bitte bescheid, wenn irgendwas unklar ist.

Viel Spaß damit!

Edit: Multiplikation und Division mit einem Skalar hinzugefügt.
Gewinner der 6. und der 68. BlitzCodeCompo

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group