Ooops
January 19, 2021, 05:24:24 AM

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

Offline 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"
  7. ModuleInfo "License: Public Domain"
  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
  76.         Method Add(_x:Float,_y:Float)
  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
  84.         Method AddVec(Vec:TVec2)
  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


Comments :


Yahfree(Posted 1+ years ago)

 and here's an example:
Code: [Select]
SuperStrict

Import yah.TVec2

AppTitle = "Ball Vector example"
Graphics 800 , 600

Global 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 Method
End Type


While 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 1
Wend



slenkar(Posted 1+ years ago)

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

 

SimplePortal 2.3.6 © 2008-2014, SimplePortal