Guest User

Untitled

a guest
May 16th, 2024
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; /////////////////////////////////////////////////////////////////////////////
  2. ;
  3. ;        ██████╗██████╗ ██╗     ██████╗  █████╗ ████████╗ ██████╗ ██████╗
  4. ;       ██╔════╝██╔══██╗██║     ██╔══██╗██╔══██╗╚══██╔══╝██╔═══██╗██╔══██╗
  5. ;       ██║     ██████╔╝██║     ██████╔╝███████║   ██║   ██║   ██║██████╔╝
  6. ;       ██║     ██╔═══╝ ██║     ██╔══██╗██╔══██║   ██║   ██║   ██║██╔══██╗
  7. ;       ╚██████╗██║     ███████╗██████╔╝██║  ██║   ██║   ╚██████╔╝██║  ██║
  8. ;        ╚═════╝╚═╝     ╚══════╝╚═════╝ ╚═╝  ╚═╝   ╚═╝    ╚═════╝ ╚═╝  ╚═╝
  9. ;
  10. ;
  11. ; MIT License
  12. ;
  13. ; Copyright (c) 2023 , CplBator
  14. ;
  15. ; Permission is hereby granted, free of charge, To any person obtaining a copy
  16. ; of this software And associated documentation files (the "Software"), To deal
  17. ; in the Software without restriction, including without limitation the rights
  18. ; To use, copy, modify, merge, publish, distribute, sublicense, And/Or sell
  19. ; copies of the Software, And To permit persons To whom the Software is
  20. ; furnished To do so, subject To the following conditions:
  21. ;
  22. ; The above copyright notice And this permission notice shall be included in all
  23. ; copies Or substantial portions of the Software.
  24. ;
  25. ; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS Or
  26. ; IMPLIED, INCLUDING BUT Not LIMITED To THE WARRANTIES OF MERCHANTABILITY,
  27. ; FITNESS For A PARTICULAR PURPOSE And NONINFRINGEMENT. IN NO EVENT SHALL THE
  28. ; AUTHORS Or COPYRIGHT HOLDERS BE LIABLE For ANY CLAIM, DAMAGES Or OTHER
  29. ; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT Or OTHERWISE, ARISING FROM,
  30. ; OUT OF Or IN CONNECTION With THE SOFTWARE Or THE USE Or OTHER DEALINGS IN THE
  31. ; SOFTWARE.
  32. ;
  33. ; /////////////////////////////////////////////////////////////////////////////  
  34.  
  35. XIncludeFile "Math.pbi"
  36.  
  37. ;//////////////////////////////////////////////////////////////////////////////
  38. ;
  39. ;//////////////////////////////////////////////////////////////////////////////
  40. DeclareModule Vector2
  41.  
  42.   Structure sVector2
  43.     *vtable
  44.     x.Math::real
  45.     y.Math::real
  46.   EndStructure
  47.  
  48.   Interface iVector2
  49.     Free()
  50.     Set(x.Math::real, y.Math::real)
  51.     SetX(value.Math::real)
  52.     X.Math::real()
  53.     SetY(value.Math::real)
  54.     Y.Math::real()
  55.     Add(left.iVector2, right.iVector2)
  56.     Sub(left.iVector2, right.iVector2)
  57.     Mul(left.iVector2, right.iVector2)
  58.     Div(left.iVector2, right.iVector2)
  59.     Scale(value.f)
  60.     Length.Math::real()
  61.     SquaredLength.Math::real()
  62.     Distance.Math::real(vector.iVector2)
  63.     SquaredDistance.Math::real(vector.iVector2)
  64.     DotProduct.Math::real(vector.iVector2)
  65.     Normalize.Math::real()
  66.     MidPoint(lhs.iVector2, rhs.iVector2)
  67.     Floor(cmp.iVector2)
  68.     Ceil(cmp.iVector2)
  69.     Perpendicular()
  70.     CrossProduct.Math::real(vec.iVector2)
  71.     IsZeroLength.l()
  72.     Reflect(normal.iVector2)
  73.     AngleBetween.Math::real(vec.iVector2)
  74.   EndInterface
  75.  
  76.   Declare.i New(x.Math::real = 0.0, y.Math::real = 0.0)
  77.   Declare.i Copy(source.iVector2, destination.iVector2 = #Null)
  78.  
  79. EndDeclareModule
  80.  
  81.  
  82.  
  83. ;//////////////////////////////////////////////////////////////////////////////
  84. ;
  85. ;//////////////////////////////////////////////////////////////////////////////
  86. Module Vector2
  87.  
  88.  
  89.   ;////////////////////////////////////////////////////////////////////////////
  90.   ;
  91.   ;////////////////////////////////////////////////////////////////////////////
  92.   Procedure.i New(x.Math::real = 0.0, y.Math::real = 0.0)
  93.     *v.sVector2 = AllocateStructure(sVector2)
  94.     If *v <> #Null
  95.       *v\vtable = ?vtable
  96.       *v\x = x
  97.       *v\y = y
  98.     EndIf
  99.     ProcedureReturn *v
  100.   EndProcedure
  101.  
  102.   ;////////////////////////////////////////////////////////////////////////////
  103.   ;
  104.   ;////////////////////////////////////////////////////////////////////////////
  105.   Procedure Free(*v.sVector2)
  106.     If *v <> #Null
  107.       FreeStructure(*v)
  108.     EndIf
  109.   EndProcedure
  110.  
  111.   ;////////////////////////////////////////////////////////////////////////////
  112.   ;
  113.   ;////////////////////////////////////////////////////////////////////////////
  114.   Procedure.i Copy(*source.sVector2, *destination.sVector2 = #Null)
  115.     If *destination = #Null
  116.       *destination = New(*source\x,*source\y)
  117.     Else      
  118.       *destination\x = *source\x
  119.       *destination\y = *source\y      
  120.     EndIf    
  121.     ProcedureReturn *destination
  122.   EndProcedure    
  123.  
  124.   ;////////////////////////////////////////////////////////////////////////////
  125.   ;
  126.   ;////////////////////////////////////////////////////////////////////////////
  127.   Procedure Set(*v.sVector2, x.Math::real, y.Math::real)
  128.     *v\x = x
  129.     *v\y = y
  130.   EndProcedure  
  131.  
  132.   ;////////////////////////////////////////////////////////////////////////////
  133.   ;
  134.   ;////////////////////////////////////////////////////////////////////////////
  135.   Procedure SetX(*v.sVector2, value.Math::real)
  136.     *v\x = value
  137.   EndProcedure  
  138.  
  139.   ;////////////////////////////////////////////////////////////////////////////
  140.   ;
  141.   ;////////////////////////////////////////////////////////////////////////////
  142.   Procedure.Math::real X(*v.sVector2)
  143.     ProcedureReturn *v\x
  144.   EndProcedure  
  145.  
  146.   ;////////////////////////////////////////////////////////////////////////////
  147.   ;
  148.   ;////////////////////////////////////////////////////////////////////////////
  149.   Procedure SetY(*v.sVector2, value.Math::real)
  150.     *v\y = value
  151.   EndProcedure  
  152.  
  153.   ;////////////////////////////////////////////////////////////////////////////
  154.   ;
  155.   ;////////////////////////////////////////////////////////////////////////////
  156.   Procedure.Math::real Y(*v.sVector2)
  157.     ProcedureReturn *v\y
  158.   EndProcedure
  159.  
  160.   ;////////////////////////////////////////////////////////////////////////////
  161.   ;
  162.   ;////////////////////////////////////////////////////////////////////////////
  163.   Procedure Add(*v.sVector2, *left.sVector2, *right.sVector2)
  164.     *v\x = *left\x + *right\x  
  165.     *v\y = *left\y + *right\y  
  166.   EndProcedure
  167.  
  168.   ;////////////////////////////////////////////////////////////////////////////
  169.   ;
  170.   ;////////////////////////////////////////////////////////////////////////////
  171.   Procedure Sub(*v.sVector2, *left.sVector2, *right.sVector2)
  172.     *v\x = *left\x + *right\x  
  173.     *v\y = *left\y + *right\y  
  174.   EndProcedure
  175.  
  176.   ;////////////////////////////////////////////////////////////////////////////
  177.   ;
  178.   ;////////////////////////////////////////////////////////////////////////////
  179.   Procedure Mul(*v.sVector2, *left.sVector2, *right.sVector2)
  180.     *v\x = *left\x * *right\x  
  181.     *v\y = *left\y * *right\y  
  182.   EndProcedure
  183.  
  184.   ;////////////////////////////////////////////////////////////////////////////
  185.   ;
  186.   ;////////////////////////////////////////////////////////////////////////////
  187.   Procedure Div(*v.sVector2, *left.sVector2, *right.sVector2)
  188.     *v\x = *left\x / *right\x  
  189.     *v\y = *left\y / *right\y  
  190.   EndProcedure
  191.  
  192.   ;////////////////////////////////////////////////////////////////////////////
  193.   ;
  194.   ;////////////////////////////////////////////////////////////////////////////
  195.   Procedure Scale(*v.sVector2, value.Math::real)
  196.     *v\x * value
  197.     *v\y * value
  198.   EndProcedure
  199.    
  200.   ;////////////////////////////////////////////////////////////////////////////
  201.   ;
  202.   ;////////////////////////////////////////////////////////////////////////////
  203.   Procedure.Math::real Length(*v.sVector2)
  204.     ProcedureReturn Sqr( *v\x * *v\x  + *v\y * *v\y )
  205.   EndProcedure
  206.  
  207.   ;////////////////////////////////////////////////////////////////////////////
  208.   ;
  209.   ;////////////////////////////////////////////////////////////////////////////
  210.   Procedure.Math::real SquaredLength(*v.sVector2)
  211.     ProcedureReturn (*v\x * *v\x)  + (*v\y * *v\y)
  212.   EndProcedure
  213.  
  214.   ;////////////////////////////////////////////////////////////////////////////
  215.   ;
  216.   ;////////////////////////////////////////////////////////////////////////////
  217.   Procedure.Math::real Distance(*v.sVector2, *rhs.sVector2)
  218.     temp.sVector2
  219.     temp\x = *v\x - *rhs\x
  220.     temp\y = *v\y - *rhs\y
  221.     ProcedureReturn Length(@temp)
  222.   EndProcedure
  223.  
  224.   ;////////////////////////////////////////////////////////////////////////////
  225.   ;
  226.   ;////////////////////////////////////////////////////////////////////////////
  227.   Procedure.Math::real SquaredDistance(*v.sVector2, *rhs.sVector2)
  228.     temp.sVector2
  229.     temp\x = *v\x - *rhs\x
  230.     temp\y = *v\y - *rhs\y
  231.     ProcedureReturn SquaredLength(@temp)
  232.   EndProcedure
  233.  
  234.   ;////////////////////////////////////////////////////////////////////////////
  235.   ;
  236.   ;////////////////////////////////////////////////////////////////////////////
  237.   Procedure.Math::real DotProduct(*v.sVector2, *vec.sVector2)
  238.     ProcedureReturn *v\x * *vec\x + *v\y * *vec\y  
  239.   EndProcedure
  240.  
  241.   ;////////////////////////////////////////////////////////////////////////////
  242.   ;
  243.   ;////////////////////////////////////////////////////////////////////////////
  244.   Procedure.Math::real Normalize(*v.sVector2)
  245.     fLength.Math::real = Length(*v)
  246.     If fLength > 0.0
  247.       fInvLength = 1.0 / fLength
  248.       *v\x * fInvLength
  249.       *v\y * fInvLength
  250.     EndIf
  251.     ProcedureReturn fLength
  252.   EndProcedure
  253.  
  254.   ;////////////////////////////////////////////////////////////////////////////
  255.   ;
  256.   ;////////////////////////////////////////////////////////////////////////////
  257.   Procedure MidPoint(*v.sVector2, *lhs.sVector2, *rhs.sVector2)
  258.     *v\x = (*lhs\x + *rhs\x) * 0.5
  259.     *v\y = (*lhs\y + *rhs\y) * 0.5
  260.   EndProcedure
  261.  
  262.   ;////////////////////////////////////////////////////////////////////////////
  263.   ;
  264.   ;////////////////////////////////////////////////////////////////////////////
  265.   Procedure Floor(*v.sVector2, *cmp.sVector2)
  266.     If *cmp\x < *v\x : *v\x = *cmp\x : EndIf  
  267.     If *cmp\y < *v\y : *v\y = *cmp\y : EndIf  
  268.   EndProcedure
  269.  
  270.   ;////////////////////////////////////////////////////////////////////////////
  271.   ;
  272.   ;////////////////////////////////////////////////////////////////////////////
  273.   Procedure Ceil(*v.sVector2, *cmp.sVector2)
  274.     If *cmp\x > *v\x : *v\x = *cmp\x : EndIf  
  275.     If *cmp\y > *v\y : *v\y = *cmp\y : EndIf  
  276.   EndProcedure
  277.  
  278.   ;////////////////////////////////////////////////////////////////////////////
  279.   ;
  280.   ;////////////////////////////////////////////////////////////////////////////
  281.   Procedure Perpendicular(*v.sVector2)
  282.     temp.Math::real = *v\x
  283.     *v\x = -*v\y
  284.     *v\y = temp
  285.   EndProcedure
  286.  
  287.   ;////////////////////////////////////////////////////////////////////////////
  288.   ;
  289.   ;////////////////////////////////////////////////////////////////////////////
  290.   Procedure.Math::real CrossProduct(*v.sVector2, *vec.sVector2)
  291.     ProcedureReturn *v\x * *vec\y - *vec\x * *v\y
  292.   EndProcedure
  293.  
  294.   ;////////////////////////////////////////////////////////////////////////////
  295.   ;
  296.   ;////////////////////////////////////////////////////////////////////////////
  297.   Procedure.l IsZeroLength(*v.sVector2)
  298.     fLength.Math::real = SquaredLength(*v)
  299.     If fLength < (1e-06 * 1e-06)
  300.       ProcedureReturn #True
  301.     Else
  302.       ProcedureReturn #False
  303.     EndIf
  304.   EndProcedure
  305.  
  306.   ;////////////////////////////////////////////////////////////////////////////
  307.   ;
  308.   ;////////////////////////////////////////////////////////////////////////////
  309.   Procedure Reflect(*v.sVector2, *normal.sVector2)
  310.     fDot.Math::real = DotProduct(*v, *normal)
  311.     *v\x = *v\x - 2 * fDot * *normal\x
  312.     *v\y = *v\y - 2 * fDot * *normal\y
  313.   EndProcedure
  314.  
  315.   ;////////////////////////////////////////////////////////////////////////////
  316.   ;
  317.   ;////////////////////////////////////////////////////////////////////////////
  318.   Procedure.Math::real AngleBetween(*v.sVector2, *other.sVector2)
  319.     angle.Math::real = ATan2(*other\y, -*other\x) - ATan2(*v\y, -*v\x)
  320.     angle + #PI / 2.0
  321.     If angle < 0 : angle + Math::#TWO_PI : EndIf
  322.     ProcedureReturn angle
  323.   EndProcedure
  324.  
  325.  
  326.    
  327.   ;////////////////////////////////////////////////////////////////////////////
  328.   ;
  329.   ;////////////////////////////////////////////////////////////////////////////
  330.   DataSection
  331.     vtable:      
  332.     Data.i @Free()
  333.     Data.i @Set()
  334.     Data.i @SetX()
  335.     Data.i @X()
  336.     Data.i @SetY()
  337.     Data.i @Y()
  338.     Data.i @Add()
  339.     Data.i @Sub()
  340.     Data.i @Mul()
  341.     Data.i @Div()
  342.     Data.i @Scale()
  343.     Data.i @Length()
  344.     Data.i @SquaredLength()
  345.     Data.i @Distance()
  346.     Data.i @SquaredDistance()
  347.     Data.i @DotProduct()
  348.     Data.i @Normalize()
  349.     Data.i @MidPoint()
  350.     Data.i @Floor()
  351.     Data.i @Ceil()
  352.     Data.i @Perpendicular()
  353.     Data.i @CrossProduct()
  354.     Data.i @IsZeroLength()
  355.     Data.i @Reflect()
  356.     Data.i @AngleBetween()      
  357.   EndDataSection
  358.  
  359. EndModule
Advertisement
Add Comment
Please, Sign In to add comment