Difference between revisions of "Trigonometry Functions"
changed to stage functions
imported>JOG |
imported>DragoonWraith (changed to stage functions) |
||
Line 3: | Line 3: | ||
There are many methods of obtaining any or all of these, and each has its own benefits and drawbacks in terms of length, efficiency, and speed. This page is a work in progress - please add any scripts you have for approximating these functions. Please remember to comment them thoroughly and to use generic variable names. | There are many methods of obtaining any or all of these, and each has its own benefits and drawbacks in terms of length, efficiency, and speed. This page is a work in progress - please add any scripts you have for approximating these functions. Please remember to comment them thoroughly and to use generic variable names. | ||
These are [[:Category:Stage_Functions|Stage Functions]], and as such must be created as [[Quest Stages Tab|Quest Stages]] of a [[Global Script]] and called as a function. These examples assume a [[Quest]] called Wiki with the variables declared. Therefore, you must modify this code to include the name of your [[Quest]] (assuming it is not Wiki, which it shouldn't be). | |||
= Formulae = | = Formulae = | ||
Line 36: | Line 37: | ||
'''''tan(x) = x^1/1! + x^3/3! + x^5/5! + x^7/7! + ...''''' | '''''tan(x) = x^1/1! + x^3/3! + x^5/5! + x^7/7! + ...''''' | ||
== Taylor Series Variant 1 == | == Taylor Series Variant 1 == | ||
This [[:Category:Stage Functions|function]] requires the following variables to be declared in your [[Global Script]]: | |||
float ang (the measure of the angle) | |||
float rad (used internally) | |||
float exp (used internally) | |||
float sin (the sine of the angle) | |||
float cos (the cosine of the angle) | |||
float tan (the tangent of the angle) | |||
You may rename these if you wish, but that means changing the code, which is not advised, as there are a lot of variables here. All of them must be floats. | |||
; script originally by Galerion | ; script originally by Galerion | ||
; normalize angle | ; normalize angle | ||
if ( ang < -180 ) | if ( Wiki.ang < -180 ) | ||
set ang to ( ang + 360 ) | set Wiki.ang to ( Wiki.ang + 360 ) | ||
elseif ( ang > 180 ) | elseif ( Wiki.ang > 180 ) | ||
set ang to ( ang - 360 ) | set ang to ( Wiki.ang - 360 ) | ||
endif | endif | ||
; approximate sine and cosine of the angle | ; approximate sine and cosine of the angle | ||
set rad to ( ang * 0.0174533 ) | set Wiki.rad to ( Wiki.ang * 0.0174533 ) | ||
set cos to 1 | set Wiki.cos to 1 | ||
set exp to rad ; 1st | set Wiki.exp to Wiki.rad ; 1st | ||
set sin to exp | set Wiki.sin to Wiki.exp | ||
set exp to ( exp * rad ) ; 2nd | set Wiki.exp to ( Wiki.exp * Wiki.rad ) ; 2nd | ||
set cos to ( cos - exp / 2 ) | set Wiki.cos to ( Wiki.cos - Wiki.exp / 2 ) | ||
set exp to ( exp * rad ) ; 3rd | set Wiki.exp to ( Wiki.exp * Wiki.rad ) ; 3rd | ||
set sin to ( sin - exp / 6 ) | set Wiki.sin to ( Wiki.sin - Wiki.exp / 6 ) | ||
set exp to ( exp * rad ) ; 4th | set Wiki.exp to ( Wiki.exp * Wiki.rad ) ; 4th | ||
set cos to ( cos + exp / 24 ) | set Wiki.cos to ( Wiki.cos + Wiki.exp / 24 ) | ||
set exp to ( exp * rad ) ; 5th | set Wiki.exp to ( Wiki.exp * Wiki.rad ) ; 5th | ||
set sin to ( sin + exp / 120 ) | set Wiki.sin to ( Wiki.sin + Wiki.exp / 120 ) | ||
set exp to ( exp * rad ) ; 6th | set Wiki.exp to ( Wiki.exp * Wiki.rad ) ; 6th | ||
set cos to ( cos - exp / 720 ) | set Wiki.cos to ( Wiki.cos - Wiki.exp / 720 ) | ||
set exp to ( exp * rad ) ; 7th | set Wiki.exp to ( Wiki.exp * Wiki.rad ) ; 7th | ||
set sin to ( sin - exp / 5040 ) | set Wiki.sin to ( Wiki.sin - Wiki.exp / 5040 ) | ||
set exp to ( exp * rad ) ; 8th | set Wiki.exp to ( Wiki.exp * Wiki.rad ) ; 8th | ||
set cos to ( cos + exp / 40320 ) | set Wiki.cos to ( Wiki.cos + Wiki.exp / 40320 ) | ||
set exp to ( exp * rad ) ; 9th | set Wiki.exp to ( Wiki.exp * Wiki.rad ) ; 9th | ||
set sin to ( sin + exp / 362880 ) | set Wiki.sin to ( Wiki.sin + Wiki.exp / 362880 ) | ||
; get tangent | ; get tangent | ||
set tan to ( sin / cos ) | set Wiki.tan to ( Wiki.sin / Wiki.cos ) | ||
End | End | ||
This script is more accurate than it needs to be. Galerion suggests that only the first seven steps are necessary. | This script is more accurate than it needs to be. Galerion suggests that only the first seven steps are necessary. | ||
== Taylor Series Variant 2 == | == Taylor Series Variant 2 == | ||
This [[:Category:Stage Functions|function]] requires the following variables to be declared in your [[Global Script]]: | |||
float angle (measure of the angle) | |||
float t1 (used internally) | |||
float t2 (used internally) | |||
float t5 (used internally) | |||
float t6 (used internally) | |||
float sina (sine of the angle) | |||
float cosa (cosine of the angle) | |||
float tana (tangent of the angle) | |||
All must be floats. Though they can be renamed, doing so means changing the function code to match. | |||
; script originally by JOG | ; script originally by JOG | ||
; normalize the angle | |||
set Wiki.angle to Wiki.angle + 360*(Wiki.angle < -180) - 360*(Wiki.angle > 180) | |||
; precalculate powers of "angle" | |||
set Wiki.t1 to Wiki.angle / 57.29577951 | |||
set Wiki.t2 to Wiki.t1*Wiki.t1 | |||
set Wiki.t5 to Wiki.t2*Wiki.t2*Wiki.t1 | |||
set Wiki.t6 to Wiki.t5*Wiki.t1 | |||
set Wiki.sina to Wiki.t1 - Wiki.t1*Wiki.t2/6 + Wiki.t5/120 - Wiki.t5*t2/5040 + Wiki.t6*Wiki.t2*Wiki.t1/362880 | |||
set Wiki.cosa to 1 - Wiki.t2/2 + Wiki.t2*Wiki.t2/24 - Wiki.t6/720 + Wiki.t6*Wiki.t2/40320 | |||
set Wiki.tana to Wiki.sina/Wiki.cosa | |||
== Arcsine - Abramowitz/Stegun Approximation == | == Arcsine - Abramowitz/Stegun Approximation == | ||
Line 213: | Line 116: | ||
'''''arcsin(x) = 180/Pi * (pi/2 - sqrt(1 - x) * (a0 + a1*x + a2*x^2 + a3*x^3))''''' | '''''arcsin(x) = 180/Pi * (pi/2 - sqrt(1 - x) * (a0 + a1*x + a2*x^2 + a3*x^3))''''' | ||
This [[:Category:Stage Functions|function]] requires the following variables to be declared in your [[Global Script]]: | |||
float x (the sine of the angle) | |||
float n (used internally) | |||
float arcsinx (the arcsine, that is, the measure of the angle) | |||
These may be renamed, but doing so means changing them in the code. | |||
; script originally by JOG | |||
set Wiki.x to (player.getpos z - NPC.getpos z)/player.getdistance NPC | |||
set Wiki.n to 1 - Wiki.x ; arcsinx = SquareRoot(1-x) | |||
set Wiki.arcsinx to Wiki.n/2 | |||
set Wiki.arcsinx to (Wiki.arcsinx+(Wiki.n/Wiki.arcsinx))/2 | |||
set Wiki.arcsinx to (Wiki.arcsinx+(Wiki.n/Wiki.arcsinx))/2 | |||
set Wiki.arcsinx to (Wiki.arcsinx+(Wiki.n/Wiki.arcsinx))/2 | |||
set Wiki.n to (Wiki.arcsinx+(Wiki.n/Wiki.arcsinx))/2 | |||
set arcsinx to 57.2957795*(1.5707963-Wiki.n*(1.5707288-0.2121144*Wiki.x+0.0742610*Wiki.x*Wiki.x-0.0187293*Wiki.x*Wiki.x*Wiki.x)) | |||
This approximation is very accurate (99.9% - 99.9999%) for angles of 45 degrees and higher. For smaller angles you can get a higher precision when you use a taylor series with 15+ iterations. | This approximation is very accurate (99.9% - 99.9999%) for angles of 45 degrees and higher. For smaller angles you can get a higher precision when you use a taylor series with 15+ iterations. | ||
== Arcsine - Approximation by Taylor Series == | == Arcsine - Approximation by Taylor Series == | ||
Line 243: | Line 141: | ||
[[Image:Arcsine.png]] | [[Image:Arcsine.png]] | ||
This can be approximated by Oblivion using the following | This can be approximated by Oblivion using a [[:Category:Staged Functions|function]]. This function requires the following variables be declared in your [[Global Script]]: | ||
float z (the sine of the angle) | |||
float z3 (used internally) | |||
float z5 (used internally) | |||
float z7 (used internally) | |||
float z | float arcsinz (the arcsine, that is, the measure of the angle) | ||
float z3 | These can be renamed, but must also be changed in the code. | ||
float z5 | ;script originally by DragoonWraith | ||
float z7 | set Wiki.z3 to (Wiki.z*Wiki.z*Wiki.z) | ||
float arcsinz | set Wiki.z5 to (Wiki.z3*Wiki.z*Wiki.z) | ||
set Wiki.z7 to (Wiki.z5*Wiki.z*Wiki.z) | |||
set arcsinz to (Wiki.z+(1/2)*(Wiki.z3/3)+(3/8)*(Wiki.z5/5)+(15/48)*(Wiki.z7/7)) | |||
More terms will increase accuracy. The larger the angle, the more terms are needed to get acceptable accuracy. As a rough guide use 3 terms for every 10° to get an accuracy of at least 1 decimal digit. | More terms will increase accuracy. The larger the angle, the more terms are needed to get acceptable accuracy. As a rough guide use 3 terms for every 10° to get an accuracy of at least 1 decimal digit. | ||
Line 283: | Line 168: | ||
This is very similar to the Taylor Expansion method of generating Arcsine, but without the extra multipliers, and with alternating signs. | This is very similar to the Taylor Expansion method of generating Arcsine, but without the extra multipliers, and with alternating signs. | ||
This function requires the following variables be declared in your [[Global Script]]: | |||
float z (the tangent of the angle) | |||
float z3 (used internally) | |||
float z5 (used internally) | |||
float z7 (used internally) | |||
float arcsinz (the arctangent, that is, the measure of the angle) | |||
These can be renamed, but must also be changed in the code. | |||
;modified from arcsine script supplied by DragoonWraith | ;modified from arcsine script supplied by DragoonWraith | ||
set z3 to ( z * z * z ) | set z3 to ( z * z * z ) | ||
set z5 to ( z3 * z * z ) | set z5 to ( z3 * z * z ) | ||
Line 303: | Line 181: | ||
set arctanz to ( z - (z3/3) + (z5/5) - (z7/7) ) | set arctanz to ( z - (z3/3) + (z5/5) - (z7/7) ) | ||
Again, more terms equals more accuracy. | Again, more terms equals more accuracy. | ||
Line 314: | Line 190: | ||
[http://www.elderscrolls.com/forums/index.php?showtopic=410923 Elder Scrolls Forums - Is there an actor for the target you are attacking currently?] | [http://www.elderscrolls.com/forums/index.php?showtopic=410923 Elder Scrolls Forums - Is there an actor for the target you are attacking currently?] | ||
[[Category: Stage Functions]] | |||
[[Category: Extra_Math_Functions]] | [[Category: Extra_Math_Functions]] | ||