summaryrefslogtreecommitdiff
path: root/vector.mod/vector.bmx
blob: 264f300c3d5204947cf0f9b2a0a0cca80e190db0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
Module noddybox.vector

ModuleInfo "Framework: Simple Vector class"
ModuleInfo "Copyright: Public Domain"
ModuleInfo "Author: Ian Cowburn"
ModuleInfo "Version: $Revision$"

' $Id$

Strict
Import brl.math

Type TVector

	Field x:Float
	Field y:Float
	Field z:Float


	' Creates a new vector
	'	
	' dx		- X componenent
	' dy		- Y componenent
	' dz		- Z componenent
	'
	' Returns null for invalid parameters.
	'
	Function Create:TVector(dx:Float, dy:Float, dz:Float)
		Local o:TVector
		
		o=New TVector
		
		o.x=dx
		o.y=dy
		o.z=dz
		
		Return o
	End Function
	
	' Is this vector null
	'
	Method IsNull:Int()
		Return x=0 And y=0 And z=0
	End Method
	
	' Get the length of the vector
	'
	Method Length:Float()
		If (IsNull())
			Return 0
		Else
			Return Sqr(x*x+y*y+z*z)
		EndIf
	End Method
	
	' Normalise the vector
	'
	Method Normalise()
		Local l:Float=Length()
		If (l<>0)
			x:/l
			y:/l
			z:/l
		EndIf
	End Method
	
	' Add a scalar to the vector
	'
	Method AddScalar(sc:Float)
		x:+sc
		y:+sc
		z:+sc
	End Method
	
	' Flip the vector
	'
	Method Minus()
		x=-x
		y=-y
		z=-z
	End Method
	
	' Scale the vector by a scalar
	'
	Method Scale(sc:Float)
		x:*sc
		y:*sc
		z:*sc
	End Method
	
	' Add another vector to this
	'
	Method Add(v:TVector)
		x:+v.x
		y:+v.y
		z:+v.z
	End Method
	
	' Subtract another vector from this
	'
	Method Subtract(v:TVector)
		x:-v.x
		y:-v.y
		z:-v.z
	End Method

	' Scale this with another vector
	'
	Method ScaleVector(v:TVector)
		x:*v.x
		y:*v.y
		z:*v.z
	End Method

	' Inverse scale this with another vector
	'
	Method InverseScaleVector(v:TVector)
		x:/v.x
		y:/v.y
		z:/v.z
	End Method
	
	' Calculate the cross product of this vector with another.
	' Returns a new vector.
	'
	Method Cross:TVector(v:TVector)
		Return TVector.Create(y * v.z - v.y * z, z * v.x - v.z * x, x * v.y - v.x * y)
	End Method

	' Calculate the dot product of this vector with another.
	'
	Method Dot:Float(v:TVector)
		Return x*v.x + y*v.y + z*v.z
	End Method

End Type