You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
198 lines
3.8 KiB
C++
198 lines
3.8 KiB
C++
#include "Vector3f.h"
|
|
|
|
|
|
using namespace std;
|
|
|
|
Vector3f::Vector3f() {
|
|
x = 0.0;
|
|
y = 0.0;
|
|
z = 0.0;
|
|
}
|
|
|
|
Vector3f::Vector3f(float x, float y, float z) {
|
|
this->x = x;
|
|
this->y = y;
|
|
this->z = z;
|
|
}
|
|
|
|
Vector3f::Vector3f(const Vector3f& other) {
|
|
x = other.x;
|
|
y = other.y;
|
|
z = other.z;
|
|
}
|
|
|
|
Vector3f::Vector3f(const Vector& other) {
|
|
x = other.x;
|
|
y = other.y;
|
|
z = 0.0;
|
|
}
|
|
|
|
Vector3f::~Vector3f() {
|
|
}
|
|
|
|
float Vector3f::getX() const {
|
|
return x;
|
|
}
|
|
|
|
void Vector3f::setX(float x) {
|
|
this->x = x;
|
|
}
|
|
|
|
float Vector3f::getY() const {
|
|
return y;
|
|
}
|
|
|
|
void Vector3f::setY(float y) {
|
|
this->y = y;
|
|
}
|
|
|
|
float Vector3f::getZ() const {
|
|
return z;
|
|
}
|
|
|
|
void Vector3f::setZ(float z) {
|
|
this->z = z;
|
|
}
|
|
|
|
float Vector3f::operator[](const int index) const {
|
|
float val=0.0;
|
|
switch (index) {
|
|
case 0: val = x;
|
|
break;
|
|
case 1: val = y;
|
|
break;
|
|
case 2: val = z;
|
|
break;
|
|
}
|
|
return val;
|
|
}
|
|
|
|
Vector3f Vector3f::operator+(const Vector3f& other) const {
|
|
return Vector3f(x + other.x, y + other.y, z + other.z);
|
|
}
|
|
|
|
Vector3f Vector3f::operator-(const Vector3f& other) const {
|
|
return Vector3f(x - other.x, y - other.y, z - other.z);
|
|
}
|
|
|
|
Vector3f Vector3f::operator-() const {
|
|
return Vector3f() - * this;
|
|
}
|
|
|
|
Vector3f Vector3f::operator*(const Vector3f& other) const {
|
|
return Vector3f(x * other.x, y * other.y, z * other.z);
|
|
}
|
|
|
|
Vector3f Vector3f::operator/(const Vector3f& other) const {
|
|
return Vector3f(x / other.x, y / other.y, z / other.z);
|
|
}
|
|
|
|
bool Vector3f::operator==(const Vector3f& other) const {
|
|
return x == other.x && y == other.y && z == other.z;
|
|
}
|
|
|
|
Vector3f Vector3f::operator/(float factor) const {
|
|
return Vector3f(x / factor, y / factor, z / factor);
|
|
}
|
|
|
|
Vector3f Vector3f::operator+(float factor) const {
|
|
return Vector3f(x + factor, y + factor, z + factor);
|
|
}
|
|
|
|
Vector3f Vector3f::operator%(float factor) const {
|
|
return Vector3f(fmod(x, factor), fmod(y, factor), fmod(z, factor));
|
|
}
|
|
|
|
Vector3f Vector3f::operator*(float factor) const {
|
|
return Vector3f(x * factor, y * factor, z * factor);
|
|
}
|
|
|
|
Vector3f Vector3f::operator+=(const Vector3f& other) {
|
|
x += other.x;
|
|
y += other.y;
|
|
z += other.z;
|
|
|
|
return *this;
|
|
}
|
|
|
|
Vector3f Vector3f::operator+=(float factor) {
|
|
x += factor;
|
|
y += factor;
|
|
z += factor;
|
|
|
|
return *this;
|
|
}
|
|
|
|
Vector3f Vector3f::operator-=(const Vector3f& other) {
|
|
x -= other.x;
|
|
y -= other.y;
|
|
z -= other.z;
|
|
|
|
return *this;
|
|
}
|
|
|
|
Vector3f Vector3f::operator-=(float factor) {
|
|
x -= factor;
|
|
y -= factor;
|
|
z -= factor;
|
|
|
|
return *this;
|
|
}
|
|
|
|
Vector3f Vector3f::operator/=(float factor) {
|
|
x /= factor;
|
|
y /= factor;
|
|
z /= factor;
|
|
|
|
return *this;
|
|
}
|
|
|
|
|
|
float Vector3f::innerProduct(const Vector3f& other) const {
|
|
return x * other.x + y * other.y + z * other.z;
|
|
}
|
|
|
|
Vector3f Vector3f::crossProduct(const Vector3f& other) const {
|
|
Vector3f aux;
|
|
|
|
aux.x = this->y * other.z - this->z * other.y;
|
|
aux.y = this->z * other.x - this->x * other.z;
|
|
aux.z = this->x * other.y - this->y * other.x;
|
|
|
|
return aux;
|
|
}
|
|
|
|
float Vector3f::length() const {
|
|
return sqrt(x * x + y * y + z * z);
|
|
}
|
|
|
|
|
|
Vector3f Vector3f::normalize(float len) const {
|
|
return (*this) * (len / this->length());
|
|
}
|
|
|
|
Vector3f Vector3f::toCartesian() const {
|
|
// x = distance
|
|
// y = theta
|
|
// z = phi
|
|
return Vector3f(x * Cos(z) * Cos(y), x * Cos(z) * Sin(y), x * Sin(z));
|
|
}
|
|
|
|
Vector3f Vector3f::toPolar() const {
|
|
return Vector3f(this->length(), // distance
|
|
ATan2(y, x), // theta
|
|
ATan2(z, sqrt(x * x + y * y))); // phi
|
|
}
|
|
|
|
float Vector3f::dist(const Vector3f &other) const {
|
|
return (*this -other).length();
|
|
}
|
|
|
|
Vector Vector3f::to2d() const {
|
|
return Vector(x, y);
|
|
}
|
|
|
|
Vector3f Vector3f::determineMidpoint(Vector3f a, Vector3f b) {
|
|
return (a+b)/2; /* m.abreu@2020 */
|
|
}
|