import { Vec3 } from './Vec3';
import { Mat4 } from './Mat4';
/** Defines all possible rotations axis orders */
export type AxisOrder = 'XYZ' | 'XZY' | 'YXZ' | 'YZX' | 'ZXY' | 'ZYX';
/**
 * Really basic quaternion class used for 3D rotation calculations
 * @see https://github.com/mrdoosb/three.js/blob/dev/src/math/Quaternion.js
 */
export declare class Quat {
    /** The type of the {@link Quat} */
    type: string;
    /** Our quaternion array */
    elements: Float32Array;
    /** Rotation axis order */
    axisOrder: AxisOrder;
    /**
     * Quat constructor
     * @param [elements] - initial array to use
     * @param [axisOrder='XYZ'] - axis order to use
     */
    constructor(elements?: Float32Array, axisOrder?: AxisOrder);
    /**
     * Sets the {@link Quat} values from an array
     * @param array - an array of at least 4 elements
     * @returns - this {@link Quat} after being set
     */
    setFromArray(array?: Float32Array | number[]): Quat;
    /**
     * Sets the {@link Quat} axis order
     * @param axisOrder - axis order to use
     * @returns - this {@link Quat} after axis order has been set
     */
    setAxisOrder(axisOrder?: AxisOrder | string): Quat;
    /**
     * Copy a {@link Quat} into this {@link Quat}
     * @param quaternion - {@link Quat} to copy
     * @returns - this {@link Quat} after copy
     */
    copy(quaternion?: Quat): Quat;
    /**
     * Clone a {@link Quat}
     * @returns - cloned {@link Quat}
     */
    clone(): Quat;
    /**
     * Check if 2 {@link Quat} are equal
     * @param quaternion - {@link Quat} to check against
     * @returns - whether the {@link Quat} are equal or not
     */
    equals(quaternion?: Quat): boolean;
    /**
     * Sets a rotation {@link Quat} using Euler angles {@link Vec3 | vector} and its axis order
     * @param vector - rotation {@link Vec3 | vector} to set our {@link Quat} from
     * @returns - {@link Quat} after having applied the rotation
     */
    setFromVec3(vector: Vec3): Quat;
    /**
     * Set a {@link Quat} from a rotation axis {@link Vec3 | vector} and an angle
     * @param axis - normalized {@link Vec3 | vector} around which to rotate
     * @param angle - angle (in radians) to rotate
     * @returns - {@link Quat} after having applied the rotation
     */
    setFromAxisAngle(axis: Vec3, angle?: number): Quat;
    /**
     * Set a {@link Quat} from a rotation {@link Mat4 | matrix}
     * @param matrix - rotation {@link Mat4 | matrix} to use
     * @returns - {@link Quat} after having applied the rotation
     */
    setFromRotationMatrix(matrix: Mat4): Quat;
    /**
     * Get the square length of this {@link Quat}.
     * @returns - square length of this {@link Quat}.
     */
    lengthSq(): number;
    /**
     * Get the length of this {@link Quat}.
     * @returns - length of this {@link Quat}.
     */
    length(): number;
    /**
     * Normalize this {@link Quat}.
     * @returns - normalized {@link Quat}.
     */
    normalize(): this;
    /**
     * Calculate the spherical linear interpolation of this {@link Quat} by given {@link Quat} and alpha, where alpha is the percent distance.
     * @param quat - {@link Quat} to interpolate towards.
     * @param alpha - spherical interpolation factor in the [0, 1] interval.
     * @returns - this {@link Quat} after spherical linear interpolation.
     */
    slerp(quat?: Quat, alpha?: number): Quat;
}
