/***************************************************************
 * PrVector6.cpp
 *
 * This implements a 6x1 vector class.
 *
 ****************************************************************/

/*
 * modification history
 *----------------------
 *
 * 11/20/97: K.C. Chang: added inline methods.
 * 11/05/97: K.C. Chang: created.
 */

#include "PrVector6.h"
#include "PrMatrix6.h"
#include <math.h>
#include <stdio.h>

PrVector6 PrVector6::operator-() const
{
    return PrVector6(-vec3_[0],-vec3_[1]);
}

void PrVector6::negate(PrVector6 &dest) const
{
    vec3_[0].negate(dest.vec3_[0]);
    vec3_[1].negate(dest.vec3_[1]);
}

PrVector6 PrVector6::operator+(const PrVector6 &v) const
{
  return PrVector6(*this) += v;
}

void PrVector6::add(const PrVector6 &v,PrVector6 &dest) const
{
    vec3_[0].add(v.vec3_[0],dest.vec3_[0]);
    vec3_[1].add(v.vec3_[1],dest.vec3_[1]);
}

const PrVector6 PrVector6::operator-(const PrVector6 &v) const
{
  return PrVector6(*this) -= v;
}

void PrVector6::subtract(const PrVector6 &v,PrVector6 &dest) const
{
    vec3_[0].subtract(v.vec3_[0],dest.vec3_[0]);
    vec3_[1].subtract(v.vec3_[1],dest.vec3_[1]);
}


PrVector6 PrVector6::operator*(Float s) const
{
  return PrVector6(*this) *= s;
}

void PrVector6::multiply(Float s,PrVector6 &dest) const
{
    vec3_[0].multiply(s,dest.vec3_[0]);
    vec3_[1].multiply(s,dest.vec3_[1]);
}

PrVector6 PrVector6::operator*(const PrVector6 &v) const
{
    return PrVector6(vec3_[0]*v.vec3_[0],vec3_[1]*v.vec3_[1]);
}

void PrVector6::multiply(const PrVector6 &v,PrVector6 &dest) const
{
    vec3_[0].multiply(v.vec3_[0],dest.vec3_[0]);
    vec3_[1].multiply(v.vec3_[1],dest.vec3_[1]);
}

PrVector6 &PrVector6::operator+=(const PrVector6 &v)
{
    vec3_[0] += v.vec3_[0];
    vec3_[1] += v.vec3_[1];
    return (*this);
}

PrVector6 &PrVector6::operator-=(const PrVector6 &v)
{
    vec3_[0] -= v.vec3_[0];
    vec3_[1] -= v.vec3_[1];
    return (*this);
}

PrVector6 &PrVector6::operator*=(Float s)
{
    vec3_[0] *= s;
    vec3_[1] *= s;
    return (*this);
}

PrMatrix6 PrVector6::multiplyTransposed(const PrVector6 &v) const
{
    return PrMatrix6(vec3_[0].multiplyTransposed(v[0]),
		     vec3_[0].multiplyTransposed(v[1]),
		     vec3_[1].multiplyTransposed(v[0]),
		     vec3_[1].multiplyTransposed(v[1]));
}

void PrVector6::multiplyTransposed(const PrVector6 &v,PrMatrix6 &dest) const
{
    vec3_[0].multiplyTransposed(v[0],dest[0]);
    vec3_[0].multiplyTransposed(v[1],dest[1]);
    vec3_[1].multiplyTransposed(v[0],dest[2]);
    vec3_[1].multiplyTransposed(v[1],dest[3]);
}

Float PrVector6::dot(const PrVector6 &v) const
{
    return (vec3_[0].dot(v.vec3_[0])
	    + vec3_[1].dot(v.vec3_[1]));
}

Float PrVector6::magnitude() const
{
    return sqrt(dot(*this));
}

void PrVector6::display(char *name)
{
    if (name != NULL)
      printf("%s =\n",name);
    printf("(");
    vec3_[0].display();
    vec3_[1].display();
    printf(")\n");
}
