kingkingyyk3
Visitor (Welcome to the Jungle, Baby!)
- Reaction score
- 216
JASS:
///////////////////////////////////////////////////////////
//
// Progression Object
// by kingking
//
// Progression Object provides 2 types of progression.
// ~ Arithmetric
// ~ Geometric
//
// What is progression?
// <a href="http://en.wikipedia.org/wiki/Arithmetic_progression" target="_blank" class="link link--external" rel="nofollow ugc noopener">http://en.wikipedia.org/wiki/Arithmetic_progression</a>
// <a href="http://en.wikipedia.org/wiki/Geometric_Progression" target="_blank" class="link link--external" rel="nofollow ugc noopener">http://en.wikipedia.org/wiki/Geometric_Progression</a>
//
// Progression is useful in Jump systems, knockback systems,
// projectile systems for calculating distance travelled,
// acceleration, height....
//
// Instead of storing the progression data by yourself,
// the library provides storage solution for you.
//
// PO_Arithmetric.create() -> return a new arithmetric progression
// <vars>.start -> set the starting number.
// <vars>.difference -> set the difference.
// <vars>.getNumber(n) -> returns T(n)
// <vars>.getSum(n) -> returns S(n)
// <vars>.destroy() -> destroy the progression.
//
// PO_Geometric.create() -> return a new geometric progression
// <vars>.start -> set the starting number.
// <vars>.ratio -> set the ratio
// <vars>.getNumber(n) -> returns T(n)
// <vars>.getSum(n) -> return S(n)
// <vars>.getInfinite() -> return S(infinite)
// <vars>.destroy() -> destroy the progression.
//
// GetDifferenceByNumber(starting number, n, T(n) )
// GetDifferenceBySum(starting number, n, S(n) )
// GetStartingNumberByNumber(difference, n, T(n) )
// GetStartingNumberBySum(difference, n, S(n) )
//
// GetRatioByNumber(starting number, n, T(n) )
// GetStartingNumberGeoByNumber(ratio, n, T(n) )
// GetStartingNumberGeoBySum(ratio, n, S(n) )
//
// Log10(number)
//
// Requires : Jasshelper 0.A.2.A of later
/////////////////////////////////////////////////////
library PO
public struct Arithmetric
real start
real difference
method getNumber takes integer index returns real
//T(n) = a + (n-1)d
return .start - (index - 1.) * .difference
endmethod
method getSum takes integer index returns real
// n
//S(n) = --- ( 2a + (n-1)d )
// 2
return (index / 2.) * ((2. * .start) + (index - 1.) * .difference)
endmethod
method onDestroy takes nothing returns nothing
set .start = 0.
set .different = 0.
endmethod
endstruct
public struct Geometric
real start
real ratio
method getNumber takes integer index returns real
//T(n) = ar^(n-1)
return .start * Pow(.ratio,index - 1.)
endmethod
method getSum takes integer index returns real
if ratio < 1. then
// a (1 - r^n)
//S(n) = ------------
// 1 - r
return .start * (1. - Pow(.ratio,index)) / (1. - .ratio)
endif
// a (r^n - 1)
// S(n) = -------------
// r - 1
return .start * (Pow(.ratio,index) - 1.) / (.ratio - 1.)
endmethod
method getInfinite takes nothing returns real
// a
// S(infinite) = -------
// 1 - r
return .start / (1. - .ratio)
endmethod
method onDestroy takes nothing returns nothing
set .start = 0.
set .ratio = 0.
endmethod
endstruct
function GetDifferenceByNumber takes real start, integer index, real number returns real
// T(n) = a + (n - 1)d
// T(n) - a = (n - 1)d
// T(n) - a
// ---------- = d
// n - 1
return (number - start) / (index - 1)
endfunction
function GetStartingNumberByNumber takes real difference, integer index, real number returns real
// T(n) - (n - 1)d = a
return number - ((index - 1) * difference)
endfunction
function GetDifferenceBySum takes real start, integer index, real total returns real
// n
// S(n) = --- ( 2a + (n-1)d )
// 2
// n
// S(n) = n(a) + --- (n-1)d
// 2
// n
// S(n) - n(a) = --- (n-1)d
// 2
// S(n) - n(a)
// d = -------------
// (n/2) * (n-1)
return (total - (index * start)) / ((index / 2) * (index - 1))
endfunction
function GetStartingNumberBySum takes real difference, integer index, real total returns real
// n
// S(n) = --- ( 2a + (n-1)d )
// 2
// n
// S(n) = n(a) + --- (n-1)d
// 2
// n
// S(n) - --- (n-1)d = n(a)
// 2
// S(n) - (n / 2) * n-1(d)
// a = --------------------------
// n
return (total - ((index / 2) * ((index - 1) * difference))) / index
endfunction
function Log10 takes real a returns real //Thanks for BlinkBoy for making this. =D
local real sum = 0.0
local real e = 1.284025417
loop
exitwhen a < bj_E
set a = a/bj_E
set sum = sum + 1.
endloop
loop
exitwhen a < e
set a = a/e
set sum = sum + .25
endloop
return sum + (a-1.)*(1. + 8./(1.+ a) + 1/a)/6.
endfunction
function GetStartingNumberGeoByNumber takes real ratio, integer index, real number returns real
// n-1
// ar = T(n)
// T(n)
// a = -------
// r^n-1
return number / Pow(ratio,index-1)
endfunction
function GetStartingNumberGeoBySum takes real ratio, integer index, real total returns real
// a( 1 - r^n)
// S(n) = ---------
// 1 - r
// S(n) * (1 - r)
// --------------- = a
// 1 - r^n
if ratio < 1 then
return (total * (1 - ratio)) / (1 - Pow(ratio,index))
endif
// a( r^n - 1)
// S(n) = ---------
// r - 1
// S(n) * (r - 1)
// --------------- = a
// r^n - 1
return (total * (ratio - 1)) / (Pow(ratio,index) - 1)
endfunction
function GetRatioByNumber takes real start, integer index, real number returns real
// n-1
// ar = T(n)
// n-1 T(n)
// r = ------
// a
// ( T(n) )
// (n-1)lg r = lg ( ----- )
// ( a )
// ( T(n) )
// lg r = lg ( ----- ) / (n - 1)
// ( a )
//
// ( T(n) )
// lg ( ----- ) / (n - 1)
// ( a )
// r = 10^
return Pow(10,Log10(number / start) / (index-1))
endfunction
endlibrary
Some practical usage for slide system.
Deceleration = 20.
Starting Speed = 300.
Slide Tick = 20
Total Distance travelled = ?
JASS:
local PO_Arithmetric data = PO_Arithmetric.create()
local real dis
set data.start = 300.
set data.difference = -20. //for deceleration
set dis = data.getSum( 20) //total distance travelled