January 19, 2021, 05:24:24 AM

### Author Topic: [bmx] 2D Vector module by Yahfree [ 1+ years ago ]  (Read 412 times)

#### BlitzBot

• Jr. Member
• Posts: 1
##### [bmx] 2D Vector module by Yahfree [ 1+ years ago ]
« on: June 29, 2017, 12:28:40 AM »
Title : 2D Vector module
Author : Yahfree
Posted : 1+ years ago

Description : This module contains operations and algorithms for 2d vectors.

To create a vector use the following:

"myvector:TVec2 = New TVec2.Init(xval,yval)"

Code :
Code: BlitzMax
1. SuperStrict
2.
3. Module yah.tVec2
4.
5. ModuleInfo "Name: Yahfree's 2d vector Object"
6. ModuleInfo "Description: Object for handling vectors"
8. ModuleInfo "Author: Yahfree"
9.
10. Import brl.math
11.
12. Public
13. Rem
14. bbdoc: 2D Vector Object
15. End Rem
16. Type TVec2
17.         Field x:Float , y:Float
18.
19.         Rem
20.         bbdoc: Initalizes vector with x/y values
21.         EndRem
22.         Method Init:TVec2(_x:Float,_y:Float)
23.                 x = _x
24.                 y = _y
25.                 Return Self
26.         End Method
27.
28.         Rem
29.         bbdoc: Get the vector's X value
30.         EndRem
31.         Method GetX:Float()
32.                 Return x
33.         End Method
34.
35.         Rem
36.         bbdoc: Get the vector's Y value
37.         EndRem
38.         Method GetY:Float()
39.                 Return y
40.         End Method
41.
42.         Rem
43.         bbdoc: Set the vector's X value
44.         EndRem
45.         Method SetX(_x:Float)
46.                 x = _x
47.         End Method
48.
49.         Rem
50.         bbdoc: Set the vector's Y value
51.         EndRem
52.         Method SetY(_y:Float)
53.                 y = _y
54.         End Method
55.
56.         Rem
57.         bbdoc: Get the vector's angle
58.         EndRem
59.         Method GetAngle:Float()
60.                 Return ATan2(y,x)
61.         End Method
62.
63.         Rem
64.         bbdoc: Rotate the vector to an angle
65.         EndRem
66.         Method Rotate(ang:Float)
67.                 Local xprime:Float=Cos(ang)*x - Sin(ang)*y
68.                 Local yprime:Float=Sin(ang)*x + Cos(ang)*y
69.                 x=xprime
70.                 y=yprime
71.         End Method
72.
73.         Rem
74.         bbdoc: Add values to X and Y
75.         EndRem
77.                 x:+_x
78.                 y:+_y
79.         End Method
80.
81.         Rem
82.         bbdoc: Add a vector's x/y to this vector
83.         EndRem
85.                 If Vec=Null Return
86.                 x:+Vec.x
87.                 y:+Vec.y
88.         End Method
89.
90.         Rem
91.         bbdoc: Subtract values from X and Y
92.         EndRem
93.         Method Subtract(_x:Float,_y:Float)
94.                 x:-_x
95.                 y:-_y
96.         End Method
97.
98.         Rem
99.         bbdoc: Subtract a vector's x/y from this vector
100.         EndRem
101.         Method SubtractVec(Vec:TVec2)
102.                 If Vec=Null Return
103.                 x:-Vec.x
104.                 y:-Vec.y
105.         EndMethod
106.
107.         Rem
108.         bbdoc: Multiply a vector's x/y by 2 respective factors
109.         EndRem
110.         Method Multiply(_x:Float,_y:Float)
111.                 x:*_x
112.                 y:*_y
113.         EndMethod
114.
115.         Rem
116.         bbdoc: Multiply this vector by another vector's x/y values
117.         EndRem
118.         Method MultiplyVec(Vec:TVec2)
119.                 If Vec=Null Return
120.                 x:*Vec.x
121.                 y:*Vec.y
122.         EndMethod
123.
124.         Rem
125.         bbdoc: Divide a vector's x/y by 2 respective factors
126.         EndRem
127.         Method Divide(_x:Float,_y:Float)
128.                 If _x = 0 Or _y = 0 Return
129.                 x:/_x
130.                 y:/_y
131.         EndMethod
132.
133.         Rem
134.         bbdoc: Divide this vector by another vector's x/y values
135.         EndRem
136.         Method DivideVec(Vec:TVec2)
137.                 If Vec=Null Return
138.                 x:/Vec.x
139.                 y:/Vec.y
140.         EndMethod
141.
142.         Rem
143.         bbdoc: Get the dot product of this vector and "Vec"
144.         EndRem
145.         Method DotProduct:Float(Vec:TVec2)
146.                 Return x*Vec.x+y*Vec.y
147.         End Method
148.
149.         Rem
150.         bbdoc: Get the angle difference between this vector and "Vec"
151.         EndRem
152.         Method GetAngleDif:Float(Vec:TVec2)
153.                 If Vec=Null Return 0
154.                 Return Abs(TrueMod(ATan2(y,x)+180-ATan2(Vec.y,Vec.x),360)-180)
155.         EndMethod
156.
157.         Rem
158.         bbdoc: Returns a new vector that is the result of this vector reflecting off of "Vec"
159.         EndRem
160.         Method Reflected:TVec2(Vec:TVec2)
161.                 Local VecN:TVec2 = Vec.Normalized()
162.                 Local Vec1:TVec2 = Self.Copy()
163.                 Local VecN_DOT_Vec1:Float = VecN.DotProduct(Vec1)
164.                 VecN.Multiply(2*VecN_DOT_Vec1, 2*VecN_DOT_Vec1)
165.                 Vec1.SubtractVec(VecN)
166.                 Return Vec1
167.         End Method
168.
169.         Rem
170.         bbdoc: Returns a new vector that is the normalized version of this vector
171.         EndRem
172.         Method Normalized:TVec2()
173.                 Local magn:Float=Self.GetMagnitude()
174.                 Local Vector:TVec2=Self.Copy()
175.                 If magn<>0
176.                         Vector.x=x/magn
177.                         Vector.y=y/magn
178.                 EndIf
179.                 Return Vector
180.         End Method
181.
182.         Rem
183.         bbdoc: Get the length (magnitude) of the vector
184.         EndRem
185.         Method GetMagnitude:Float()
186.                 Return Sqr(x*x+y*y)
187.         End Method
188.
189.         Rem
190.         bbdoc: Returns a new vector that is an exact copy of this vector.
191.         EndRem
192.         Method Copy:TVec2()
193.                 Return New TVec2.Init(x,y)
194.         End Method
195. End Type
196.
197. Private
198. Function TrueMod:Float(val:Float,modul:Short)
199.         val:Mod modul
200.         If val<0 Then val:+modul
201.         Return val
202. EndFunction

Yahfree(Posted 1+ years ago)

and here's an example:
Code: [Select]
`SuperStrictImport yah.TVec2AppTitle = "Ball Vector example"Graphics 800 , 600Global list:TList = CreateList() Type ball Field vector:TVec2 Field x:Float , y:Float Global gravity:TVec2 = New TVec2.Init(0 , .1) Global bounceloss:TVec2 = New TVec2.Init(0 , 1) Global floorvec:TVec2 = New TVec2.Init(0 , -1) Global rightvec:TVec2 = New TVec2.Init(-1 , 0) Global leftvec:TVec2 = New TVec2.Init(1 , 0) Method New() vector = New TVec2.Init(Rand(-6,6),Rand(-6,-14)) x = 400 y = 500 ListAddLast(list,Self) End Method Method Update() If y > 580 If -vector.GetY() + bounceloss.GetY() < 0 vector = vector.Reflected(floorvec) vector.Addvec(bounceloss) Else list.Remove(Self) End If End If If x > 780 vector = vector.Reflected(rightvec) If x < 0 vector = vector.Reflected(leftvec) If y < 575 vector.AddVec(gravity) x:+ vector.GetX() y:+ vector.GetY() DrawOval x , y , 10 , 10 End MethodEnd TypeWhile Not KeyHit(KEY_ESCAPE) Cls If KeyDown(KEY_SPACE) Local one:ball = New ball End If For Local i:ball = EachIn list i.Update Next DrawText "press space",0,0 Flip 1Wend`

slenkar(Posted 1+ years ago)

thanks i use this all the time to get the angle between 2 points [/i]