/*
* 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 OFDoubleVector;
/**
* \brief A class for storing and manipulating matrices of doubles.
*/
@interface OFDoubleMatrix: OFObject <OFCopying>
{
@public
size_t rows, columns;
double *data;
}
/**
* \brief Creates a new matrix with the specified dimension.
*
* If the number of rows and columns is equal, the matrix is initialized to be
* the identity.
*
* \param rows The number of rows for the matrix
* \param columns The number of colums for the matrix
* \return A new autoreleased OFDoubleMatrix
*/
+ matrixWithRows: (size_t)rows
columns: (size_t)columns;
/**
* \brief Creates a new matrix with the specified dimension and data.
*
* \param rows The number of rows for the matrix
* \param columns The number of colums for the matrix
* \param data The first double of the data for the matrix. The data is in the
* format rows-columns.
* \return A new autoreleased OFDoubleMatrix
*/
+ matrixWithRows: (size_t)rows
columns: (size_t)columns
data: (double)data, ...;
/**
* \brief Initializes the matrix with the specified dimension.
*
* If the number of rows and columns is equal, the matrix is initialized to be
* the identity.
*
* \param rows The number of rows for the matrix
* \param columns The number of colums for the matrix
* \return An initialized OFDoubleMatrix
*/
- initWithRows: (size_t)rows
columns: (size_t)columns;
/**
* \brief Initializes the matrix with the specified dimension and data.
*
* \param rows The number of rows for the matrix
* \param columns The number of colums for the matrix
* \param data The first double of the data for the matrix. The data is in the
* format rows-columns.
* \return An initialized OFDoubleMatrix
*/
- initWithRows: (size_t)rows
columns: (size_t)columns
data: (double)data, ...;
/**
* \brief Initializes the matrix with the specified dimension and arguments.
*
* \param rows The number of rows for the matrix
* \param columns The number of colums for the matrix
* \param data The first double of the data for the matrix. The data is in the
* format rows-columns.
* \param arguments A va_list with data for the matrix
* \return An initialized OFDoubleMatrix
*/
- initWithRows: (size_t)rows
columns: (size_t)columns
data: (double)data
arguments: (va_list)arguments;
/**
* \brief Sets the value for the specified row and colmn.
*
* \param value The value
* \param row The row for the value
* \param column The column for the value
*/
- (void)setValue: (double)value
forRow: (size_t)row
column: (size_t)column;
/**
* \brief Returns the value for the specified row and column.
*
* \param row The row for which the value should be returned
* \param column The column for which the value should be returned
* \return The value for the specified row and column
*/
- (double)valueForRow: (size_t)row
column: (size_t)column;
/**
* \brief Returns the number of rows of the matrix.
*
* \return The number of rows of the matrix
*/
- (size_t)rows;
/**
* \brief Returns the number of columns of the matrix.
*
* \return The number of columns of the matrix
*/
- (size_t)columns;
/**
* \brief Returns an array of doubles with the contents of the matrix.
*
* The returned array is in the format columns-rows.
* Modifying the returned array directly is allowed and will change the matrix.
*
* \brief An array of doubles with the contents of the vector
*/
- (double*)cArray;
/**
* \brief Adds the specified matrix to the receiver.
*
* \param matrix The matrix to add
*/
- (void)addMatrix: (OFDoubleMatrix*)matrix;
/**
* \brief Subtracts the specified matrix from the receiver.
*
* \param matrix The matrix to subtract
*/
- (void)subtractMatrix: (OFDoubleMatrix*)matrix;
/**
* \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 receiver with the specified matrix on the left side and
* the receiver on the right.
*
* \param matrix The matrix to multiply the receiver with
*/
- (void)multiplyWithMatrix: (OFDoubleMatrix*)matrix;
/**
* \brief Transposes the receiver.
*/
- (void)transpose;
/**
* \brief Translates the nxn matrix of the receiver with an n-1 vector.
*
* \param vector The vector to translate with
*/
- (void)translateWithVector: (OFDoubleVector*)vector;
/**
* \brief Rotates the 4x4 matrix of the receiver with a 3D vector and an angle.
*
* \param vector The vector to rotate with
* \param angle The angle to rotate with
*/
- (void)rotateWithVector: (OFDoubleVector*)vector
angle: (double)angle;
/**
* \brief Scales the nxn matrix of the receiver with an n-1 vector.
*
* \param scale The vector to scale with
*/
- (void)scaleWithVector: (OFDoubleVector*)vector;
@end