#pragma once
#ifndef VECTOR_H_
#define VECTOR_H_
#include<iostream>
namespace VECTOR {
class Vector {
public:
enum Mode{RECT,POL};
private:
double x;
double y;
double mag;
double ang;
Mode mode;
void set_mag();
void set_ang();
void set_x();
void set_y();
public:
Vector();
Vector(double n1, double n2, Mode form = RECT);
void reset(double n1, double n2, Mode form = RECT);
double xval()const { return x; }
double yval()const { return y; }
double magval()const { return mag; }
double angval()const { return ang; }
void polar_mode();
void rect_mode();
Vector operator+(const Vector& v)const;
Vector operator-(const Vector& v)const;
Vector operator-()const;
Vector operator*(double n)const;
friend Vector operator*(double n, const Vector&v);
friend std::ostream & operator<<(std::ostream& os, const Vector& v);
~Vector();
};
}
#endif
#include "stdafx.h"
#include "vector.h"
#include<cmath>
using namespace std;
namespace VECTOR {
const double Rad_to_deg = 45.0 / atan(1.0);
void Vector::set_mag() {
mag = sqrt(x*x + y*y);
}
void Vector::set_ang() {
if (x == 0.0&&y == 0.0)
ang = 0.0;
else
ang = atan2(y, x);
}
void Vector::set_x() {
x = mag*cos(ang);
}
void Vector::set_y() {
y = mag*sin(ang);
}
Vector::Vector() {
x = y = mag = ang = 0.0;
mode = RECT;
}
Vector::Vector(double n1, double n2, Mode form) {
mode = form;
if (mode == RECT) {
x = n1;
y = n2;
set_mag();
set_ang();
}
else if (form == POL) {
mag = n1;
ang = n2 / Rad_to_deg;
set_x();
set_y();
}
else {
cout << "Incorrect 3rd argument to Vector() --";
cout << "Vector set to 0\n";
x = y = mag = ang = 0.0;
mode = RECT;
}
}
void Vector::reset(double n1, double n2, Mode form) {
mode = form;
if (mode == RECT) {
x = n1;
y = n2;
set_mag();
set_ang();
}
else if (form == POL) {
mag = n1;
ang = n2 / Rad_to_deg;
set_x();
set_y();
}
else {
cout << "Incorrect 3rd argument to Vector() --";
cout << "Vector set to 0\n";
x = y = mag = ang = 0.0;
mode = RECT;
}
}
void Vector::polar_mode() {
mode = POL;
}
void Vector::rect_mode() {
mode = RECT;
}
Vector Vector::operator+(const Vector& v)const {
return Vector(x + v.x, y + v.y);
}
Vector Vector::operator-(const Vector& v)const {
return Vector(x - v.x, y - v.y);
}
Vector Vector::operator-()const {
return Vector(-x, -y);
}
Vector Vector::operator*(double n)const {
return Vector(n*x, n*y);
}
Vector operator*(double n, const Vector& a) {
return a*n;
}
std::ostream& operator<<(std::ostream& os, const Vector& v) {
if (v.mode == Vector::RECT)
os << "(x, y) = (" << v.x << ", " << v.y << ")";
else if (v.mode == Vector::POL)
os << "(m, a) = (" << v.mag << ", " << v.ang*Rad_to_deg << ")";
else
os << "Vector object mode is invalid";
return os;
}
Vector::~Vector(){}
}
#include "stdafx.h"
#include "vector.h"
#include<iostream>
#include<ctime>
#include<fstream>
int main()
{
using namespace std;
using VECTOR::Vector;
srand(time(0));
double direction;
Vector step;
Vector result(0.0, 0.0);
unsigned long steps = 0;
double target;
double dstep;
ofstream file;
file.open("history.txt");
if (!file.is_open()) {
cout << "Coudn't open the file!";
exit(EXIT_FAILURE);
}
cout << "Enter target distance (q to quit): ";
while (cin >> target) {
cout << "Enter step length: ";
if (!(cin >> dstep))
break;
file << "Target Distance: " << target << ", " << "Step Size: " << dstep << endl;
while (result.magval() < target) {
file<<steps<<": (x, y) = (" << result.xval() << ", " << result.yval() << ")\n";
direction = rand() % 360;
step.reset(dstep, direction, Vector::POL);
result = result + step;
steps++;
}
file<<steps<<": (x,y) = ("<<result.xval()<<", " << result.yval() << ")\n";
file << "After " << steps << " steps, the subject has the following location:\n";
file << "(x, y) = (" << result.xval() << ", " << result.yval() << ")" << "\nor\n";
file << "(m, a) = (" << result.magval() << ", " << result.angval() << ")\n";
file << "Average outward distance per step = " << result.magval() / steps << endl << endl;
}
cout << "Bye!\n";
cin.clear();
while (cin.get() != '\n')
continue;
return 0;
}