/******************************************************************/ /* 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 #include #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); }