summaryrefslogblamecommitdiff
path: root/hw6/src/vec2d.cpp
blob: ae12e4119f6198edee2423a21a8bc030c0ca6436 (plain) (tree)

































































































































































































































































                                                                    
/******************************************************************/
/* This file is part of the homework assignments for CSCI-427/527 */
/* at The College of William & Mary and authored by Pieter Peers. */
/* No part of this file, whether altered or in original form, can */
/* be distributed or used outside the context of CSCI-427/527     */
/* without consent of either the College of William & Mary or     */
/* Pieter Peers.                                                  */
/******************************************************************/

#include <cassert>
#include <algorithm>
#include "vec2d.h"

//////////////////
// Constructors //
//////////////////
vec2d::vec2d(vec2d::const_reference value)
{ 
  x = y = value;
}


vec2d::vec2d(vec2d::const_reference x, vec2d::const_reference y) 
{
  this->x = x;
  this->y = y;
}


vec2d::vec2d(const vec2d& v)
{
  x = v.x;
  y = v.y;
}
 

////////////////
// Inspectors //
////////////////
vec2d::const_reference vec2d::operator[](size_t index) const 
{ 
  assert(index < size());
  return data[index]; 
}


vec2d::reference vec2d::operator[](size_t index) 
{ 
  assert(index < size());
  return data[index]; 
}


vec2d::iterator vec2d::begin(void)
{
  return data;
}


vec2d::const_iterator vec2d::begin(void) const
{
  return data;
}


vec2d::iterator vec2d::end(void)
{
  return begin() + size();
}


vec2d::const_iterator vec2d::end(void) const
{
  return begin() + size();
}


///////////////
// Operators //
///////////////
vec2d& vec2d::operator=(const vec2d& v) 
{ 
  _assign(v); 
  return *this; 
}


bool vec2d::operator==(const vec2d& v) const 
{ 
  return (x == v.x) && (y == v.y); 
}


bool vec2d::operator!=(const vec2d& v) const 
{ 
  return (x != v.x) || (y != v.y); 
}
  

vec2d vec2d::operator-(void) const
{
  return vec2d(-x, -y);
}


vec2d vec2d::operator+(const vec2d& v) const 
{ 
  return vec2d(x + v.x, y + v.y); 
}


vec2d vec2d::operator-(const vec2d& v) const 
{ 
  return vec2d(x - v.x, y - v.y); 
}


vec2d vec2d::operator*(const vec2d& v) const 
{ 
  return vec2d(x * v.x, y * v.y); 
}


vec2d vec2d::operator*(vec2d::const_reference scale) const 
{ 
  return vec2d(x * scale, y * scale); 
}


vec2d vec2d::operator/(const vec2d& v) const 
{ 
  return vec2d(x / v.x, y / v.y); 
}


vec2d vec2d::operator/(vec2d::const_reference scale) const 
{ 
  return vec2d(x / scale, y / scale); 
}


vec2d& vec2d::operator+=(const vec2d& v) 
{ 
  x += v.x; 
  y += v.y; 
  return *this; 
}


vec2d& vec2d::operator-=(const vec2d& v) 
{ 
  x -= v.x;
  y -= v.y;
  return *this; 
}


vec2d& vec2d::operator*=(const vec2d& v) 
{ 
  x *= v.x;
  y *= v.y;
  return *this; 
}


vec2d& vec2d::operator*=(vec2d::const_reference scale) 
{ 
  x *= scale;
  y *= scale;
  return *this; 
}


vec2d& vec2d::operator/=(const vec2d& v) 
{ 
  x /= v.x;
  y /= v.y;
  return *this; 
}							


vec2d& vec2d::operator/=(vec2d::const_reference scale) 
{ 
  x /= scale;
  y /= scale;
  return *this; 
}



///////////////
// Modifiers //
///////////////
vec2d::value_type vec2d::dot(const vec2d& v) const 
{ 
  return (x*v.x + y*v.y);
}


vec2d::value_type vec2d::squared_length(void) const 
{ 
  return dot(*this); 
}


vec2d::value_type vec2d::length(void) const 
{ 
  return sqrt(squared_length()); 
}


vec2d::value_type vec2d::squared_distance(const vec2d& v) const 
{
  return (*this - v).squared_length(); 
}


vec2d::value_type vec2d::distance(const vec2d& v) const 
{ 
  return sqrt(squared_distance(v)); 
}


///////////////
// Modifiers //
///////////////
vec2d& vec2d::abs(void)
{
  std::for_each(begin(), end(), [](reference val) 
  { 
    if(val < 0) val = -val; 
  });
  return *this;
}


vec2d& vec2d::normalize(void)
{ 
  *this /= length();
  return *this;
}


/////////////////////
// Private Methods //
/////////////////////
void vec2d::_assign(const vec2d& v)
{ 
  x = v.x;  
  y = v.y; 
}


void vec2d::_swap(vec2d& v) 
{
  std::swap(x, v.x);
  std::swap(y, v.y);
}