/*
* Copyright (c) 2008, 2009, 2010, 2011
* Jonathan Schleifer <js@webkeks.org>
*
* All rights reserved.
*
* This file is part of ObjFW. It may be distributed under the terms of the
* Q Public License 1.0, which can be found in the file LICENSE.QPL included in
* the packaging of this file.
*
* Alternatively, it may be distributed under the terms of the GNU General
* Public License, either version 2 or 3, which can be found in the file
* LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this
* file.
*/
#include <stdarg.h>
#import "OFObject.h"
@class OFDoubleMatrix;
/**
* \brief A class for storing and manipulating vectors of doubles.
*/
@interface OFDoubleVector: OFObject <OFCopying>
{
@public
size_t dimension;
double *data;
}
/**
* \brief Creates a new vector with the specified dimension.
*
* \param dimension The dimension for the vector
* \return A new autoreleased OFDoubleVector
*/
+ vectorWithDimension: (size_t)dimension;
/**
* \brief Creates a new vector with the specified dimension and data.
*
* \param dimension The dimension for the vector
* \param data The first double of the data for the vector
* \return A new autoreleased OFDoubleVector
*/
+ vectorWithDimension: (size_t)dimension
data: (double)data, ...;
/**
* \brief Initializes the vector with the specified dimension.
*
* \param dimension The dimension for the vector
* \return An initialized OFDoubleVector
*/
- initWithDimension: (size_t)dimension;
/**
* \brief Initializes the vector with the specified dimension and data.
*
* \param dimension The dimension for the vector
* \param data The first double of the data for the vector
* \return An initialized OFDoubleVector
*/
- initWithDimension: (size_t)dimension
data: (double)data, ...;
/**
* \brief Initializes the vector with the specified dimension and data.
*
* \param dimension The dimension for the vector
* \param The first double of the data for the vector
* \param arguments A va_list with data for the vector
* \return An initialized OFDoubleVector
*/
- initWithDimension: (size_t)dimension
data: (double)data
arguments: (va_list)arguments;
/**
* \brief Sets the value for the specified index.
*
* \param value The value
* \param index The index for the value
*/
- (void)setValue: (double)value
atIndex: (size_t)index;
/**
* \brief Returns the value for the specified index.
*
* \param index The index for which the value should be returned
* \return The value for the specified index
*/
- (double)valueAtIndex: (size_t)index;
/**
* \brief Returns the dimension of the vector.
*
* \return The dimension of the vector
*/
- (size_t)dimension;
/**
* \brief Changes the dimension of the vector.
*
* If the new dimension is smaller, elements will be cut off.
* If the new dimension is bigger, new elements will be filled with zeros.
*
* \param dimension The new dimension for the vector
*/
- (void)setDimension: (size_t)dimension;
/**
* \brief Returns an array of doubles with the contents of the vector.
*
* Modifying the returned array directly is allowed and will change the vector.
*
* \return An array of doubles with the contents of the vector
*/
- (double*)cArray;
/**
* \brief Returns the magnitude or length of the vector.
*
* \return The magnitude or length of the vector
*/
- (double)magnitude;
/**
* \brief Normalizes the vector.
*/
- (void)normalize;
/**
* \brief Adds the specified vector to the receiver.
*
* \param vector The vector to add
*/
- (void)addVector: (OFDoubleVector*)vector;
/**
* \brief Subtracts the specified vector from the receiver.
*
* \param vector The vector to subtract
*/
- (void)subtractVector: (OFDoubleVector*)vector;
/**
* \brief Multiplies the receiver with the specified scalar.
*
* \param scalar The scalar to multiply with
*/
- (void)multiplyWithScalar: (double)scalar;
/**
* \brief Divides the receiver by the specified scalar.
*
* \param scalar The scalar to divide by
*/
- (void)divideByScalar: (double)scalar;
/**
* \brief Multiplies the components of the receiver with the components of the
* specified vector.
*
* \param vector The vector to multiply the receiver with
*/
- (void)multiplyWithComponentsOfVector: (OFDoubleVector*)vector;
/**
* \brief Divides the components of the receiver by the components of the
* specified vector.
*
* \param vector The vector to divide the receiver by
*/
- (void)divideByComponentsOfVector: (OFDoubleVector*)vector;
/**
* \brief Returns the dot product of the receiver and the specified vector.
*
* \return The dot product of the receiver and the specified vector
*/
- (double)dotProductWithVector: (OFDoubleVector*)vector;
/**
* \brief Returns the cross product of the receiver and the specified vector.
*
* This currently only works for 3D vectors.
*
* \return The cross product of the receiver and the specified vector
*/
- (OFDoubleVector*)crossProductWithVector: (OFDoubleVector*)vector;
/**
* \brief Multiplies the receiver with the specified matrix on the left side and
* the receiver on the right side.
*
* \param matrix The matrix to multiply the receiver with
*/
- (void)multiplyWithMatrix: (OFDoubleMatrix*)matrix;
@end