| #ifndef _Vector3_h
|
| #define _Vector3_h
|
|
|
| #include <stdio.h>
|
| #include <iostream>
|
| #include <math.h>
|
| #include <array>
|
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| class Vector3
|
| {
|
|
|
| public:
|
|
|
|
|
|
|
|
|
|
|
|
|
| typedef float real;
|
|
|
|
|
|
|
|
|
| Vector3() {
|
| c[0] = c[1] = c[2] = 0;
|
| }
|
|
|
|
|
| Vector3(const real& nx, const real& ny, const real& nz) {
|
| c[0]=nx;
|
| c[1]=ny;
|
| c[2]=nz;
|
| }
|
|
|
|
|
| Vector3(const real x[3]) {
|
| c[0] = x[0];
|
| c[1] = x[1];
|
| c[2] = x[2];
|
| }
|
|
|
|
|
| Vector3(const double x[3]) {
|
| c[0] = (real)x[0];
|
| c[1] = (real)x[1];
|
| c[2] = (real)x[2];
|
| }
|
|
|
|
|
|
|
|
|
|
|
| const Vector3& position() const { return *this; }
|
|
|
|
|
| real x() const { return c[0]; }
|
|
|
| real y() const { return c[1]; }
|
|
|
| real z() const { return c[2]; }
|
|
|
|
|
|
|
| real x(const unsigned short coord) const {
|
| return c[coord-1];
|
| }
|
|
|
|
|
|
|
|
|
| bool isZero() const {
|
| return ((c[0] == 0) && (c[1] == 0) && (c[2] == 0));
|
| }
|
|
|
|
|
| void updateX(const real& x) {
|
| c[0]=x;
|
| }
|
|
|
| void updateY(const real& y) {
|
| c[1]=y;
|
| }
|
|
|
| void updateZ(const real& z) {
|
| c[2]=z;
|
| }
|
|
|
| void update(const Vector3& v) {
|
| c[0]=v[0];
|
| c[1]=v[1];
|
| c[2]=v[2];
|
| }
|
|
|
|
|
| real norm() const {
|
| return sqrt(norm2());
|
| }
|
|
|
|
|
| real norm2() const {
|
| return c[0]*c[0]+c[1]*c[1]+c[2]*c[2];
|
| }
|
|
|
|
|
| real dist(const Vector3& p) const {
|
| return sqrt(dist2(p));
|
| }
|
|
|
|
|
| real dist2(const Vector3& p) const{
|
| real d=c[0]-p.c[0];
|
| real s=d*d;
|
| d=c[1]-p.c[1];
|
| s+=d*d;
|
| d=c[2]-p.c[2];
|
| return s+d*d;
|
| }
|
|
|
|
|
|
|
| const real& operator[](const unsigned short coord) const{
|
| return c[coord];
|
| }
|
|
|
|
|
| real& operator[](const unsigned short coord){
|
| return c[coord];
|
| }
|
|
|
|
|
|
|
|
|
|
|
| Vector3 getPerpendicularVector() const {
|
| if (x() != 0) {
|
| return Vector3((-y()-z())/x(),1,1);
|
| } else if (y() != 0) {
|
| return Vector3(1,(-x()-z())/y(),1);
|
| } else if (z() != 0) {
|
| return Vector3(1,1,(-x()-y())/z());
|
| } else {
|
| return Vector3(0,0,0);
|
| }
|
| }
|
|
|
|
|
|
|
|
|
|
|
| Vector3 getUnitVector() const {
|
| return ((isZero()) ? *this : (*this/norm()));
|
| }
|
|
|
|
|
|
|
|
|
|
|
|
|
| bool operator==(const Vector3& v) const {
|
| return ((x() == v.x()) && (y() == v.y()) && (z() == v.z()));
|
| }
|
|
|
|
|
| friend Vector3 operator+(const Vector3& p1, const Vector3& p2) {
|
| return Vector3(p1.c[0]+p2.c[0], p1.c[1]+p2.c[1], p1.c[2]+p2.c[2]);
|
| }
|
|
|
|
|
| friend Vector3 operator-(const Vector3& p1, const Vector3& p2) {
|
| return Vector3(p1.c[0]-p2.c[0], p1.c[1]-p2.c[1], p1.c[2]-p2.c[2]);
|
| }
|
|
|
|
|
| friend Vector3 operator-(const Vector3& p) {
|
| return Vector3(-p.c[0], -p.c[1], -p.c[2]);
|
| }
|
|
|
|
|
| friend real operator*(const Vector3& p1, const Vector3& p2) {
|
| return p1.c[0]*p2.c[0]+p1.c[1]*p2.c[1]+p1.c[2]*p2.c[2];
|
| }
|
|
|
|
|
| friend Vector3 operator*(const Vector3& p, const real& m) {
|
| return Vector3(p.c[0]*m, p.c[1]*m, p.c[2]*m);
|
| }
|
|
|
|
|
|
|
| friend Vector3 operator*(const real& m, const Vector3& p) {
|
| return Vector3(p.c[0]*m, p.c[1]*m, p.c[2]*m);
|
| }
|
|
|
|
|
| friend Vector3 operator/(const Vector3& p, const real& m) {
|
| return Vector3(p.c[0]/m, p.c[1]/m, p.c[2]/m);
|
| }
|
|
|
|
|
| friend Vector3 operator&(const Vector3& p1, const Vector3& p2) {
|
| return Vector3(p1.c[1]*p2.c[2]-p1.c[2]*p2.c[1],
|
| p1.c[2]*p2.c[0]-p1.c[0]*p2.c[2],
|
| p1.c[0]*p2.c[1]-p1.c[1]*p2.c[0]);
|
| }
|
|
|
|
|
| friend real operator|(const Vector3& p1, const Vector3& p2) {
|
| return p1.dist(p2);
|
| }
|
|
|
|
|
| friend real operator^(const Vector3& p1, const Vector3& p2) {
|
| float angle=p1*p2/(p1.norm()*p2.norm());
|
| if(angle<-1)
|
| angle=-1;
|
| else
|
| if(angle>1)
|
| angle=1;
|
| return acos(angle);
|
| }
|
|
|
|
|
| Vector3& operator+=(const Vector3& p) {
|
| c[0]+=p.c[0]; c[1]+=p.c[1]; c[2]+=p.c[2];
|
| return *this;
|
| }
|
|
|
|
|
| Vector3& operator-=(const Vector3& p) {
|
| c[0]-=p.c[0]; c[1]-=p.c[1]; c[2]-=p.c[2];
|
| return *this;
|
| }
|
|
|
| Vector3& operator+=(const real& m) {
|
| c[0]+=m; c[1]+=m; c[2]+=m;
|
| return *this;
|
| }
|
|
|
| Vector3& operator-=(const real& m) {
|
| c[0]-=m; c[1]-=m; c[2]-=m;
|
| return *this;
|
| }
|
|
|
|
|
| Vector3& operator*=(const real& m) {
|
| c[0]*=m; c[1]*=m; c[2]*=m;
|
| return *this;
|
| }
|
|
|
|
|
| Vector3& operator/=(const real& m) {
|
| c[0]/=m; c[1]/=m; c[2]/=m;
|
| return *this;
|
| }
|
|
|
|
|
| friend std::ostream& operator<<(std::ostream& s, const Vector3& v) {
|
| return s << v.c[0] << ' ' << v.c[1] << ' ' << v.c[2];
|
| }
|
|
|
|
|
|
|
| friend std::istream& operator>>(std::istream& s, Vector3& v) {
|
| return s >> v.c[0] >> v.c[1] >> v.c[2];
|
| }
|
|
|
|
|
|
|
|
|
| void output(FILE* outputFile) const {
|
| fprintf(outputFile, "%f %f %f", c[0], c[1], c[2]);
|
| }
|
|
|
| private:
|
| std::array<real, 3> c;
|
| };
|
|
|
| #endif
|
|
|