Difference between revisions of "Simulating new functions"
corrected my horrible math mistakes ^^
imported>JustTim (Moved the discussion to the "Discussion" page and put the actual solution into the "article".) |
imported>JustTim (corrected my horrible math mistakes ^^) |
||
Line 12: | Line 12: | ||
; Internals | ; Internals | ||
short doOnce | short doOnce | ||
float fQuestDelayTime | |||
; Constants | ; Constants | ||
float pi | |||
float rad | float rad | ||
; Function In- and Output | ; Function In- and Output | ||
Line 23: | Line 25: | ||
float fout | float fout | ||
float fout2 | float fout2 | ||
float fout3 | |||
;S10 FUNCTION | ;S10 FUNCTION Arctan | ||
float t3 | |||
float | float t5 | ||
float t7 | |||
;S20 FUNCTION getAngle | ;S20 FUNCTION getAngle | ||
float tan | |||
float ang | float ang | ||
; Set constants first | ; Set constants first | ||
Begin Gamemode | Begin Gamemode | ||
if doOnce == 0 | if doOnce == 0 | ||
set pi to 3.1415927 | set pi to 3.1415927 | ||
set rad to 180.0/pi | |||
set fQuestDelayTime to 30 | |||
set doOnce to 1 | set doOnce to 1 | ||
endif | endif | ||
Line 55: | Line 50: | ||
This is a generalized function framework that can be re-used for as many functions as you like. | This is a generalized function framework that can be re-used for as many functions as you like. | ||
And now make stage | And now make stage 10 for this quest with the following code: | ||
<pre>;FUNCTION float | <pre>;FUNCTION float Arctan(float tan) | ||
;Approximation by Taylor Series - script by DragoonWraith | |||
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))</pre> | |||
set f. | |||
And stage 20: | And stage 20: | ||
<pre>;FUNCTION float getAngle(float x, float y) | <pre>;FUNCTION float getAngle(float x, float y) | ||
set f. | set f.tan to (f.fin1/f.fin2) | ||
if f. | if f.tan >1 || f.tan < -1 | ||
set f. | set f.tan to (f.fin2/ -f.fin1) | ||
if f.fin1 >= 0 | |||
set f.ang to 90 | |||
else | |||
set f.ang to | set f.ang to -90 | ||
endif | |||
else | |||
set f.ang to | if f.fin2 >= 0 | ||
set f.ang to 0 | |||
else | |||
set f.ang to 180 | |||
endif | |||
endif | endif | ||
Okay, the function setup is complete. Now you've already got | ;CALL float Arctan(float tan) | ||
set f.fin1 to f.tan | |||
setStage f 24 | |||
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)</pre> | |||
Okay, the function setup is complete. Now you've already got 2 functions: One to calculate the arctan and another one that uses arctan to calculate the angle of a vector. To get the angle between two objects in a script just type: | |||
<pre>;CALL float getAngle(float x, float y) | <pre>;CALL float getAngle(float x, float y) | ||
set f.fin1 to ( Object2.getPos x - Object1.getPos x ) | set f.fin1 to ( Object2.getPos x - Object1.getPos x ) | ||
Line 119: | Line 104: | ||
The only downsides are that you have to define all vars in the quest script (it compiles when you define them in the stage result script, but they'll always be 0) and the limited maximum length of each quest result script (which isn't a big problem since you are able to split a single function into multiple stages). | The only downsides are that you have to define all vars in the quest script (it compiles when you define them in the stage result script, but they'll always be 0) and the limited maximum length of each quest result script (which isn't a big problem since you are able to split a single function into multiple stages). | ||
Many thanks go tu Kkuhlmann for his great idea | Many thanks go tu Kkuhlmann for his great idea, to DragoonWraith for the Arctan function and to Maian for telling me that my old functions were completely wrong. :) | ||
The | The new version of the getAngle Function seems to be very accurate, but if anyone has an idea on how to improve these scripts for accuracy and performance then please contribute! | ||
[[Category:Useful Code]] | [[Category:Useful Code]] | ||
[[Category:Solutions]] | [[Category:Solutions]] |