Complex Sliding

C

CryptWizard

Guest
This tutorial will teach you some basic relevant trigonometry and physics, how to implement it in JASS, then finish with a simple spell that applies those skills.

NOTE: This is a tutorial where you actually learn stuff, not just copy and paste a whole heap of code you don't understand. If you were looking to copy and paste something, please go to another tutorial.

Pre-requisites:
- Vexorian's CSCache (http://www.wc3campaigns.net/showthread.php?t=80534) or Kattana's Local Handle Vars (I will be referring to the former)
- JassCraft (http://www.wc3campaigns.net/showthread.php?t=80051) (Not necessary, but very helpful)

Physics of Acceleration
v = u + at
Velocity = Initial Velocity + Acceleration x Time

Self explanatory. We will be using this formula throughout the tutorial

Trigonometry
You will need to know how to convert from a polar coordinate to a rectangular coordinate and vice-versa.

What is a Polar Coordinate?
It is a way of reffering to a point on the number plane (or game map), with a radius (r) and an angle (theta (θ)).

<Diagram coming soon>
NOTE: Normally in maths, r is from the origin, but for pratical purposes in Warcraft, it will be from an offset.

What is a Rectangular Coordinate?
It is a way of reffering to a point on the number plane by a X and Y value.

<Diagram coming soon>

Polar -> Rectangular
X = OffsetX + r * Cos(θ)
Y = OffsetY + r * Sin(θ)

Rectangular -> Polar
r = SquareRoot(Pow(X - OffsetX, 2) + Pow(Y - OffsetY, 2))
θ = Atan(Y - OffsetY / X - OffsetX)

NOTE: Equasion for r is a.k.a. Pythagoras's Theorem
NOTE: Blizzard gives us the Atan2 native, which allows us to replace the / in the equasion for θ with a , and I am presuming it's faster.

Triginometry Code Samples
Let's write some simple helper functions that will convert between the two types of coordinates for us (I know there's PolarProjectionBj(), but that's a crap).

This will return the radius part of converting Rect -> Polar
Code:
function RadiusOf takes real x, real y returns real
    return SquareRoot(Pow(x, 2) + Pow(y, 2))
endfunction

Blizzard provides an Atan2 function that divides for us, so why not create a RadiusOf2 function that will subtract for us:
Code:
function RadiusOf2 takes real x, real offx, real y, real offy returns real
    return SquareRoot(Pow(x - offx, 2) + Pow(y - offy, 2))
endfunction

This will return the angle:
Code:
function ThetaOf takes real x, real y returns real
    return Atan2(y, x)
endfunction
function ThetaOf2 takes real x, real offx, real y, real offy returns real
    return Atan2(y - offy, x - offx)
endfunction

Moving onto Rect -> Polar...

X of a Polar Coordinate:
Code:
function XOf takes real r, real theta returns real
    return r * Cos(theta)
endfunction
function XOf2 takes real r, real theta, real offx returns real
    return offx + r * Cos(theta)
endfunction

Y:
Code:
function YOf takes real r, real theta returns real
    return r * Cos(theta)
endfunction
function YOf2 takes real r, real theta, real offy returns real
    return offy + r * Cos(theta)
endfunction

Technical Warcraft side of things
We will have to use a timer to periodically call the SetUnitPosition() native. We have to decide the optimum time for the timer to run with not much lag and still looking good. Vexorian has decided that this should be every 0.04 seconds. Now, most programmers know that it is good practice to reuse code, and to write reusable code (remember Intel's former ever so famous slogan which is also the name of a ladder map "Divide and Conquer", it has since been superseded by Objected Orientated Programming, but JASS is a retarded scripting language that doesn't have that). That means that we should make a function that we can call with all the variables listed above from any trigger and we can get the unit to move, thus reusing code.
Here are the variables we want our unit moving helper function to take:
  • Unit to be moved
  • Place where unit should be moved to (Rect or Polar)
  • How often the timer runs (good to have this configurable)
  • Initial Velocity
  • Acceleration
  • Terminal (Maximum) Velocity (since we are using a timer, this isn't limited to 522)

To be continued (hopefully tomorrow)...
Still to come: How to make the spell
 

wonderpriest

New Member
Reaction score
18
I like it, but maybe you should have named it differently. I'm glad more things are using math lately. Looking forward to see the finish.

Just a few little tiny things you could change:

Code:
function RadiusOf takes real x, real y returns real
    return SquareRoot(Pow(x, 2) + Pow(y, 2))
endfunction
So... SquareRoot(x*x+y*y). Avoid using the functions if you can.

Code:
function RadiusOf2 takes real x, real offx, real y, real offy returns real
    return SquareRoot(Pow(x - offx, 2) + Pow(y - offy, 2))
endfunction
Just use RadiusOf() and subtract offx and offy when calling the function.

Code:
function ThetaOf takes real x, real y returns real
    return Atan2(y, x)
endfunction
function ThetaOf2 takes real x, real offx, real y, real offy returns real
    return Atan2(y - offy, x - offx)
endfunction
Same, just use ThetaOf()

Code:
function XOf takes real r, real theta returns real
    return r * Cos(theta)
endfunction
function XOf2 takes real r, real theta, real offx returns real
    return offx + r * Cos(theta)
endfunction
Same.

Code:
function YOf takes real r, real theta returns real
    return r * Cos(theta)
endfunction
function YOf2 takes real r, real theta, real offy returns real
    return offy + r * Cos(theta)
endfunction
Just rename XOf and use that.
 
General chit-chat
Help Users
  • No one is chatting at the moment.

      The Helper Discord

      Members online

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top