Merge pull request #86 from grunkgrunk/randomvector

added random vector function
This commit is contained in:
Matthias Richter 2017-11-04 11:14:26 +01:00 committed by GitHub
commit cdafc00075
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 71 additions and 4 deletions

View File

@ -92,6 +92,22 @@ Convert the vector to polar coordinates, i.e., the angle and the radius/lenth.
vector.fromPolar(phase1+phase2, abs1*abs2)
.. function:: vector.randomDirection(len_min, len_max)
:param number len_min: Minimum length of the vector.
:param number len_max: Maximum length of the vector.
:returns: ``x``, ``y``: A vector pointing in a random direction with a random length between len_min and len_max.
**Examples**::
-- length is a random value between 1 and 5
x,y = vector.randomDirection(1,5)
-- length is 1
x,y = vector.randomDirection()
-- length is 100
x,y = vector.randomDirection(100)
.. function:: vector.mul(s, x,y)

View File

@ -114,6 +114,21 @@ The ``angle`` is measured against the vector (1,0), i.e., the x axis.
a = vector.polar(math.pi,10)
.. function:: vector.randomDirection(len_min, len_max)
:param number len_min: Minimum length of the vector.
:param number len_max: Maximum length of the vector.
:returns: A vector pointing in a random direction with a random length between len_min and len_max.
**Examples**::
-- length is a random value between 1 and 5
rnd = vector.randomDirection(1,5)
-- length is 1
rnd = vector.randomDirection()
-- length is 100
rnd = vector.randomDirection(100)
.. function:: vector.isvector(v)

View File

@ -79,9 +79,24 @@ local function len(x,y)
end
local function fromPolar(angle, radius)
radius = radius or 1
return cos(angle)*radius, sin(angle)*radius
end
local function randomDirection(len_min, len_max)
len_min = len_min or 1
len_max = len_max or len_min
assert(len_max > 0, "randomDirection: len_max must be greater than zero")
assert(len_max >= len_min, "randomDirection: len_max must be greater than or equal to len_min")
local range = len_max - len_min
local rnd = math.random() * range
local x,y = fromPolar(math.random()*2*math.pi)
return x * (rnd + len_min), y * (rnd + len_min)
end
local function toPolar(x, y)
return atan2(y,x), len(x,y)
end
@ -139,8 +154,9 @@ end
return {
str = str,
fromPolar = fromPolar,
toPolar = toPolar,
fromPolar = fromPolar,
toPolar = toPolar,
randomDirection = randomDirection,
-- arithmetic
mul = mul,

View File

@ -36,9 +36,22 @@ end
local zero = new(0,0)
local function fromPolar(angle, radius)
radius = radius or 1
return new(cos(angle) * radius, sin(angle) * radius)
end
local function randomDirection(len_min, len_max)
len_min = len_min or 1
len_max = len_max or len_min
assert(len_max > 0, "randomDirection: len_max must be greater than zero")
assert(len_max >= len_min, "randomDirection: len_max must be greater than or equal to len_min")
local range = len_max - len_min
local rnd = math.random() * range
return fromPolar(math.random()*2*math.pi) * (rnd + len_min)
end
local function isvector(v)
return type(v) == 'table' and type(v.x) == 'number' and type(v.y) == 'number'
end
@ -195,5 +208,12 @@ end
-- the module
return setmetatable({new = new, fromPolar = fromPolar, isvector = isvector, zero = zero},
{__call = function(_, ...) return new(...) end})
return setmetatable({
new = new,
fromPolar = fromPolar,
randomDirection = randomDirection,
isvector = isvector,
zero = zero
}, {
__call = function(_, ...) return new(...) end
})