2012-08-04 10:54:37 +00:00
|
|
|
// qmath lib for lua
|
|
|
|
|
|
|
|
#include "g_lua.h"
|
|
|
|
|
|
|
|
#ifdef G_LUA
|
2013-04-29 21:45:53 +00:00
|
|
|
/***
|
|
|
|
Provides access to many mathematical functions.
|
|
|
|
@module qmath
|
|
|
|
*/
|
|
|
|
|
|
|
|
/***
|
|
|
|
Get the integer part of a number.
|
|
|
|
@function abs
|
|
|
|
@param number Number
|
|
|
|
@return Integer part of number.
|
|
|
|
*/
|
2012-08-04 10:54:37 +00:00
|
|
|
static int Qmath_Abs(lua_State * L)
|
|
|
|
{
|
|
|
|
lua_pushnumber(L, fabs(luaL_checknumber(L, 1)));
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2013-04-29 21:45:53 +00:00
|
|
|
/***
|
|
|
|
Get the sine for a number (degree).
|
|
|
|
@function sin
|
|
|
|
@param number Number
|
|
|
|
@return Sine of number.
|
|
|
|
*/
|
2012-08-04 10:54:37 +00:00
|
|
|
static int Qmath_Sin(lua_State * L)
|
|
|
|
{
|
|
|
|
lua_pushnumber(L, sin(DEG2RAD(luaL_checknumber(L, 1))));
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2013-04-29 21:45:53 +00:00
|
|
|
/***
|
|
|
|
Get the cosine for a number (degree).
|
|
|
|
@function cos
|
|
|
|
@param number Number
|
|
|
|
@return Consine of number.
|
|
|
|
*/
|
2012-08-04 10:54:37 +00:00
|
|
|
static int Qmath_Cos(lua_State * L)
|
|
|
|
{
|
|
|
|
lua_pushnumber(L, cos(DEG2RAD(luaL_checknumber(L, 1))));
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2013-04-29 21:45:53 +00:00
|
|
|
/***
|
|
|
|
Get the tangent for a number.
|
|
|
|
@function tan
|
|
|
|
@param number Number
|
|
|
|
@return Tangent of number.
|
|
|
|
*/
|
2012-08-04 10:54:37 +00:00
|
|
|
static int Qmath_Tan(lua_State * L)
|
|
|
|
{
|
|
|
|
lua_pushnumber(L, tan(DEG2RAD(luaL_checknumber(L, 1))));
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2013-04-29 21:45:53 +00:00
|
|
|
/***
|
|
|
|
Get the arcsine for a number.
|
|
|
|
@function asin
|
|
|
|
@param number Number
|
|
|
|
@return arcsine for number.
|
|
|
|
*/
|
2012-08-04 10:54:37 +00:00
|
|
|
static int Qmath_Asin(lua_State * L)
|
|
|
|
{
|
|
|
|
lua_pushnumber(L, RAD2DEG(asin(luaL_checknumber(L, 1))));
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2013-04-29 21:45:53 +00:00
|
|
|
/***
|
|
|
|
Get the arccosine for a number.
|
|
|
|
@function acos
|
|
|
|
@param number Number
|
|
|
|
@return arccosine of number.
|
|
|
|
*/
|
2012-08-04 10:54:37 +00:00
|
|
|
static int Qmath_Acos(lua_State * L)
|
|
|
|
{
|
|
|
|
lua_pushnumber(L, RAD2DEG(acos(luaL_checknumber(L, 1))));
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2013-04-29 21:45:53 +00:00
|
|
|
/***
|
|
|
|
Get the arctangent for a number.
|
|
|
|
@function atan
|
|
|
|
@param number Number
|
|
|
|
@return arctangent of number.
|
|
|
|
*/
|
2012-08-04 10:54:37 +00:00
|
|
|
static int Qmath_Atan(lua_State * L)
|
|
|
|
{
|
|
|
|
lua_pushnumber(L, RAD2DEG(atan(luaL_checknumber(L, 1))));
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2013-04-29 21:45:53 +00:00
|
|
|
/***
|
|
|
|
Get the arctangent for a number. Alternate to atan.
|
|
|
|
@function atan2
|
|
|
|
@param number Number
|
|
|
|
@return arctangent of number.
|
|
|
|
*/
|
2012-08-04 10:54:37 +00:00
|
|
|
static int Qmath_Atan2(lua_State * L)
|
|
|
|
{
|
|
|
|
lua_pushnumber(L, RAD2DEG(atan2(luaL_checknumber(L, 1), luaL_checknumber(L, 2))));
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2013-04-29 21:45:53 +00:00
|
|
|
/***
|
|
|
|
Get the ceiled value of a number.
|
|
|
|
@function ceil
|
|
|
|
@param number Number
|
|
|
|
@return Ceiled value of number.
|
|
|
|
*/
|
2012-08-04 10:54:37 +00:00
|
|
|
static int Qmath_Ceil(lua_State * L)
|
|
|
|
{
|
|
|
|
lua_pushnumber(L, ceil(luaL_checknumber(L, 1)));
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2013-04-29 21:45:53 +00:00
|
|
|
/***
|
|
|
|
Get the floored value of a number.
|
|
|
|
@function floor
|
|
|
|
@param numerb Number
|
|
|
|
@return Floored value of number.
|
|
|
|
*/
|
2012-08-04 10:54:37 +00:00
|
|
|
static int Qmath_Floor(lua_State * L)
|
|
|
|
{
|
|
|
|
lua_pushnumber(L, floor(luaL_checknumber(L, 1)));
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2013-04-29 21:45:53 +00:00
|
|
|
/***
|
|
|
|
Get the remainder of numerator/denominator.
|
|
|
|
@functiom fmod
|
|
|
|
@param n numerator
|
|
|
|
@param f denominator
|
|
|
|
@return Remainder of numerator/denominator.
|
|
|
|
*/
|
2012-08-04 10:54:37 +00:00
|
|
|
static int Qmath_Fmod(lua_State * L)
|
|
|
|
{
|
|
|
|
lua_pushnumber(L, fmod(luaL_checknumber(L, 1), luaL_checknumber(L, 2)));
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2013-04-29 21:45:53 +00:00
|
|
|
/***
|
|
|
|
BUGGED
|
|
|
|
Breaks a given number apart into its integer part and its fractional part. The fractional part is returned while the integer part is assigned to number.
|
|
|
|
@function modf
|
|
|
|
@param number Number
|
|
|
|
@return Array containing integer and fractional part.
|
|
|
|
*/
|
|
|
|
/* TODO return an array the current way won't work */
|
2012-08-04 10:54:37 +00:00
|
|
|
static int Qmath_Modf(lua_State * L)
|
|
|
|
{
|
|
|
|
double ip;
|
|
|
|
double fp = modf(luaL_checknumber(L, 1), &ip);
|
|
|
|
|
|
|
|
lua_pushnumber(L, ip);
|
|
|
|
lua_pushnumber(L, fp);
|
|
|
|
return 2;
|
|
|
|
}
|
|
|
|
|
2013-04-29 21:45:53 +00:00
|
|
|
/***
|
|
|
|
Get the square root of a number.
|
|
|
|
@function sqrt
|
|
|
|
@param number Number
|
|
|
|
@return Square root of number.
|
|
|
|
*/
|
2012-08-04 10:54:37 +00:00
|
|
|
static int Qmath_Sqrt(lua_State * L)
|
|
|
|
{
|
|
|
|
lua_pushnumber(L, sqrt(luaL_checknumber(L, 1)));
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2013-04-29 21:45:53 +00:00
|
|
|
// What's this?? f^n e.g. 2^4 = 2 * 2 * 2 = 8
|
|
|
|
/***
|
|
|
|
Returns f raised to the power of n.
|
|
|
|
@function pow
|
|
|
|
@param f Number
|
|
|
|
@param n Number
|
|
|
|
@return f raised to the power of n.
|
|
|
|
*/
|
2012-08-04 10:54:37 +00:00
|
|
|
static int Qmath_Pow(lua_State * L)
|
|
|
|
{
|
|
|
|
lua_pushnumber(L, pow(luaL_checknumber(L, 1), luaL_checknumber(L, 2)));
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2013-04-29 21:45:53 +00:00
|
|
|
/***
|
|
|
|
Get the logarithm of a number.
|
|
|
|
@function log
|
|
|
|
@param number Number
|
|
|
|
@return Logarithm of number.
|
|
|
|
*/
|
2012-08-04 10:54:37 +00:00
|
|
|
static int Qmath_Log(lua_State * L)
|
|
|
|
{
|
|
|
|
lua_pushnumber(L, log(luaL_checknumber(L, 1)));
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2013-04-29 21:45:53 +00:00
|
|
|
/***
|
|
|
|
Get logarithm to the base of 10 of number.
|
|
|
|
@function log10
|
|
|
|
@param number Number
|
|
|
|
@return Logarithm to the base of 10 of number.
|
|
|
|
*/
|
2012-08-04 10:54:37 +00:00
|
|
|
static int Qmath_Log10(lua_State * L)
|
|
|
|
{
|
|
|
|
lua_pushnumber(L, log10(luaL_checknumber(L, 1)));
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2013-04-29 21:45:53 +00:00
|
|
|
/***
|
|
|
|
Get the base-e exponential function of a given number.
|
|
|
|
@function exp
|
|
|
|
@param number Number
|
|
|
|
@return Base-e exponential of number.
|
|
|
|
*/
|
2012-08-04 10:54:37 +00:00
|
|
|
static int Qmath_Exp(lua_State * L)
|
|
|
|
{
|
|
|
|
lua_pushnumber(L, exp(luaL_checknumber(L, 1)));
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2013-04-29 21:45:53 +00:00
|
|
|
/***
|
|
|
|
Convert radian to degree.
|
|
|
|
@function deg
|
|
|
|
@param number Number
|
|
|
|
@return number converted to degree.
|
|
|
|
*/
|
2012-08-04 10:54:37 +00:00
|
|
|
static int Qmath_Deg(lua_State * L)
|
|
|
|
{
|
|
|
|
lua_pushnumber(L, RAD2DEG(luaL_checknumber(L, 1)));
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2013-04-29 21:45:53 +00:00
|
|
|
/***
|
|
|
|
Convert degree to radian.
|
|
|
|
@function rad
|
|
|
|
@param number Number
|
|
|
|
@return number converted to radian.
|
|
|
|
*/
|
2012-08-04 10:54:37 +00:00
|
|
|
static int Qmath_Rad(lua_State * L)
|
|
|
|
{
|
|
|
|
lua_pushnumber(L, DEG2RAD(luaL_checknumber(L, 1)));
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2013-04-29 21:45:53 +00:00
|
|
|
/***
|
|
|
|
BUGGED
|
|
|
|
Breaks a number into its binary significant and an integral exponent for 2.
|
|
|
|
@function frexp
|
|
|
|
@param number
|
|
|
|
@return Array containing binary significant and integral exponent for 2.
|
|
|
|
*/
|
|
|
|
/* TODO return array */
|
2012-08-04 10:54:37 +00:00
|
|
|
static int Qmath_Frexp(lua_State * L)
|
|
|
|
{
|
|
|
|
int e;
|
|
|
|
|
|
|
|
lua_pushnumber(L, frexp(luaL_checknumber(L, 1), &e));
|
|
|
|
lua_pushnumber(L, e);
|
|
|
|
return 2;
|
|
|
|
}
|
|
|
|
|
2013-04-29 21:45:53 +00:00
|
|
|
/***
|
|
|
|
Get the result from multiplying f by 2 raised to the power of n.
|
|
|
|
@function ldexp
|
|
|
|
@param f Number
|
|
|
|
@param n Number
|
|
|
|
@return The result from multiplying f by 2 raised to the power of n.
|
|
|
|
*/
|
2012-08-04 10:54:37 +00:00
|
|
|
static int Qmath_Ldexp(lua_State * L)
|
|
|
|
{
|
|
|
|
lua_pushnumber(L, ldexp(luaL_checknumber(L, 1), luaL_checkint(L, 2)));
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2013-04-29 21:45:53 +00:00
|
|
|
/***
|
|
|
|
Get the lowest value in array[].
|
|
|
|
@function min
|
|
|
|
@param array Array of numbers.
|
|
|
|
@return the lowest value in the array.
|
|
|
|
*/
|
2012-08-04 10:54:37 +00:00
|
|
|
static int Qmath_Min(lua_State * L)
|
|
|
|
{
|
|
|
|
int n = lua_gettop(L); /* number of arguments */
|
|
|
|
lua_Number dmin = luaL_checknumber(L, 1);
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for(i = 2; i <= n; i++)
|
|
|
|
{
|
|
|
|
lua_Number d = luaL_checknumber(L, i);
|
|
|
|
|
|
|
|
if(d < dmin)
|
|
|
|
dmin = d;
|
|
|
|
}
|
|
|
|
lua_pushnumber(L, dmin);
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2013-04-29 21:45:53 +00:00
|
|
|
/***
|
|
|
|
Get the highest value in array[].
|
|
|
|
@function min
|
|
|
|
@param array Array of numbers.
|
|
|
|
@return the highest value in the array.
|
|
|
|
*/
|
2012-08-04 10:54:37 +00:00
|
|
|
static int Qmath_Max(lua_State * L)
|
|
|
|
{
|
|
|
|
int n = lua_gettop(L); /* number of arguments */
|
|
|
|
lua_Number dmax = luaL_checknumber(L, 1);
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for(i = 2; i <= n; i++)
|
|
|
|
{
|
|
|
|
lua_Number d = luaL_checknumber(L, i);
|
|
|
|
|
|
|
|
if(d > dmax)
|
|
|
|
dmax = d;
|
|
|
|
}
|
|
|
|
lua_pushnumber(L, dmax);
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2013-04-29 21:45:53 +00:00
|
|
|
/***
|
|
|
|
Get a random integer.
|
|
|
|
@function rand
|
|
|
|
@return Random integer.
|
|
|
|
*/
|
2012-08-04 10:54:37 +00:00
|
|
|
static int Qmath_Rand(lua_State * L)
|
|
|
|
{
|
|
|
|
lua_pushinteger(L, rand());
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2013-04-29 21:45:53 +00:00
|
|
|
/***
|
|
|
|
Get a random floating point number.
|
|
|
|
@function random
|
|
|
|
@return Random floating point number.
|
|
|
|
*/
|
2012-08-04 10:54:37 +00:00
|
|
|
static int Qmath_Random(lua_State * L)
|
|
|
|
{
|
|
|
|
lua_pushnumber(L, random());
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2013-04-29 21:45:53 +00:00
|
|
|
/***
|
|
|
|
Get a random floating point number (using crazy random function).
|
|
|
|
@function crandom
|
|
|
|
@return A random floating point number (using crazy random function).
|
|
|
|
*/
|
2012-08-04 10:54:37 +00:00
|
|
|
static int Qmath_Crandom(lua_State * L)
|
|
|
|
{
|
|
|
|
lua_pushnumber(L, crandom());
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2013-04-29 21:45:53 +00:00
|
|
|
/***
|
|
|
|
Get a random integer from the range of integers defined by and including i and j.
|
|
|
|
@function irandom
|
|
|
|
@param i Number, lower limit.
|
|
|
|
@param j Number, upper limit.
|
|
|
|
@return A random integer from the range of integers defined by and including i and j.
|
|
|
|
*/
|
2012-11-14 09:09:50 +00:00
|
|
|
static int Qmath_Irandom(lua_State * L)
|
|
|
|
{
|
|
|
|
lua_pushnumber(L, irandom(luaL_checkint(L, 1), luaL_checkint(L, 2)));
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2013-04-29 21:45:53 +00:00
|
|
|
/***
|
|
|
|
Get a random float from the range of floats defined by and including i and j.
|
|
|
|
@function flrandom
|
|
|
|
@param i Number, lower limit.
|
|
|
|
@param j Number, upper limit.
|
|
|
|
@return A random float from the range of floats defined by and including i and j.
|
|
|
|
*/
|
2012-11-14 09:09:50 +00:00
|
|
|
static int Qmath_FLrandom(lua_State * L)
|
|
|
|
{
|
|
|
|
lua_pushnumber(L, flrandom(luaL_checknumber(L, 1), luaL_checknumber(L, 2)));
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2012-08-04 10:54:37 +00:00
|
|
|
static const luaL_Reg lib_qmath[] = {
|
2013-05-08 23:59:07 +00:00
|
|
|
{ "abs", Qmath_Abs },
|
|
|
|
{ "sin", Qmath_Sin },
|
|
|
|
{ "cos", Qmath_Cos },
|
|
|
|
{ "tan", Qmath_Tan },
|
|
|
|
{ "asin", Qmath_Asin },
|
|
|
|
{ "acos", Qmath_Acos },
|
|
|
|
{ "atan", Qmath_Atan },
|
|
|
|
{ "atan2", Qmath_Atan2 },
|
|
|
|
{ "ceil", Qmath_Ceil },
|
|
|
|
{ "floor", Qmath_Floor },
|
|
|
|
{ "fmod", Qmath_Fmod },
|
|
|
|
{ "modf", Qmath_Modf },
|
|
|
|
{ "frexp", Qmath_Frexp },
|
|
|
|
{ "ldexp", Qmath_Ldexp },
|
|
|
|
{ "sqrt", Qmath_Sqrt },
|
|
|
|
{ "min", Qmath_Min },
|
|
|
|
{ "max", Qmath_Max },
|
|
|
|
{ "log", Qmath_Log },
|
|
|
|
{ "log10", Qmath_Log10 },
|
|
|
|
{ "exp", Qmath_Exp },
|
|
|
|
{ "deg", Qmath_Deg },
|
|
|
|
{ "pow", Qmath_Pow },
|
|
|
|
{ "rad", Qmath_Rad },
|
|
|
|
{ "rand", Qmath_Rand },
|
|
|
|
{ "candom", Qmath_Crandom },
|
|
|
|
{ "random", Qmath_Random },
|
|
|
|
{ "irandom", Qmath_Irandom },
|
|
|
|
{ "flrandom", Qmath_FLrandom },
|
|
|
|
{ NULL, NULL }
|
2012-08-04 10:54:37 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
int Luaopen_Qmath(lua_State * L)
|
|
|
|
{
|
|
|
|
luaL_register(L, "qmath", lib_qmath);
|
|
|
|
lua_pushnumber(L, M_PI);
|
|
|
|
lua_setfield(L, -2, "pi");
|
|
|
|
lua_pushnumber(L, HUGE_VAL);
|
|
|
|
lua_setfield(L, -2, "huge");
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
#endif
|