ESM Math Library

From the Oblivion ConstructionSet Wiki
Revision as of 12:29, 9 May 2006 by imported>JustTim
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Welcome to the Stage Function Repository! The goal of the Repository is, to create a huge database of available functions all using the method descripted in the article Simulating new functions. If you've written such a function and you think it might be helpful to others, don't hesitate to contribute to this repository.

Quest Script

ScriptName FunctionQuestScript

; Internals
short doOnce
float fQuestDelayTime

; Constants
float pi
float rad

; Function In- and Output
float fin1
float fin2
float fin3
float fout
float fout2
float fout3

;S5 FUNCTION sqrt
float sqr

;S10 FUNCTION Hypotenuse
;float sqr
float n

;S15 FUNCTION SinCosTan 1
float ang
float sin
float cos
float tan
float exp

;S16 FUNCTION SinCodTan 2
;float ang
;float sin
;float cos
float t1
float t2
float t5
float t6

;S20 FUNCTION Arcsine 1
;float sin
;float ang
;float n

;S21 FUNCTION Arcsine 2
float t3
;float t5
float t7

;S22 FUNCTION Arccosine 1

;S23 FUNCTION Arccosine 2

;S24 FUNCTION Arctan
;float t3
;float t5
;float t7

;S30 FUNCTION getAngle
float tan
;float ang

; Set constants first
Begin Gamemode
  if doOnce == 0
    set pi to 3.1415927
    set rad to 180.0/pi

    set fQuestDelayTime to 30
    set doOnce to 1
  endif
End

Stage5: Square Root

Based on Square Root Article

;FUNCTION float sqrt(float input)
if (f.fin1 <= 0)
  set f.fout to 0
else
  set f.sqr to f.fin1/2
  set f.sqr to (f.sqr+(f.fin1/f.sqr))/2
  set f.sqr to (f.sqr+(f.fin1/f.sqr))/2
  set f.sqr to (f.sqr+(f.fin1/f.sqr))/2
  set f.sqr to (f.sqr+(f.fin1/f.sqr))/2
  set f.sqr to (f.sqr+(f.fin1/f.sqr))/2
  set f.fout to f.sqr
endif

Stage10: Hypotenuse

;FUNCTION float Hypotenuse(float CathetusA, float CathetusB)

set f.n to ((f.fin1 * f.fin1) + (f.fin2 * f.fin2))
;FUNCTION float sqrt(float input)
set f.fin1 to f.n
setStage f 5
;fout is already the result

Stage15: Sin Cos Tan

Based on Trigonometry Functions Article

;FUNCTION float,float,float SinCosTan(float Angle)
;Taylor Series Variant 1 - script by Galerion

set f.ang to f.fin1

if f.ang < -180
  set f.ang to (f.ang + 360)
elseif f.ang > 180
  set f.ang to (f.ang - 360)
endif

;approximate
set f.ang to (f.ang/f.rad)
set f.cos to 1
set f.exp to f.ang
set f.sin to f.exp
set f.exp to (f.exp * f.ang)
set f.cos to (f.cos - f.exp / 2)
set f.exp to (f.exp * f.ang)
set f.sin to (f.sin - f.exp / 6)
set f.exp to (f.exp * f.ang)
set f.cos to (f.cos + f.exp / 24)
set f.exp to (f.exp * f.ang)
set f.sin to (f.sin + f.exp / 120)
set f.exp to (f.exp * f.ang)
set f.cos to (f.cos - f.exp / 720)
set f.exp to (f.exp * f.ang)
set f.sin to (f.sin - f.exp / 5040)
set f.exp to (f.exp * f.ang)
set f.cos to (f.cos + f.exp / 40320)
set f.exp to (f.exp * f.ang)
set f.sin to (f.sin + f.exp / 362880)

set f.fout to f.sin
set f.fout2 to f.cos
set f.fout3 to (f.sin/f.cos) ;tan

Stage16: Sin Cos Tan 2

Based on Trigonometry Functions Article

;FUNCTION float,float,float SinCosTan(float Angle)
;Taylor Series Variant 2 - script by JOG

set f.ang to f.fin1

if f.ang < -180
  set f.ang to f.ang + 360
elseif f.ang > 180
  set f.ang to f.ang - 360
endif

set f.t1 to (f.ang/f.rad)
set f.t2 to (f.t1*f.t1)
set f.t5 to (f.t2*f.t2*f.t1)
set f.t6 to (f.t5*f.t1)
set f.sin to (f.t1 - (f.t1*f.t2/6) + (f.t5/120) - (f.t5*f.t2/5040) + (f.t6*f.t2*f.t1/362880))
set f.cos to (1 - (f.t2/2) + (f.t2*f.t2/24) - (f.t6/720) + (f.t6*f.t2/40320))

set f.fout to f.sin
set f.fout2 to f.cos
set f.fout3 to f.sin/f.cos ;tan

Stage20: Arcsine

Based on Trigonometry Functions Article

;FUNCTION float Arcsine(float sin)
;Abramowitz/Stegun Approximation - script by JOG

float sin
float ang
float n

set f.sin to f.fin1
set f.n to 1 - f.sin
set f.ang to f.n/2
set f.ang to (f.ang+(f.n/f.ang))/2
set f.ang to (f.ang+(f.n/f.ang))/2
set f.ang to (f.ang+(f.n/f.ang))/2
set f.n to (f.ang+(f.n/f.ang))/2

set f.fout to f.rad*(1.5707963-f.n*(1.5707288-0.2121144*f.sin+0.0742610*f.sin*f.sin-0.0187293*f.sin*f.sin*f.sin))

Stage21: Arcsine 2

Based on Trigonometry Functions Article

;FUNCTION float Arcsine(float sin)
;Approximation by Taylor Series - script by DragoonWraith

float t3
float t5
float t7

set f.t3 to (f.fin1 * f.fin1 * f.fin1)
set f.t5 to (f.t3 * f.fin1 * f.fin1)
set f.t7 to (f.t5 * f.fin1 * f.fin1)

set f.fout to (f.fin1 + (1/2)*(t3/3) + (3/8)*(t5/5) + (15/48)*(t7/7) )

Stage22: Aroccosine

Based on Trigonometry Functions Article

;FUNCTION float Arccosine(float cos)
setStage f 20 ;Call Arcsine with same input
set f.fout to ((f.pi / 2) - f.fout)

Stage23: Arccosine 2

Based on Trigonometry Functions Article

;FUNCTION float Arccosine(float cos)
setStage f 21 ;Call Arcsine with same input
set f.fout to ((f.pi / 2) - f.fout)

Stage24: Arctan

Based on Trigonometry Functions Article

;FUNCTION float Arctan(float tan)
;Approximation by Taylor Series - script by DragoonWraith

float t3
float t5
float t7

set f.t3 to (f.fin1 * f.fin1 * f.fin1)
set f.t5 to (f.t3 * f.fin1 * f.fin1)
set f.t7 to (f.t5 * f.fin1 * f.fin1)

set f.fout to (f.fin1 - (f.t3/3) + (f.t5/5) - (f.t7/7))

Stage30: getAngle

;FUNCTION float getAngle(float x, float y)

set f.tan to (f.fin1/f.fin2)
if f.tan >1 || f.tan < -1
  set f.tan to (f.fin2/ -f.fin1)
  if f.fin1 >= 0
    set f.ang to 90
  else
    set f.ang to -90
  endif
else
  if f.fin2 >= 0
    set f.ang to 0
  else
    set f.ang to 180
  endif
endif

set f.fin1 to f.tan
setStage f 24 ;Call Arctan

if f.fout > (f.pi/2)
  set f.fout to (f.pi/2)
elseif f.fout < (f.pi/ -2)
  set f.fout to (f.pi/ -2)
endif
set f.fout to ((f.fout*f.rad) + f.ang)