/**
 * @author @thkruz Theodore Kruczek
 * @description Orbital Object ToolKit (ootk) is a collection of tools for working
 * with satellites and other orbital objects.
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025 Kruczek Labs LLC
 *
 * Many of the classes are based off of the work of @david-rc-dayton and his
 * Pious Squid library (https://github.com/david-rc-dayton/pious_squid) which
 * is licensed under the MIT license.
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */
import { Vector3D, Matrix, Degrees, Radians } from '../main.js';
/**
 * A Vector is a mathematical object that has both magnitude and direction.
 */
export declare class Vector<T extends number = number> {
    elements: T[] | Float64Array;
    /**
     * The length of the vector.
     */
    readonly length: number;
    /**
     * Represents a 3-dimensional vector.
     */
    static readonly origin3: Vector<0>;
    /**
     * Represents a vector with all elements set to zero.
     */
    static readonly origin6: Vector<0>;
    /**
     * Represents the x-axis vector.
     */
    static readonly xAxis: Vector<0 | 1>;
    /**
     * Represents the y-axis vector.
     */
    static readonly yAxis: Vector<0 | 1>;
    /**
     * Represents the z-axis vector.
     */
    static readonly zAxis: Vector<0 | 1>;
    /**
     * Represents a vector pointing along the negative x-axis.
     */
    static readonly xAxisNeg: Vector<0 | -1>;
    /**
     * Represents a vector pointing along the negative y-axis.
     */
    static readonly yAxisNeg: Vector<0 | -1>;
    /**
     * Represents a vector pointing along the negative z-axis.
     */
    static readonly zAxisNeg: Vector<0 | -1>;
    constructor(elements: T[] | Float64Array);
    /**
     * Creates a zero vector of the specified length.
     * @param length The length of the vector.
     * @returns A new Vector object representing the zero vector.
     */
    static zero(length: number): Vector;
    /**
     * Creates a new Vector with the specified length, filled with the specified
     * value.
     * @param length The length of the new Vector.
     * @param value The value to fill the Vector with.
     * @returns A new Vector filled with the specified value.
     */
    static filled(length: number, value: number): Vector;
    /**
     * Creates a new Vector instance from an array of elements.
     * @param elements - The array of elements to create the Vector from.
     * @returns A new Vector instance.
     */
    static fromList(elements: number[]): Vector;
    /**
     * Returns a string representation of the vector.
     * @param fixed - The number of digits to appear after the decimal point.
     * Defaults to -1.
     * @returns A string representation of the vector.
     */
    toString(fixed?: number): string;
    /**
     * Returns a string representation of the x value of the vector.
     * @returns A string representation of the x value of the vector.
     */
    get x(): number;
    /**
     * Returns a string representation of the y value of the vector.
     * @returns A string representation of the y value of the vector.
     */
    get y(): number;
    /**
     * Returns a string representation of the z value of the vector.
     * @returns A string representation of the z value of the vector.
     */
    get z(): number;
    /**
     * Converts the vector elements to an array.
     * @returns An array containing the vector elements.
     */
    toList(): number[];
    /**
     * Converts the vector to a Float64Array.
     * @returns The vector as a Float64Array.
     */
    toArray(): Float64Array;
    /**
     * Calculates the magnitude of the vector.
     * @returns The magnitude of the vector.
     */
    magnitude(): number;
    /**
     * Adds the elements of another vector to this vector and returns a new
     * vector.
     * @param v - The vector to add.
     * @returns A new vector containing the sum of the elements.
     */
    add(v: Vector): Vector;
    /**
     * Subtracts a vector from the current vector.
     * @param v The vector to subtract.
     * @returns A new vector representing the result of the subtraction.
     */
    subtract(v: Vector): Vector;
    /**
     * Scales the vector by a given factor.
     * @param n The scaling factor.
     * @returns A new Vector object representing the scaled vector.
     */
    scale(n: number): Vector;
    /**
     * Negates the vector by scaling it by -1.
     * @returns A new Vector object representing the negated vector.
     */
    negate(): Vector;
    /**
     * Return the Euclidean distance between this and another Vector.
     * @param v The vector to calculate the distance to.
     * @returns The distance between the two vectors.
     */
    distance(v: Vector): number;
    /**
     * Normalizes the vector, making it a unit vector with the same direction but
     * a magnitude of 1. If the vector has a magnitude of 0, it returns a zero
     * vector of the same length.
     * @returns The normalized vector.
     */
    normalize(): Vector;
    /**
     * Calculates the dot product of this vector and another vector.
     * @param v - The vector to calculate the dot product with.
     * @returns The dot product of the two vectors.
     */
    dot(v: Vector): number;
    /**
     * Calculates the outer product of this vector with another vector.
     * @param v The vector to calculate the outer product with.
     * @returns A matrix representing the outer product of the two vectors.
     */
    outer(v: Vector): Matrix;
    /**
     * Calculates the cross product of this vector and the given vector.
     * @param v - The vector to calculate the cross product with.
     * @returns The resulting vector.
     */
    cross(v: Vector): Vector;
    /**
     * Calculate the skew-symmetric matrix for this [Vector].
     * @returns The skew-symmetric matrix.
     * @throws [Error] if the vector is not of length 3.
     */
    skewSymmetric(): Matrix;
    /**
     * Rotates the vector around the X-axis by the specified angle.
     * @param theta The angle in radians.
     * @returns The rotated vector.
     */
    rotX(theta: Radians): Vector;
    /**
     * Rotates the vector around the Y-axis by the specified angle.
     * @param theta The angle of rotation in radians.
     * @returns A new Vector representing the rotated vector.
     */
    rotY(theta: Radians): Vector;
    /**
     * Rotates the vector around the Z-axis by the specified angle.
     * @param theta The angle of rotation in radians.
     * @returns A new Vector representing the rotated vector.
     */
    rotZ(theta: Radians): Vector;
    /**
     * Calculates the angle between this vector and another vector.
     * @param v The other vector.
     * @returns The angle between the two vectors in radians.
     */
    angle(v: Vector): Radians;
    /**
     * Calculates the angle between this vector and another vector in degrees.
     * @param v The other vector.
     * @returns The angle between the two vectors in degrees.
     */
    angleDegrees(v: Vector): Degrees;
    /**
     * Determines if there is line of sight between this vector and another vector
     * within a given radius.
     * @param v - The vector to check line of sight with.
     * @param radius - The radius within which line of sight is considered.
     * @returns True if there is line of sight, false otherwise.
     */
    sight(v: Vector, radius: number): boolean;
    /**
     * Returns the bisect vector between this vector and the given vector. The
     * bisect vector is calculated by scaling this vector's magnitude by the
     * magnitude of the given vector, adding the result to the product of scaling
     * the given vector's magnitude by this vector's magnitude, and then
     * normalizing the resulting vector.
     * @param v - The vector to calculate the bisect with.
     * @returns The bisect vector.
     */
    bisect(v: Vector): Vector;
    /**
     * Joins the current vector with another vector.
     * @param v The vector to join with.
     * @returns A new vector that contains the elements of both vectors.
     */
    join(v: Vector): Vector;
    /**
     * Returns a new Vector containing a portion of the elements from the
     * specified start index to the specified end index
     * @param start The start index of the slice (inclusive).
     * @param end The end index of the slice (exclusive).
     * @returns A new Vector containing the sliced elements.
     */
    slice(start: number, end: number): Vector;
    /**
     * Returns a new Matrix object representing the row vector.
     * @returns The row vector as a Matrix object.
     */
    row(): Matrix;
    /**
     * Returns a new Matrix object representing the column vector of this Vector.
     * @returns The column vector as a Matrix object.
     */
    column(): Matrix;
    /**
     * Converts the elements at the specified index to a Vector3D object.
     * @param index - The index of the elements to convert.
     * @returns A new Vector3D object containing the converted elements.
     */
    toVector3D(index: number): Vector3D;
}
