Ooops
January 26, 2021, 11:56:22 AM

Author Topic: [bmx] Vector Class by Kurator [ 1+ years ago ]  (Read 485 times)

Offline BlitzBot

  • Jr. Member
  • **
  • Posts: 1
[bmx] Vector Class by Kurator [ 1+ years ago ]
« on: June 29, 2017, 12:28:38 AM »
Title : Vector Class
Author : Kurator
Posted : 1+ years ago

Description : Comments welcome :)

Code :
Code: BlitzMax
  1. SuperStrict
  2.  
  3. Type Vector
  4.  
  5.         Field X:Double
  6.         Field Y:Double
  7.         Field Z:Double
  8.        
  9.         Function Create:Vector(vx:Double, vy:Double, vz:Double)
  10.        
  11.                 Local TempVector:Vector = New Vector
  12.                
  13.                 TempVector.X = vx
  14.                 TempVector.Y = vy
  15.                 TempVector.Z = vz
  16.  
  17.                 Return TempVector
  18.        
  19.         EndFunction
  20.        
  21.         Method SetXYZ:Vector(vx:Double, vy:Double, vz:Double)
  22.        
  23.                 X = vx
  24.                 Y = vy
  25.                 Z = vz
  26.                
  27.                 Return Self
  28.        
  29.         EndMethod
  30.        
  31.         Method Set:Vector(v:Vector)
  32.        
  33.                 X = v.X
  34.                 Y = v.Y
  35.                 Z = v.Z
  36.                
  37.                 Return Self
  38.        
  39.         EndMethod
  40.        
  41.         Method Add:Vector(v:Vector)
  42.        
  43.                 If v
  44.                
  45.                         X = X + v.X
  46.                         Y = Y + v.Y
  47.                         Z = Z + v.Z
  48.                
  49.                 EndIf
  50.                
  51.                 Return Self
  52.        
  53.         EndMethod
  54.        
  55.         Method Sub:Vector(v:Vector)
  56.        
  57.                 If v
  58.                
  59.                         X = X - v.X
  60.                         Y = Y - v.Y
  61.                         Z = Z - v.Z
  62.                
  63.                 EndIf
  64.                
  65.                 Return Self
  66.        
  67.         EndMethod      
  68.        
  69.         Method SubXYZ:Vector(vx:Double, vy:Double, vz:Double)
  70.        
  71.                 X = X - vx
  72.                 Y = Y - vy
  73.                 Z = Z - vz
  74.                
  75.                 Return Self
  76.        
  77.         EndMethod      
  78.        
  79.         Method GetDotPV:Double(v:Vector)
  80.        
  81.                 If v
  82.                
  83.                         Return X * v.X + Y * v.Y + Z * v.Z
  84.                                
  85.                 EndIf
  86.                
  87.                 Return 0
  88.        
  89.         EndMethod
  90.        
  91.         Method CrossPV:Vector(v:Vector)
  92.        
  93.                 Local tx:Double, ty:Double, tz:Double
  94.  
  95.                 If v
  96.                
  97.                         tx = X
  98.                         ty = Y
  99.                         tz = Z
  100.                         X = ty * v.Z - tz * v.Y
  101.                         Y = tz * v.X - tx * v.Z
  102.                         Z = tx * v.Y - ty * v.X
  103.                
  104.                 EndIf  
  105.        
  106.                 Return Self
  107.        
  108.         EndMethod
  109.        
  110.         Method Mul:Vector(factor:Double)
  111.        
  112.                 X :* factor
  113.                 Y :* factor
  114.                 Z :* factor
  115.                
  116.                 Return Self
  117.        
  118.         EndMethod
  119.        
  120.         Method Div:Vector(divisor:Double)
  121.        
  122.                 Local factor:Double
  123.                
  124.                 factor = 1 / divisor
  125.                
  126.                 X :* factor
  127.                 Y :* factor
  128.                 Z :* factor
  129.                
  130.                 Return Self            
  131.        
  132.         EndMethod
  133.        
  134.         Method Normalize:Vector()
  135.  
  136.                 Local factor:Double
  137.                
  138.                 factor = 1.0 / self.GetLength()
  139.                
  140.                 X :* factor
  141.                 Y :* factor
  142.                 Z :* factor
  143.                
  144.                 Return Self                            
  145.        
  146.         EndMethod
  147.        
  148.         Method RotateAroundX:Vector(angle:Double)
  149.        
  150.                 Local tx:Double, ty:Double, tz:Double
  151.                
  152.                 tx = X
  153.                 ty = Y
  154.                 tz = Z
  155.                 ' X = tx
  156.                 Y = Cos(angle) * ty - Sin(angle) * tz
  157.                 Z = Sin(angle) * ty + Cos(angle) * tz          
  158.                
  159.                 Return Self
  160.        
  161.         EndMethod
  162.        
  163.         Method RotateAroundY:Vector(angle:Double)
  164.        
  165.                 Local tx:Double, ty:Double, tz:Double
  166.                
  167.                 tx = X
  168.                 ty = Y
  169.                 tz = Z
  170.                 X = Cos(angle) * tx + Sin(angle) * tz
  171.                 ' Y = ty  
  172.                 Z = -Sin(angle) * tx + Cos(angle) * tz         
  173.                
  174.                 Return Self
  175.        
  176.         EndMethod
  177.        
  178.         Method RotateAroundZ:Vector(angle:Double)
  179.        
  180.                 Local tx:Double, ty:Double, tz:Double
  181.                
  182.                 tx = X
  183.                 ty = Y
  184.                 tz = Z
  185.                 X = Cos(angle) * tx - Sin(angle) * ty
  186.                 Y = Sin(angle) * tx + Cos(angle) * ty  
  187.                 ' Z = tz               
  188.                
  189.                 Return Self
  190.        
  191.         EndMethod
  192.        
  193.         Method RotateAroundV:Vector(v:Vector, angle:Double)
  194.        
  195.                 Local tx:Double, ty:Double, tz:Double, cosa:Double, sina:Double, ecosa:Double
  196.  
  197.                 cosa = Cos(angle)
  198.                 sina = Sin(angle)
  199.                 ecosa = 1.0 - cosa
  200.  
  201.                 tx = X
  202.                 ty = Y
  203.                 tz = Z
  204.                
  205.                 X = tx * (cosa + v.X * v.X * ecosa) + ty * (v.X * v.Y * ecosa - v.Z * sina) + tz * (v.X * v.Z * ecosa + v.Y * sina)
  206.                 Y = tx * (v.Y * v.X * ecosa + v.Z * sina) + ty * (cosa + v.Y * v.Y * ecosa) + tz * (v.Y * v.Z * ecosa - v.X * sina)
  207.                 Z = tx * (v.Z * v.X * ecosa - v.Y * sina) + ty * (v.Z * v.Y * ecosa + v.X * sina) + tz * (cosa + v.Z * v.Z * ecosa)
  208.                
  209.                 Return Self                            
  210.        
  211.         EndMethod      
  212.        
  213.         Method Copy2Vec:Vector()
  214.        
  215.                 Local v:Vector = New Vector
  216.        
  217.                 If v
  218.                
  219.                         v.X = X
  220.                         v.Y = Y
  221.                         v.Z = Z
  222.                
  223.                 EndIf
  224.                
  225.                 Return v
  226.                
  227.         EndMethod
  228.                
  229.         Method GetX:Double()
  230.        
  231.                 Return X:Double
  232.  
  233.         EndMethod
  234.        
  235.         Method GetY:Double()
  236.        
  237.                 Return Y:Double
  238.  
  239.         EndMethod
  240.  
  241.         Method GetZ:Double()
  242.        
  243.                 Return Z:Double
  244.  
  245.         EndMethod
  246.        
  247.         Method GetLength:Double()
  248.        
  249.                 Return Sqr(X * X + Y * Y + Z * Z)
  250.        
  251.         EndMethod
  252.        
  253.         Method GetLengthSqr:Double()
  254.        
  255.                 Return X * X + Y * Y + Z * Z
  256.        
  257.         EndMethod      
  258.        
  259.         Method SetX:Vector(newX:Double)
  260.        
  261.                 X = newX
  262.  
  263.         EndMethod
  264.        
  265.         Method SetY:Vector(newY:Double)
  266.        
  267.                 Y = newY
  268.  
  269.         EndMethod
  270.  
  271.         Method SetZ:Vector(newZ:Double)
  272.        
  273.                 Z = newZ
  274.  
  275.         EndMethod      
  276.  
  277. EndType
  278.  
  279. Rem
  280.  
  281.         DebugLog "Small Test Code"
  282.        
  283.         Local a:Vector
  284.         Local b:Vector
  285.        
  286.         Local t:Double
  287.        
  288.         a = vector.create(1, 2, 3)
  289.         b = vector.create(2, 3, 0)
  290.        
  291.        
  292.         DebugLog "Vector a"
  293.         DebugLog " a.x = " + String(a.GetX())
  294.         DebugLog " a.Y = " + String(a.GetY())
  295.         DebugLog " a.Z = " + String(a.GetZ())
  296.        
  297.         DebugLog "Vector b"
  298.         DebugLog " b.x = " + String(b.GetX())
  299.         DebugLog " b.Y = " + String(b.GetY())
  300.         DebugLog " b.Z = " + String(b.GetZ())
  301.        
  302.        
  303.         DebugLog "Adding Vector b to Vector a"
  304.         a.Add(b)
  305.         DebugLog "Vector a"
  306.         DebugLog " a.x = " + String(a.GetX())
  307.         DebugLog " a.Y = " + String(a.GetY())
  308.         DebugLog " a.Z = " + String(a.GetZ())
  309.        
  310.         DebugLog "Subtracting Vector b to Vector a"
  311.         a.Sub(b)
  312.         DebugLog "Vector a"
  313.         DebugLog " a.x = " + String(a.GetX())
  314.         DebugLog " a.Y = " + String(a.GetY())
  315.         DebugLog " a.Z = " + String(a.GetZ())
  316.         DebugLog "Length of Vector a = " + String(a.GetLength())
  317.         DebugLog "Length of Vector b = " + String(b.GetLength())
  318.         DebugLog "Normalize Vector b "
  319.         b.Normalize()
  320.         DebugLog "Vector b"
  321.         DebugLog " b.x = " + String(b.GetX())
  322.         DebugLog " b.Y = " + String(b.GetY())
  323.         DebugLog " b.Z = " + String(b.GetZ())
  324.         DebugLog "Length of Vector b = " + String(b.GetLength())
  325.         DebugLog "Rotate Vector a by 90 Degree around X Axis"
  326.         a.RotateAroundX(90)
  327.         DebugLog "Vector a"
  328.         DebugLog " a.x = " + String(a.GetX())
  329.         DebugLog " a.Y = " + String(a.GetY())
  330.         DebugLog " a.Z = " + String(a.GetZ())
  331.         DebugLog "Rotate Vector a by -90 Degree around X Axis"
  332.         a.RotateAroundX(-90)
  333.         DebugLog "Vector a"
  334.         DebugLog " a.x = " + String(a.GetX())
  335.         DebugLog " a.Y = " + String(a.GetY())
  336.         DebugLog " a.Z = " + String(a.GetZ())
  337.         DebugLog "Rotate Vector by 90 Degree around Vector b"
  338.         a.RotateAroundV(b,90)
  339.         DebugLog "Vector a"
  340.         DebugLog " a.x = " + String(a.GetX())
  341.         DebugLog " a.Y = " + String(a.GetY())
  342.         DebugLog " a.Z = " + String(a.GetZ())
  343.         DebugLog "Rotate Vector by -90 Degree around Vector b"
  344.         a.RotateAroundV(b,-90)
  345.         DebugLog "Vector a"
  346.         DebugLog " a.x = " + String(a.GetX())
  347.         DebugLog " a.Y = " + String(a.GetY())
  348.         DebugLog " a.Z = " + String(a.GetZ())
  349.        
  350. EndRem


Comments :


Chroma(Posted 1+ years ago)

 
Code: [Select]
Method SetXYZ:Vector(vx:Double, vy:Double, vz:Double)

X = vx
Y = vy
Z = vz

Return Self

EndMethod
I think it's better to do something like:
Code: [Select]
Method SetXYZ(vx:Double, vy:Double, vz:Double)

self.X = vx
self.Y = vy
self.Z = vz

EndMethod
Just get rid of the return part and use self. [/i]

 

SimplePortal 2.3.6 © 2008-2014, SimplePortal