Simple Vector Library 1.5 http://www.cs.cmu.edu/~ajw/doc/svl.html
Vec.h
- Committer:
- BartJanssens
- Date:
- 2016-01-05
- Revision:
- 1:e25ff4b06ed2
- Parent:
- 0:785cff1e5a7c
File content as of revision 1:e25ff4b06ed2:
/*
File: Vec.h
Function: Defines a generic resizeable vector.
Author(s): Andrew Willmott
Copyright: (c) 1995-2001, Andrew Willmott
*/
#ifndef __Vec__
#define __Vec__
#include "Basics.h"
#include "Constants.h"
#include "Utils.h"
class Vec2;
class Vec3;
class Vec4;
// --- Vec Class --------------------------------------------------------------
class Vec
{
public:
// Constructors
Vec(); // Null vector
explicit Vec(Int n); // n-element vector
Vec(Int n, double elt0, ...); // e.g. Vec(3, 1.1, 2.0, 3.4)
Vec(Int n, Real *data); // Vector reference
Vec(const Vec &v); // Copy constructor
Vec(const Vec2 &v); // reference to a Vec2
Vec(const Vec3 &v); // reference to a Vec3
Vec(const Vec4 &v); // reference to a Vec4
Vec(Int n, ZeroOrOne); // Zero or all-ones vector
Vec(Int n, Axis a); // Unit vector
~Vec(); // Destructor
// Accessor functions
Int Elts() const;
Real &operator [] (Int i);
Real operator [] (Int i) const;
Void SetSize(Int n); // Resize the vector
Real *Ref() const; // Return pointer to data
// Assignment operators
Vec &operator = (const Vec &v); // v = a etc.
Vec &operator = (ZeroOrOne k);
Vec &operator = (Axis a);
Vec &operator = (const Vec2 &v);
Vec &operator = (const Vec3 &v);
Vec &operator = (const Vec4 &v);
// In-Place operators
Vec &operator += (const Vec &v);
Vec &operator -= (const Vec &v);
Vec &operator *= (const Vec &v);
Vec &operator *= (Real s);
Vec &operator /= (const Vec &v);
Vec &operator /= (Real s);
// Vector initialisers
Vec &MakeZero();
Vec &MakeUnit(Int i, Real k = vl_one);
Vec &MakeBlock(Real k = vl_one);
Vec &Normalise(); // Normalise vector
Vec &Clamp(Real fuzz);
Vec &Clamp();
Bool IsRef() const { return((elts & VL_REF_FLAG) != 0); };
// Private...
protected:
Real *data;
UInt elts;
};
// --- Vec Comparison Operators -----------------------------------------------
Bool operator == (const Vec &a, const Vec &b);
Bool operator != (const Vec &a, const Vec &b);
// --- Vec Arithmetic Operators -----------------------------------------------
Vec operator + (const Vec &a, const Vec &b);
Vec operator - (const Vec &a, const Vec &b);
Vec operator - (const Vec &v);
Vec operator * (const Vec &a, const Vec &b);
Vec operator * (const Vec &v, Real s);
Vec operator / (const Vec &a, const Vec &b);
Vec operator / (const Vec &v, Real s);
Vec operator * (Real s, const Vec &v);
Real dot(const Vec &a, const Vec &b);// v . a
inline Real len(const Vec &v); // || v ||
inline Real sqrlen(const Vec &v); // v . v
inline Vec norm(const Vec &v); // v / || v ||
inline Void normalise(Vec &v); // v = norm(v)
Vec clamped(const Vec &v, Real fuzz);
Vec clamped(const Vec &v);
// --- Vec Input & Output -----------------------------------------------------
//std::ostream &operator << (std::ostream &s, const Vec &v);
//std::istream &operator >> (std::istream &s, Vec &v);
inline void printVec(const Vec &v);
// --- Sub-vector functions ---------------------------------------------------
inline Vec sub(const Vec &v, Int start, Int length);
inline Vec first(const Vec &v, Int length);
inline Vec last(const Vec &v, Int length);
// --- Vec inlines ------------------------------------------------------------
inline Vec::Vec() : data(0), elts(0)
{
}
inline Vec::Vec(Int n) : elts(n)
{
Assert(n > 0,"(Vec) illegal vector size");
data = new Real[n];
}
inline Vec::Vec(Int n, Real *data) : data(data), elts(n | VL_REF_FLAG)
{
}
inline Int Vec::Elts() const
{
return(elts & VL_REF_MASK);
}
inline Real &Vec::operator [] (Int i)
{
CheckRange(i, 0, Elts(), "Vec::[i]");
return(data[i]);
}
inline Real Vec::operator [] (Int i) const
{
CheckRange(i, 0, Elts(), "Vec::[i]");
return(data[i]);
}
inline Real *Vec::Ref() const
{
return(data);
}
inline Vec &Vec::operator = (ZeroOrOne k)
{
MakeBlock(k);
return(SELF);
}
inline Vec &Vec::operator = (Axis a)
{
MakeUnit(a);
return(SELF);
}
inline Real len(const Vec &v)
{
return(sqrt(dot(v, v)));
}
inline Real sqrlen(const Vec &v)
{
return(dot(v, v));
}
inline Vec norm(const Vec &v)
{
Assert(sqrlen(v) > 0.0, "normalising length-zero vector");
return(v / len(v));
}
inline Void normalise(Vec &v)
{
v /= len(v);
}
inline Vec sub(const Vec &v, Int start, Int length)
{
Assert(start >= 0 && length > 0 && start + length <= v.Elts(),
"(sub(Vec)) illegal subset of vector");
return(Vec(length, v.Ref() + start));
}
inline Vec first(const Vec &v, Int length)
{
Assert(length > 0 && length <= v.Elts(),
"(first(Vec)) illegal subset of vector");
return(Vec(length, v.Ref()));
}
inline Vec last(const Vec &v, Int length)
{
Assert(length > 0 && length <= v.Elts(),
"(last(Vec)) illegal subset of vector");
return(Vec(length, v.Ref() + v.Elts() - length));
}
inline Vec &Vec::Normalise()
{
Assert(sqrlen(SELF) > 0.0, "normalising length-zero vector");
SELF /= len(SELF);
return(SELF);
}
inline void printVec(const Vec &v)
{
Int i;
printf("[");
if (v.Elts() > 0)
{
printf("%10f",v[0]);
for (i = 1; i < v.Elts(); i++)
printf(" %10f", v[i]);
}
printf("]");
}
#endif