Since PICO-8's sin(), cos() and atan2() are not the standard functions, how to implement them in another language? Some pseudocode would be ok, I'm aiming javascript by the way.
I looked into PicoLove's code as an example, but the results are different. For example in PICO-8:
print(sin(0)) -- 0 print(sin(0.5)) -- 0 print(sin(0.25)) -- -1 print(sin(-3)) -- 0 print(sin(-0.45)) -- 0.309 print(sin(78.4)) -- 0.5877 |
The PicoLove code remaps sin() to:
sin = function(x) return math.sin(-(x or 0)*(math.pi*2)) end |
that in javascript is:
window.sinp8 = function (x) { return Math.sin(-(x || 0) * (Math.PI * 2)); }; |
Now, the results are very different:
console.log(sinp8(0)); // -0 console.log(sinp8(0.5)); // -1.2246467991473532e-16 console.log(sinp8(0.25)); // -1 console.log(sinp8(-3)); // -7.347880794884119e-16 console.log(sinp8(-0.45)); // 0.3090169943749475 console.log(sinp8(78.4)); // 0.5877852522924427 |
Can you provide me with some working pseudocode for these three functions? Thanks
![](/gfx/set_like0.png)
![](/gfx/top_drop.png)
![](https://www.lexaloffle.com/bbs/files/2120/draggiepico8.png)
I think results of P8's sin is "normalized" i.e. made so it is within -1..1 range. Try normalizing your function and I think it should be close enough.
![](/gfx/set_like0.png)
![](/gfx/top_drop.png)
![](https://www.lexaloffle.com/bbs/files/10959/p8forums.png)
Looks correct to me except for the last value, which I suspect was copy pasted without the negative sign.
![](http://files.slembcke.net/upshot/upshot_DoDScf9h.png)
![](/gfx/set_like0.png)
![](/gfx/top_drop.png)
![](https://www.lexaloffle.com/bbs/files/4867/trollbaby.png)
sin and cos of negative angles are the same as sin and cos of positive angles. always.
pico8 sin and cos take values from 0 to 1 instead of 0 to 2pi so if you want to implement it in an other language, just multiply the input angle by 2pi.
print(sin(0)) -- 0
print(sin(0.5)) -- 0 ... 0.5 on pico is the same as pi in math sin(pi)==0
print(sin(0.25)) -- -1 ... 0.25 on pico equals pi/2 in math.
print(sin(-3)) -- 0 ... -3 is the same as 0, 1, 2, 3 or -1, -2, -3 ... just 0 ... 1 is a full period (2*pi)
print(sin(-0.45)) -- 0.309 ... -0.45 is the same as 0.45
print(sin(78.4)) -- 0.5877 ... 78.4 is just 0.4
Here's a visualisation that might help:
![](/gfx/set_like0.png)
![](/gfx/top_drop.png)
![](/bimg/pi/pi1.png)
pistacchio, in reality your results are not very different, and they are both correct.
when you see "-1.2246467991473532e-16" in javascript it's mean "-1.22(...) * 10 ^ -16", so "0.000000000000000122(...)", it's nearly 0.
the difference comes from the way that floats are stores in 32bits (https://en.wikipedia.org/wiki/Single-precision_floating-point_format).
Try a simple operation like "1.05 - 1" in javascript and the result will be "0.050000000000000044" instead of "0.05" :)
[Please log in to post a comment]