123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231 |
- package lua
- import (
- "math"
- "math/rand"
- )
- func OpenMath(L *LState) int {
- mod := L.RegisterModule(MathLibName, mathFuncs).(*LTable)
- mod.RawSetString("pi", LNumber(math.Pi))
- mod.RawSetString("huge", LNumber(math.MaxFloat64))
- L.Push(mod)
- return 1
- }
- var mathFuncs = map[string]LGFunction{
- "abs": mathAbs,
- "acos": mathAcos,
- "asin": mathAsin,
- "atan": mathAtan,
- "atan2": mathAtan2,
- "ceil": mathCeil,
- "cos": mathCos,
- "cosh": mathCosh,
- "deg": mathDeg,
- "exp": mathExp,
- "floor": mathFloor,
- "fmod": mathFmod,
- "frexp": mathFrexp,
- "ldexp": mathLdexp,
- "log": mathLog,
- "log10": mathLog10,
- "max": mathMax,
- "min": mathMin,
- "mod": mathMod,
- "modf": mathModf,
- "pow": mathPow,
- "rad": mathRad,
- "random": mathRandom,
- "randomseed": mathRandomseed,
- "sin": mathSin,
- "sinh": mathSinh,
- "sqrt": mathSqrt,
- "tan": mathTan,
- "tanh": mathTanh,
- }
- func mathAbs(L *LState) int {
- L.Push(LNumber(math.Abs(float64(L.CheckNumber(1)))))
- return 1
- }
- func mathAcos(L *LState) int {
- L.Push(LNumber(math.Acos(float64(L.CheckNumber(1)))))
- return 1
- }
- func mathAsin(L *LState) int {
- L.Push(LNumber(math.Asin(float64(L.CheckNumber(1)))))
- return 1
- }
- func mathAtan(L *LState) int {
- L.Push(LNumber(math.Atan(float64(L.CheckNumber(1)))))
- return 1
- }
- func mathAtan2(L *LState) int {
- L.Push(LNumber(math.Atan2(float64(L.CheckNumber(1)), float64(L.CheckNumber(2)))))
- return 1
- }
- func mathCeil(L *LState) int {
- L.Push(LNumber(math.Ceil(float64(L.CheckNumber(1)))))
- return 1
- }
- func mathCos(L *LState) int {
- L.Push(LNumber(math.Cos(float64(L.CheckNumber(1)))))
- return 1
- }
- func mathCosh(L *LState) int {
- L.Push(LNumber(math.Cosh(float64(L.CheckNumber(1)))))
- return 1
- }
- func mathDeg(L *LState) int {
- L.Push(LNumber(float64(L.CheckNumber(1)) * 180 / math.Pi))
- return 1
- }
- func mathExp(L *LState) int {
- L.Push(LNumber(math.Exp(float64(L.CheckNumber(1)))))
- return 1
- }
- func mathFloor(L *LState) int {
- L.Push(LNumber(math.Floor(float64(L.CheckNumber(1)))))
- return 1
- }
- func mathFmod(L *LState) int {
- L.Push(LNumber(math.Mod(float64(L.CheckNumber(1)), float64(L.CheckNumber(2)))))
- return 1
- }
- func mathFrexp(L *LState) int {
- v1, v2 := math.Frexp(float64(L.CheckNumber(1)))
- L.Push(LNumber(v1))
- L.Push(LNumber(v2))
- return 2
- }
- func mathLdexp(L *LState) int {
- L.Push(LNumber(math.Ldexp(float64(L.CheckNumber(1)), L.CheckInt(2))))
- return 1
- }
- func mathLog(L *LState) int {
- L.Push(LNumber(math.Log(float64(L.CheckNumber(1)))))
- return 1
- }
- func mathLog10(L *LState) int {
- L.Push(LNumber(math.Log10(float64(L.CheckNumber(1)))))
- return 1
- }
- func mathMax(L *LState) int {
- if L.GetTop() == 0 {
- L.RaiseError("wrong number of arguments")
- }
- max := L.CheckNumber(1)
- top := L.GetTop()
- for i := 2; i <= top; i++ {
- v := L.CheckNumber(i)
- if v > max {
- max = v
- }
- }
- L.Push(max)
- return 1
- }
- func mathMin(L *LState) int {
- if L.GetTop() == 0 {
- L.RaiseError("wrong number of arguments")
- }
- min := L.CheckNumber(1)
- top := L.GetTop()
- for i := 2; i <= top; i++ {
- v := L.CheckNumber(i)
- if v < min {
- min = v
- }
- }
- L.Push(min)
- return 1
- }
- func mathMod(L *LState) int {
- lhs := L.CheckNumber(1)
- rhs := L.CheckNumber(2)
- L.Push(luaModulo(lhs, rhs))
- return 1
- }
- func mathModf(L *LState) int {
- v1, v2 := math.Modf(float64(L.CheckNumber(1)))
- L.Push(LNumber(v1))
- L.Push(LNumber(v2))
- return 2
- }
- func mathPow(L *LState) int {
- L.Push(LNumber(math.Pow(float64(L.CheckNumber(1)), float64(L.CheckNumber(2)))))
- return 1
- }
- func mathRad(L *LState) int {
- L.Push(LNumber(float64(L.CheckNumber(1)) * math.Pi / 180))
- return 1
- }
- func mathRandom(L *LState) int {
- switch L.GetTop() {
- case 0:
- L.Push(LNumber(rand.Float64()))
- case 1:
- n := L.CheckInt(1)
- L.Push(LNumber(rand.Intn(n) + 1))
- default:
- min := L.CheckInt(1)
- max := L.CheckInt(2) + 1
- L.Push(LNumber(rand.Intn(max-min) + min))
- }
- return 1
- }
- func mathRandomseed(L *LState) int {
- rand.Seed(L.CheckInt64(1))
- return 0
- }
- func mathSin(L *LState) int {
- L.Push(LNumber(math.Sin(float64(L.CheckNumber(1)))))
- return 1
- }
- func mathSinh(L *LState) int {
- L.Push(LNumber(math.Sinh(float64(L.CheckNumber(1)))))
- return 1
- }
- func mathSqrt(L *LState) int {
- L.Push(LNumber(math.Sqrt(float64(L.CheckNumber(1)))))
- return 1
- }
- func mathTan(L *LState) int {
- L.Push(LNumber(math.Tan(float64(L.CheckNumber(1)))))
- return 1
- }
- func mathTanh(L *LState) int {
- L.Push(LNumber(math.Tanh(float64(L.CheckNumber(1)))))
- return 1
- }
- //
|