function _AAA (x, y, plane) {
    x = _coerceArr(x)
    y = _coerceArr(y)
    plane = _coerceArr(plane)

    if (!_3d(x)) { throw new TypeError('Array with 3 numbers or BigNumbers expected for first argument') }
    if (!_3d(y)) { throw new TypeError('Array with 3 numbers or BigNumbers expected for second argument') }
    if (!_4d(plane)) { throw new TypeError('Array with 4 numbers expected as third argument') }

    return _intersectLinePlane(x[0], x[1], x[2], y[0], y[1], y[2], plane[0], plane[1], plane[2], plane[3])
  }
Calculates the point of intersection of two lines in two or three dimensions
and of a line and a plane in three dimensions. The inputs are in the form of
arrays or 1 dimensional matrices. The line intersection functions return null
if the lines do not meet.

Note: Fill the plane coefficients as `x + y + z = c` and not as `x + y + z + c = 0`.

Syntax:

   math.intersect(endPoint1Line1, endPoint2Line1, endPoint1Line2, endPoint2Line2)
   math.intersect(endPoint1, endPoint2, planeCoefficients)

Examples:

   math.intersect([0, 0], [10, 10], [10, 0], [0, 10])              // Returns [5, 5]
   math.intersect([0, 0, 0], [10, 10, 0], [10, 0, 0], [0, 10, 0])  // Returns [5, 5, 0]
   math.intersect([1, 0, 1],  [4, -2, 2], [1, 1, 1, 6])            // Returns [7, -4, 3]

@param  {Array | Matrix} w   Co-ordinates of first end-point of first line
@param  {Array | Matrix} x   Co-ordinates of second end-point of first line
@param  {Array | Matrix} y   Co-ordinates of first end-point of second line
                             OR Co-efficients of the plane's equation
@param  {Array | Matrix} z   Co-ordinates of second end-point of second line
                             OR undefined if the calculation is for line and plane
@return {Array}              Returns the point of intersection of lines/lines-planes