diff options
| author | 53hornet <53hornet@gmail.com> | 2019-02-02 23:33:15 -0500 | 
|---|---|---|
| committer | 53hornet <53hornet@gmail.com> | 2019-02-02 23:33:15 -0500 | 
| commit | db072ad4dc181eca5a1458656b130beb43f475bf (patch) | |
| tree | a3c03c7f5497cb70503e2486662fa85cfb53415a /hw1/src | |
| download | csci427-master.tar.xz csci427-master.zip | |
Diffstat (limited to 'hw1/src')
| -rw-r--r-- | hw1/src/vec3d.cpp | 329 | 
1 files changed, 329 insertions, 0 deletions
| diff --git a/hw1/src/vec3d.cpp b/hw1/src/vec3d.cpp new file mode 100644 index 0000000..6f55ef6 --- /dev/null +++ b/hw1/src/vec3d.cpp @@ -0,0 +1,329 @@ +/******************************************************************/ +/* 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 "vec3d.h" + +////////////////// +// Constructors // +////////////////// +vec3d::vec3d(vec3d::const_reference value) +{ +  x = y = z = value; +} + + +vec3d::vec3d(vec3d::const_reference x, vec3d::const_reference y, vec3d::const_reference z) +{ +  this->x = x; +  this->y = y; +  this->z = z; +} + + +vec3d::vec3d(const vec3d& v) +{ +  x = v.x; +  y = v.y; +  z = v.z; +} + + +//////////////// +// Inspectors // +//////////////// +vec3d::const_reference vec3d::operator[](size_t index) const +{ +  assert(index < size()); +  return data[index]; +} + + +vec3d::reference vec3d::operator[](size_t index) +{ +  assert(index < size()); +  return data[index]; +} + + +vec3d::iterator vec3d::begin(void) +{ +  return data; +} + + +vec3d::const_iterator vec3d::begin(void) const +{ +  return data; +} + + +vec3d::iterator vec3d::end(void) +{ +  return begin() + size(); +} + + +vec3d::const_iterator vec3d::end(void) const +{ +  return begin() + size(); +} + + +/////////////// +// Operators // +/////////////// +vec3d& vec3d::operator=(const vec3d& v) +{ +  _assign(v); +  return *this; +} + + +bool vec3d::operator==(const vec3d& v) const +{ +  return (x == v.x) && (y == v.y) && (z == v.z); +} + + +bool vec3d::operator!=(const vec3d& v) const +{ +  return (x != v.x) || (y != v.y) || (z != v.z); +} + + +vec3d vec3d::operator-(void) const +{ +  return vec3d(-x, -y, -z); +} + + +vec3d vec3d::operator+(const vec3d& v) const +{ +  return vec3d(x + v.x, y + v.y, z + v.z); +} + + +vec3d vec3d::operator-(const vec3d& v) const +{ +  // HW1: Implement this +  // Returns: difference of *this and v. +  // Modifies: nothing +  return vec3d(x - v.x, y - v.y, z - v.z); +} + + +vec3d vec3d::operator*(const vec3d& v) const +{ +  // HW1: Implement this +  // Returns: product of *this and v. +  // Modifies: nothing +  return vec3d(x * v.x, y * v.y, z * v.z); +} + + +vec3d vec3d::operator*(vec3d::const_reference scale) const +{ +  // HW1: Implement this +  // Returns: product of *this and scale. +  // Modifies: nothing +  return vec3d(x * scale, y * scale, z * scale); +} + + +vec3d vec3d::operator/(const vec3d& v) const +{ +  // HW1: Implement this +  // Returns: division of *this and v. +  // Modifies: nothing +  return vec3d(x / v.x, y / v.y, z / v.z); +} + + +vec3d vec3d::operator/(vec3d::const_reference scale) const +{ +  // HW1: Implement this +  // Returns: division of *this and scale. +  // Modifies: nothing +  return vec3d(x / scale, y / scale, z / scale); +} + + +vec3d& vec3d::operator+=(const vec3d& v) +{ +  x += v.x; +  y += v.y; +  z += v.z; +  return *this; +} + + +vec3d& vec3d::operator-=(const vec3d& v) +{ +  // HW1: Implement this +  // Returns: difference of *this and v. +  // Modifies: *this <= result +  x -= v.x; +  y -= v.y; +  z -= v.z; +  return *this; +} + + +vec3d& vec3d::operator*=(const vec3d& v) +{ +  // HW1: Implement this +  // Returns: product of *this and v. +  // Modifies: *this <= result +  x *= v.x; +  y *= v.y; +  z *= v.z; +  return *this; +} + + +vec3d& vec3d::operator*=(vec3d::const_reference scale) +{ +  // HW1: Implement this +  // Returns: product of *this and scale. +  // Modifies: *this <= result +  x *= scale; +  y *= scale; +  z *= scale; +  return *this; +} + + +vec3d& vec3d::operator/=(const vec3d& v) +{ +  // HW1: Implement this +  // Returns: division of *this and v. +  // Modifies: *this <= result +  x /= v.x; +  y /= v.y; +  z /= v.z; +  return *this; +} + + +vec3d& vec3d::operator/=(vec3d::const_reference scale) +{ +  // HW1: Implement this +  // Returns: division of *this and scale. +  // Modifies: *this <= result +  x /= scale; +  y /= scale; +  z /= scale; +  return *this; +} + + + +/////////////// +// Modifiers // +/////////////// +vec3d::value_type vec3d::dot(const vec3d& v) const +{ +  // HW1: Implement this +  // Returns: dot-product between *this and v (*this . v) +  // Modifies: nothing +  return x * v.x + y * v.y + z * v.z; +} + + +vec3d::value_type vec3d::squared_length(void) const +{ +  return dot(*this); +} + + +vec3d::value_type vec3d::length(void) const +{ +  return sqrt(squared_length()); +} + + +vec3d::value_type vec3d::squared_distance(const vec3d& v) const +{ +  return (*this - v).squared_length(); +} + + +vec3d::value_type vec3d::distance(const vec3d& v) const +{ +  return sqrt(squared_distance(v)); +} + + +vec3d vec3d::cross(const vec3d& v) const +{ +  // HW1: Implement this +  // Returns: cross-product of *this and v (*this x v). +  // Modifies: nothing +  return vec3d(y * v.z - z * v.y, +               z * v.x - x * v.z, +               x * v.y - y * v.x); +} + + +/////////////// +// Modifiers // +/////////////// +vec3d& vec3d::abs(void) +{ +  std::for_each(begin(), end(), [](reference val) +  { +    if(val < 0) val = -val; +  }); +  return *this; +} + + +vec3d& vec3d::clamp(vec3d::value_type lower, vec3d::value_type upper) +{ +  std::for_each(begin(), end(), [&](reference val) +  { +    if(val < lower) val = lower; +    else if(val > upper) val = upper; +  }); +  return *this; +} + + +vec3d& vec3d::normalize(void) +{ +  // HW1: Implement this +  // Return: normalized vector of *this +  // Modifies: this <= result +  value_type vec_len = length(); +  x /= vec_len; +  y /= vec_len; +  z /= vec_len; +  return *this; +} + + +///////////////////// +// Private Methods // +///////////////////// +void vec3d::_assign(const vec3d& v) +{ +  x = v.x; +  y = v.y; +  z = v.z; +} + + +void vec3d::_swap(vec3d& v) +{ +  std::swap(x, v.x); +  std::swap(y, v.y); +  std::swap(z, v.z); +} |