mirror of
https://github.com/PolarisSS13/Polaris.git
synced 2025-12-14 12:12:37 +00:00
adds _version.dm compatibility file + core/math/math.dm dependency adds polyvis.html tool to go along with math.dm converts uses of n_ceil to ceil
120 lines
3.5 KiB
Plaintext
120 lines
3.5 KiB
Plaintext
/// IEEE 754-1985 positive infinity. As text, win: 1.#INF, lin: inf
|
|
var/global/const/POSITIVE_INFINITY = 1#INF
|
|
|
|
/// IEEE 754-1985 negative infinity. As text, win: -1.#INF, -lin: inf
|
|
var/global/const/NEGATIVE_INFINITY = -1#INF
|
|
|
|
// IEEE 754-1985 positive NaN. Creatable but not useful. As text, win: 1.#QNAN, lin: nan
|
|
//var/const/POSITIVE_NAN = -(1#INF/1#INF)
|
|
|
|
// IEEE 754-1985 nevative NaN. Creatable but not useful. As text, win: -1.#IND, lin: -nan
|
|
//var/const/NEGATIVE_NAN = (1#INF/1#INF)
|
|
|
|
/// Multiplier for converting degrees to radians, rounded to 10 places
|
|
var/global/const/DEG_TO_RAD = 0.0174532925
|
|
|
|
/// Multiplier for converting radians to degrees, rounded to 10 places
|
|
var/global/const/RAD_TO_DEG = 57.295779513
|
|
|
|
/// The mathematical constant pi, rounded to 10 places
|
|
var/global/const/PI = 3.1415926536
|
|
|
|
/// Twice the mathematical constant pi, rounded to 10 places
|
|
var/global/const/TWO_PI = 6.2831853072
|
|
|
|
/// Half the mathematical constant pi, rounded to 10 places
|
|
var/global/const/HALF_PI = 1.5707963268
|
|
|
|
|
|
/// True if number is a number that is not nan or an infinity.
|
|
/proc/isfinite(number)
|
|
return isnum(number) && !isnan(number) && !isinf(number)
|
|
|
|
|
|
/**
|
|
Sample t(0..1) into a quadratic binomial polynomial.
|
|
Generally this is useful for shaping rand() distribution.
|
|
see tools/polyvis.html for a parameter picker.
|
|
*/
|
|
/proc/poly_interp2(t, p0, p1, p2)
|
|
var/mt = 1 - t
|
|
return p0 * mt * mt +\
|
|
2 * p1 * mt * t +\
|
|
p2 * t * t
|
|
|
|
/**
|
|
Sample t(0..1) into a cubic binomial polynomial.
|
|
Generally this is useful for shaping rand() distribution.
|
|
see tools/polyvis.html for a parameter picker.
|
|
More expensive than poly_interp2.
|
|
*/
|
|
/proc/poly_interp3(t, p0, p1, p2, p3)
|
|
var/t2 = t * t
|
|
var/mt = 1 - t
|
|
var/mt2 = mt * mt
|
|
return p0 * mt2 * mt +\
|
|
3 * p1 * mt2 * t +\
|
|
3 * p2 * mt * t2 +\
|
|
p3 * t2 * t
|
|
|
|
/**
|
|
Sample t(0..1) into a quartic binomial polynomial.
|
|
Generally this is useful for shaping rand() distribution.
|
|
see tools/polyvis.html for a parameter picker.
|
|
More expensive than poly_interp3.
|
|
*/
|
|
/proc/poly_interp4(t, p0, p1, p2, p3, p4)
|
|
var/t2 = t * t
|
|
var/t3 = t2 * t
|
|
var/mt = 1 - t
|
|
var/mt2 = mt * mt
|
|
var/mt3 = mt2 * mt
|
|
return p0 * mt3 * mt +\
|
|
4 * p1 * mt3 * t +\
|
|
6 * p2 * mt2 * t2 +\
|
|
4 * p3 * mt * t3 +\
|
|
p4 * t3 * t
|
|
|
|
|
|
/**
|
|
Get the coordinates that make up a circle of radius on center, packed as (x | y left shift 12).
|
|
These coordinates are able to be outside the world: check (v < 1 || v > world.maxV) for safety.
|
|
Implements the Bresenham Circle Drawing Algorithm for the actual point picking.
|
|
*/
|
|
/proc/get_circle_coordinates(radius, center_x, center_y)
|
|
var/static/list/cache = list()
|
|
radius = round(radius, 1)
|
|
if (radius < 1)
|
|
return list(center_x | SHIFTL(center_y, 12))
|
|
center_x = round(center_x, 1)
|
|
center_y = round(center_y, 1)
|
|
var/list/points = length(cache) ? cache["[radius]"] : null
|
|
if (!points)
|
|
points = list()
|
|
var/y = radius
|
|
var/gradient = 3 - 2 * radius
|
|
for (var/x = 0 to radius)
|
|
points |= list(
|
|
radius + x | SHIFTL(radius + y, 12),
|
|
radius + x | SHIFTL(radius - y, 12),
|
|
radius - x | SHIFTL(radius + y, 12),
|
|
radius - x | SHIFTL(radius - y, 12),
|
|
radius + y | SHIFTL(radius + x, 12),
|
|
radius + y | SHIFTL(radius - x, 12),
|
|
radius - y | SHIFTL(radius + x, 12),
|
|
radius - y | SHIFTL(radius - x, 12)
|
|
)
|
|
if (x >= y)
|
|
break
|
|
if (gradient < 0)
|
|
gradient = gradient + 4 * x + 6
|
|
else
|
|
gradient = gradient + 4 * (x - y) + 10
|
|
--y
|
|
cache["[radius]"] = points
|
|
var/list/result = points.Copy()
|
|
var/center = center_x - radius | SHIFTL(center_y - radius, 12)
|
|
for (var/i = 1 to length(result))
|
|
result[i] += center
|
|
return result
|