Options
All
  • Public
  • Public/Protected
  • All
Menu

@youwol/math - v0.0.27-wip

Index

Type aliases

DistributionFunction: (x: number) => number

Type declaration

    • (x: number): number
    • Parameters

      • x: number

      Returns number

Array Functions

  • dectectNan(array: IArray): IArray
  • Return the indices from array that contain NaN values

    Parameters

    • array: IArray

      The array of number

    Returns IArray

  • flatten(array: number[][]): number[]
  • Parameters

    • array: number[][]

    Returns number[]

  • maxArray(array: IArray): number
  • Parameters

    • array: IArray

    Returns number

  • minArray(array: IArray): number
  • Parameters

    • array: IArray

    Returns number

  • minMaxArray(array: IArray): number[]
  • Parameters

    • array: IArray

    Returns number[]

  • normalizeArray(array: IArray): IArray
  • Parameters

    • array: IArray

    Returns IArray

  • scaleArray(array: IArray, s: number): IArray
  • Parameters

    • array: IArray
    • s: number

    Returns IArray

Barycentric Functions

Dataframe Functions

  • abs(s: Serie<IArray>): Serie<IArray>
  • Parameters

    • s: Serie<IArray>

    Returns Serie<IArray>

  • add(series: Serie<IArray>[]): Serie<IArray>
  • Add several Series to generate a new one

    example
    // perform: a = b + c
    const a = add([
    df.get('b'),
    df.get('c'),
    ])
    example
    // perform: a = 0.1*b + 0.3*c + 0.7*d
    const a = add([
    mult( df.get('b'), 0.1),
    mult( df.get('c'), 0.3),
    mult( df.get('d'), 0.7)
    ])

    Parameters

    • series: Serie<IArray>[]

    Returns Serie<IArray>

  • addNumber(serie: Serie<IArray>, a: number): Serie<IArray>
  • Add a number to each value of the array

    example
    const a = addNumber( df.get('a'), 10 )
    

    Parameters

    • serie: Serie<IArray>
    • a: number

    Returns Serie<IArray>

  • closeTo(s1: Serie<IArray>, s2: Serie<IArray>, eps?: number): boolean
  • Check if two series are closely equals (at epsilon)

    Parameters

    • s1: Serie<IArray>
    • s2: Serie<IArray>
    • eps: number = 1e-7

    Returns boolean

  • cross(A: Serie<IArray>, B: Serie<IArray>): Serie<IArray>
  • Cross product only for [[Serie]]s with itemSize=3

    Parameters

    • A: Serie<IArray>
    • B: Serie<IArray>

    Returns Serie<IArray>

  • determinant(s: Serie<IArray>): Serie<IArray>
  • Get the determinant of each item of a [[Serie]] (if matrix). itemSize should (for the moment) either 6 (symmetric matrix) or 9.

    Parameters

    • s: Serie<IArray>

    Returns Serie<IArray>

  • div(s: Serie<IArray>, ...others: (number | Serie<IArray>)[]): Serie<IArray>
  • example
    // perform a = b/c/d
    const a = div( df.get('b'), df.get('c'), df.get('d') )

    Parameters

    • s: Serie<IArray>
    • Rest ...others: (number | Serie<IArray>)[]

    Returns Serie<IArray>

  • dot(a: Serie<IArray>, b: Serie<IArray> | IVector): Serie<IArray>
  • Parameters

    • a: Serie<IArray>
    • b: Serie<IArray> | IVector

    Returns Serie<IArray>

  • eigenValue(s: Serie<IArray>): Serie<IArray>
  • Get eigen values

    Parameters

    • s: Serie<IArray>

    Returns Serie<IArray>

  • eigenVector(s: Serie<IArray>): Serie<IArray>
  • Get eigen vectors. itemSize of the returned Serie is therefore 9 and the coordinates of the three eigen vectors are classified as follow: [v1x,v1y,v1z, v2x,v2y,v2z, v3x, v3y, v3z]

    Parameters

    • s: Serie<IArray>

    Returns Serie<IArray>

  • equals(s1: Serie<IArray>, s2: Serie<IArray>): boolean
  • Check if two series are strictly equals

    Parameters

    • s1: Serie<IArray>
    • s2: Serie<IArray>

    Returns boolean

  • getNaN(a: Serie<IArray>): number[]
  • Get the indices of Nan values in a serie. For series with itemSize>1, return the indices of the items

    example
    const a = createSerie( {data: [1, 2, NaN, 4, NaN, 6], itemSize: 1} )
    console.log( getNaN(a) )
    // [ 2, 4 ]

    Parameters

    • a: Serie<IArray>

    Returns number[]

  • inv(s: Serie<IArray>, throwOnDegenerate?: boolean): Serie<IArray>
  • Inverse of matrix3

    Parameters

    • s: Serie<IArray>
    • throwOnDegenerate: boolean = false

    Returns Serie<IArray>

  • invert(s: Serie<IArray>): Serie<IArray>
  • Parameters

    • s: Serie<IArray>

    Returns Serie<IArray>

  • max(s: Serie<IArray>): number | number[]
  • Get the max of a Serie. The returned type is the max or an array of maxs (if itemSize>1)

    Parameters

    • s: Serie<IArray>

    Returns number | number[]

  • min(s: Serie<IArray>): number | number[]
  • Get the min of a Serie. The returned type is the min or an array of mins (if itemSize>1)

    Parameters

    • s: Serie<IArray>

    Returns number | number[]

  • minMax(s: Serie<IArray>): number[]
  • Get the min and max of a Serie. The returned array is [min1, min2..., max1, max2...], where 1, 2... is the itemSize.

    Parameters

    • s: Serie<IArray>

    Returns number[]

  • mult(s: Serie<IArray>, ...args: (number | Serie<IArray>)[]): Serie<IArray>
  • Multiply series between them, item component by item component. Do not confuse with multMat

    see

    multMat

    example

    Perform: a = b * c where b, c and d are vectors of size 3

    let df = DataFrame.create({
    series: {
    b: createSerie(new Array(20).fill(2), 3)),
    c: createSerie(new Array(20).fill(3), 3))
    }
    })

    const a = mult( df.series['b'], df.series['c'] )
    example

    Perform: a = 0.1*b + 0.3*c + 0.7*d

    let df = DataFrame.create({
    series: {
    b: createSerie(new Array(20).fill(2), 3)),
    c: createSerie(new Array(20).fill(3), 3)),
    c: createSerie(new Array(20).fill(4), 3))
    }
    })

    const a = add(
    mult( df.series['b'], 0.1),
    mult( df.series['c'], 0.3),
    mult( df.series['d'], 0.7)
    )

    Parameters

    • s: Serie<IArray>
    • Rest ...args: (number | Serie<IArray>)[]

    Returns Serie<IArray>

  • multMat(s1: Serie<IArray>, s2: number | Serie<IArray>): Serie<IArray>
  • Perform either:

    1. Vec*number (scale)
    2. Vec*Vec (dot)
    3. Mat*number (scale)
    4. Mat*Vec
    5. Mat*Mat
    example

    Perform A.B.AT

    const A = Serie.create({array: new Array(27).fill(2), itemSize: 9})
    const B = Serie.create({array: new Array(18).fill(3), itemSize: 6})
    const a = multMat(A, multMat(B, transpose(A)))

    Parameters

    • s1: Serie<IArray>
    • s2: number | Serie<IArray>

    Returns Serie<IArray>

  • negate(s: Serie<IArray>): Serie<IArray>
  • Parameters

    • s: Serie<IArray>

    Returns Serie<IArray>

  • norm(s: Serie<IArray>): Serie<IArray>
  • Parameters

    • s: Serie<IArray>

    Returns Serie<IArray>

  • norm2(s: Serie<IArray>): Serie<IArray>
  • Parameters

    • s: Serie<IArray>

    Returns Serie<IArray>

  • normalize(s: Serie<IArray>): Serie<IArray>
  • If itemSize is > 1, normalize each item independently, otherwize normalize the serie (since itemSize=1).

    Parameters

    • s: Serie<IArray>

    Returns Serie<IArray>

  • rand(a: Serie<IArray>, min?: number, max?: number): Serie<IArray>
  • example
    const a = createSerie( {data: [1, 2, 3, 4, 5, 6]} )
    console.log( round( rand(a, -10, 20 ) ) )
    // [ 17, -5, 14, -5, 5, -8 ]

    Parameters

    • a: Serie<IArray>
    • min: number = 0
    • max: number = 1

    Returns Serie<IArray>

  • rotate(s: Serie<IArray>, rot: Serie<IArray> | Matrix3, inverse?: boolean): Serie<IArray>
  • see

    getRotationAxis to generate a rotation matrix

    Parameters

    • s: Serie<IArray>
    • rot: Serie<IArray> | Matrix3
    • inverse: boolean = false

    Returns Serie<IArray>

  • round(a: Serie<IArray>): Serie<IArray>
  • Parameters

    • a: Serie<IArray>

    Returns Serie<IArray>

  • scale(s: Serie<IArray>, t: number | number[]): Serie<IArray>
  • Parameters

    • s: Serie<IArray>
    • t: number | number[]

    Returns Serie<IArray>

  • shuffle(serie: Serie<IArray>): Serie<number[]>
  • Randomly shuffle a Serie

    example
    import { Serie }   from '@youwol/dataframe
    import { shuffle } from '@youwol/math

    const s1 = Serie.create({array: [1,2,3, 9,8,7, 5,6,7], itemSize: 3})
    const s2 = shuffle(s1) // e.g., [9,8,7, 5,6,7, 1,2,3]

    Parameters

    • serie: Serie<IArray>

    Returns Serie<number[]>

  • square(s: Serie<IArray>): Serie<IArray>
  • Parameters

    • s: Serie<IArray>

    Returns Serie<IArray>

  • sub(s: Serie<IArray>, ...others: (number | Serie<IArray>)[]): Serie<IArray>
  • Subtract several Series to generate a new one

    example
    // perform: a = b - c
    const a = sub(
    df.get('b'),
    df.get('c'),
    )

    Parameters

    • s: Serie<IArray>
    • Rest ...others: (number | Serie<IArray>)[]

    Returns Serie<IArray>

  • sum(a: Serie<IArray>): number | number[]
  • Perform the sum of items of a Serie

    Parameters

    • a: Serie<IArray>

    Returns number | number[]

  • switchConvention(s: Serie<IArray>): Serie<IArray>
  • Convert a 2D or 3D stress tensor (symmetric tensors in the form [xx,xy,yy] or [xx,xy,xz,yy,yz,zz]) given in engineer, into geologist convention (or the other way around). Two calls give the initial serie.

    example
    let stress = ... // stress in engineer convention
    stress = switchConvention(stress) // stress in geologist convention
    stress = switchConvention(stress) // stress in engineer convention

    Parameters

    • s: Serie<IArray>

    Returns Serie<IArray>

  • tagNaN(a: Serie<IArray>, fn: (item: number | number[], i: number, s: Serie<IArray>) => boolean): Serie<IArray>
  • example
    const a = createSerie( {data: [1, 2, 3, 4, 5, 6]} )
    console.log( tagNaN(a, v => v%2===0 ) )
    // [ 1, NaN, 3, NaN, 5, NaN ]

    Parameters

    • a: Serie<IArray>
    • fn: (item: number | number[], i: number, s: Serie<IArray>) => boolean
        • (item: number | number[], i: number, s: Serie<IArray>): boolean
        • Parameters

          • item: number | number[]
          • i: number
          • s: Serie<IArray>

          Returns boolean

    Returns Serie<IArray>

  • trace(s: Serie<IArray>): Serie<IArray>
  • Get the trace of symmetric matrices of size:

    • 6: [xx, xy, xz, yy, yz, zz]
    • 9: [xx, xy, xz, yx, yy, yz, zx, zy, zz]

    Parameters

    • s: Serie<IArray>

    Returns Serie<IArray>

  • translate(s: Serie<IArray>, t: number[]): Serie<IArray>
  • Parameters

    • s: Serie<IArray>
    • t: number[]

    Returns Serie<IArray>

  • transpose(s: Serie<IArray>): Serie<IArray>
  • Only transpose matrix in the form of arrays of size 9

    Parameters

    • s: Serie<IArray>

    Returns Serie<IArray>

  • trunc(a: Serie<IArray>): Serie<IArray>
  • Parameters

    • a: Serie<IArray>

    Returns Serie<IArray>

  • unitInterval(s: Serie<IArray>): Serie<IArray>
  • Transform each item of a serie into a unit interval and independently of each other. For example, item [1,2,5], will be mapped into [0, 0.25, 1]. Otherwise, perform the transformation on the serie (e.g., for itemSize=1).

    Parameters

    • s: Serie<IArray>

    Returns Serie<IArray>

  • weightedSum(data: Serie<IArray>[], alpha: number[]): Serie<IArray>
  • Return a weighted sum of [[Serie]]s

    example
    // performs: 1*S1 + 2*S2 + 3*S3
    const S = [
    createSerie( {data: createArray(18, i => i ), itemSize: 6}), // S1
    createSerie( {data: createArray(18, i => i+1), itemSize: 6}), // S2
    createSerie( {data: createArray(18, i => i+2), itemSize: 6}) // S3
    ]

    const r = weightedSum(S, [1,2,3])
    console.log(r.array)

    // [ 8, 14, 20, 26, 32, 38,
    // 44, 50, 56, 62, 68, 74,
    // 80, 86, 92, 98, 104, 110 ]

    Parameters

    • data: Serie<IArray>[]
    • alpha: number[]

    Returns Serie<IArray>

Dataframe/stats Functions

  • IQR(s: Serie<IArray>): number
  • Parameters

    • s: Serie<IArray>

    Returns number

  • bins(serie: Serie<IArray>, __namedParameters: { nb?: number; size?: number; start?: number; stop?: number }): Serie
  • Bin a serie using either the size of a bin or the number of bins. If the start is not provided, the minimum of the serie is used. If the stop is not provided, the maximum of the serie is used.

    example
    const b1 = bins(serie, {size:5, start:0, stop: 90})
    const b2 = bins(serie, {nb: 18, start:0, stop: 90})
    const b3 = bins(serie, {nb: 20})

    Parameters

    • serie: Serie<IArray>
    • __namedParameters: { nb?: number; size?: number; start?: number; stop?: number }
      • Optional nb?: number
      • Optional size?: number
      • Optional start?: number
      • Optional stop?: number

    Returns Serie

  • covariance(x: Serie<IArray>, y: Serie<IArray>): number
  • Compute covariance with Series.

    Except from Wikipedia:

    In probability theory and statistics, covariance is a measure of the joint variability of two random variables. If the greater values of one variable mainly correspond with the greater values of the other variable, and the same holds for the lesser values (that is, the variables tend to show similar behavior), the covariance is positive. In the opposite case, when the greater values of one variable mainly correspond to the lesser values of the other, (that is, the variables tend to show opposite behavior), the covariance is negative. The sign of the covariance therefore shows the tendency in the linear relationship between the variables. The magnitude of the covariance is not easy to interpret because it is not normalized and hence depends on the magnitudes of the variables. The normalized version of the covariance, the correlation coefficient, however, shows by its magnitude the strength of the linear relation.

    Parameters

    • x: Serie<IArray>
    • y: Serie<IArray>

    Returns number

  • describe(s: Serie<IArray>): { count: number; max: number | number[]; mean: number | number[]; min: number | number[]; q25: number; q50: number; q75: number; std: number }
  • Parameters

    • s: Serie<IArray>

    Returns { count: number; max: number | number[]; mean: number | number[]; min: number | number[]; q25: number; q50: number; q75: number; std: number }

    • count: number
    • max: number | number[]
    • mean: number | number[]
    • min: number | number[]
    • q25: number
    • q50: number
    • q75: number
    • std: number
  • isOutliers(s: Serie<IArray>, mustache: number): Serie<IArray>
  • Return a serie of boolean indicating if an item of the serie s is an outliers or not

    Parameters

    • s: Serie<IArray>
    • mustache: number

    Returns Serie<IArray>

  • mean(s: Serie<IArray>): number | number[]
  • Parameters

    • s: Serie<IArray>

    Returns number | number[]

  • notOutliers(s: Serie<IArray>, mustache?: number): Serie<IArray>
  • outliers(s: Serie<IArray>, mustache: number): Serie<IArray>
  • Parameters

    • s: Serie<IArray>
    • mustache: number

    Returns Serie<IArray>

  • q25(s: Serie<IArray>): number
  • Parameters

    • s: Serie<IArray>

    Returns number

  • q50(s: Serie<IArray>): number
  • Parameters

    • s: Serie<IArray>

    Returns number

  • q75(s: Serie<IArray>): number
  • Parameters

    • s: Serie<IArray>

    Returns number

  • quantile(s: Serie<IArray>, q: number): number
  • std(s: Serie<IArray>): number
  • variance(x: Serie<IArray>): number
  • Compute variance of a Serie

    Parameters

    • x: Serie<IArray>

    Returns number

  • weightedMean(s: Serie<IArray>, w: Serie<IArray>): number | number[]
  • Parameters

    • s: Serie<IArray>
    • w: Serie<IArray>

    Returns number | number[]

Eigen Functions

  • eigen(mat: number[]): { values: number[]; vectors: number[] }
  • note

    Eigen values and vectors are ordered from the highest to the lowest

    Parameters

    • mat: number[]

      The symmetric matrix in a packed array of the form of 6 components [xx, xy, xz, yy, yz, zz] or 9 components [xx, xy, xz, yx, yy, yz, zx, zy, zz]

    Returns { values: number[]; vectors: number[] }

    where values=[v1, v2, v3] and vectors=[v1x, v1y, v1z, v2x, v2y, v2z, v3x, v3y, v3z]

    • values: number[]
    • vectors: number[]

Interpolation Functions

  • biLerp(p: V2, p1: V2, p2: V2, q11: number, q12: number, q21: number, q22: number): number
  • Bilinear interpolation

    Parameters

    • p: V2

      Where to evaluate

    • p1: V2

      min point

    • p2: V2

      max point

    • q11: number

      scalar value at (x1, y1)

    • q12: number

      scalar value at (x1, y2)

    • q21: number

      scalar value at (x2, y1)

    • q22: number

      scalar value at (x2, y2)

    Returns number

  • lerp(x: number, x1: number, x2: number, q00: number, q01: number): number
  • Parameters

    • x: number

      Where to evaluate

    • x1: number

      min point

    • x2: number

      max point

    • q00: number

      scalar value at x1

    • q01: number

      scalar value at x2

    Returns number

  • meshInterpolate(__namedParameters: { attribute: (number | number[])[]; direction?: InterpolateDirection; size?: number; topology: (number | number[])[] }): (number | number[])[]
  • Convert an attribute defined at combel of dim A to a new attribute defined at a combel of dim B using a topological relationship. If A<B, the direction is INCREASING (A -> B).

    A combel made of 1 vertex (also called node) is of dim 0 (0-dimensional space).

    A combel made of 2 connected vertices is a segment and is of dim 1 (1-dimensional space or line).

    A combel made of 3 or more connected planar vertices (convex polygon) is of dim 2 (2-dimensional space or surface).

    A combel made of 4 or more non-planar connected vertices is a tetrahedron and is of dim 3 (3-dimensional space or voluime).

    note

    We only interpolate from combel of dim 0 (vertex) to dim N, and from dim N to dim 0, never from dim N to dim M.

    example
    // interpolate node attributes to 2 triangles and 1 segment
    // The first triangle is made of nodes index 0, 2 and 1
    // The second triangle is made of nodes index 0, 3 and 2
    // The segment is made of nodes index 2 and 3
    const nodes = [1.2, 5.9, 4.2, 7.2]
    const topology = [[0,2,1], [0,3,2], [2,3]] // 2 triangles and 1 segment
    const result = interpolate({attribute: nodes, topology, direction: Direction.INCREASING})
    // Return the value for the first and second triangle and the segment
    // Expected return values [3.7666, 4.2, 6.2]
    // 3.7666 = (1.2 + 4.2 + 5.9) / 3
    // 4.2 = (1.2 + 7.2 + 4.2) / 3
    // 6.2 = (4.2 + 7.2) / 2

    Parameters

    • __namedParameters: { attribute: (number | number[])[]; direction?: InterpolateDirection; size?: number; topology: (number | number[])[] }
      • attribute: (number | number[])[]
      • Optional direction?: InterpolateDirection
      • Optional size?: number
      • topology: (number | number[])[]

    Returns (number | number[])[]

    The new interpolated attribute for the underlaying combels defined in topology

  • tetraLerp(p: V3, p1: V3, p2: V3, p3: V3, p4: V3, q1: number | number[], q2: number | number[], q3: number | number[], q4: number | number[]): number | number[]
  • Parameters

    • p: V3
    • p1: V3
    • p2: V3
    • p3: V3
    • p4: V3
    • q1: number | number[]

      Either a number or an array of size 3, 6 or 9 defined at point p1

    • q2: number | number[]

      Either a number or an array of size 3, 6 or 9 defined at point p2

    • q3: number | number[]

      Either a number or an array of size 3, 6 or 9 defined at point p3

    • q4: number | number[]

      Either a number or an array of size 3, 6 or 9 defined at point p4

    Returns number | number[]

  • triLerp(p: V3, p1: V3, p2: V3, q000: number, q001: number, q010: number, q011: number, q100: number, q101: number, q110: number, q111: number): number
  • Trilinear interpolation

    Parameters

    • p: V3

      Where to evaluate

    • p1: V3

      min point

    • p2: V3

      max point

    • q000: number

      scalar value at (0,0,0)

    • q001: number

      scalar value at (0,0,1)

    • q010: number

      scalar value at (0,1,0)

    • q011: number

      scalar value at (0,1,1)

    • q100: number

      scalar value at (1,0,0)

    • q101: number

      scalar value at (1,0,1)

    • q110: number

      scalar value at (1,1,0)

    • q111: number

      scalar value at (1,1,1)

    Returns number

  • triangleLerp2D(p: V2, p1: V2, p2: V2, p3: V2, q1: number | number[], q2: number | number[], q3: number | number[]): number | number[]
  • Parameters

    • p: V2
    • p1: V2
    • p2: V2
    • p3: V2
    • q1: number | number[]

      Either a number or an array of size 3, 6 or 9 defined at point p1

    • q2: number | number[]

      Either a number or an array of size 3, 6 or 9 defined at point p2

    • q3: number | number[]

      Either a number or an array of size 3, 6 or 9 defined at point p3

    Returns number | number[]

  • triangleLerp3D(p: V3, p1: V3, p2: V3, p3: V3, q1: number | number[], q2: number | number[], q3: number | number[]): number | number[]
  • Parameters

    • p: V3
    • p1: V3
    • p2: V3
    • p3: V3
    • q1: number | number[]

      Either a number or an array of size 3, 6 or 9 defined at point p1

    • q2: number | number[]

      Either a number or an array of size 3, 6 or 9 defined at point p2

    • q3: number | number[]

      Either a number or an array of size 3, 6 or 9 defined at point p3

    Returns number | number[]

Other Functions

  • Get a 3D rotation matrix given an axis and an angle in degrees. Axis can be either a vec.Vector3 or a string ('x', 'X', 'y', 'Y', 'z' or 'Z')

    Parameters

    • axis: string | Vector3
    • angleInDeg: number

    Returns Matrix3

  • Get an inverse CDF function of a PDF function using a lookup table

    Parameters

    Returns (y: number) => number

      • (y: number): number
      • Parameters

        • y: number

        Returns number

  • movingAverage(df: DataFrame, __namedParameters: { Lx: number; Ly: number; lx: number; ly: number; name: string; nx: number; ny: number; x?: number; y?: number; z?: number }): { nx: number; ny: number; positions: Serie<any[]>; solution: Serie<any[]> }
  • Parameters

    • df: DataFrame

      The DataFrame supporting the data for which the we want ti apply this algorithm. This dataframe must contains at least 2 series: positions and name, i.e., the following must hold:

      df.series.positions // must exist
      df.series[name] // must exist
    • __namedParameters: { Lx: number; Ly: number; lx: number; ly: number; name: string; nx: number; ny: number; x?: number; y?: number; z?: number }
      • Lx: number
      • Ly: number
      • lx: number
      • ly: number
      • name: string
      • nx: number
      • ny: number
      • Optional x?: number
      • Optional y?: number
      • Optional z?: number

    Returns { nx: number; ny: number; positions: Serie<any[]>; solution: Serie<any[]> }

    An object contaning the following

    {
    nx : number, // nb points along x
    ny : number, // nb points along y
    positions: Serie, // itemSize = 3
    solution : serie // itemSize = 1
    }
      Lx
    --------------------------
    |                        |
    |                        |
    |   lx                   | Ly
    | -----                  |
    | |   | ly               |
    | -----                  |
    o-------------------------
    (x,y)
    
    • nx: number
    • ny: number
    • positions: Serie<any[]>
    • solution: Serie<any[]>
  • randomMT(ubound?: number, floor?: boolean): number
  • A Mersenne Twister 19937 random number generator. It is proved that the period is 2^19937-1, and 623-dimensional equidistribution property is assured.

    see

    https://en.wikipedia.org/wiki/Mersenne_Twister

    example
    const a = randomMT()           // between 0 and 1 as a float number
    const a = randomMT(1000) // between 0 and 1000 as a float number
    const a = randomMT(1000, true) // between 0 and 1000 as an integer

    Parameters

    • Optional ubound: number

      The upper bound if any (1 by default)

    • floor: boolean = false

      Floor the result if true (false by default)

    Returns number

  • Rotate a vector

    Parameters

    • axis: Vector3

      The axis of rotation

    • angle: number

      The angle of rotation

    • v: Vector3

      The vector to rotate

    Returns number[]

    The rotated vector (new instance)