File: vector3.h

package info (click to toggle)
python-demgengeo 1.0-2
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 2,004 kB
  • ctags: 2,158
  • sloc: cpp: 12,532; python: 1,260; makefile: 281; sh: 92
file content (148 lines) | stat: -rw-r--r-- 4,947 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
/////////////////////////////////////////////////////////////
//                                                         //
// Copyright (c) 2007-2014 by The University of Queensland //
// Centre for Geoscience Computing                         //
// http://earth.uq.edu.au/centre-geoscience-computing      //
//                                                         //
// Primary Business: Brisbane, Queensland, Australia       //
// Licensed under the Open Software License version 3.0    //
// http://www.opensource.org/licenses/osl-3.0.php          //
//                                                         //
/////////////////////////////////////////////////////////////

#ifndef __VECTOR3_H
#define __VECTOR3_H

#define DO_INLINE_VECTOR3 1

#if DO_INLINE_VECTOR3 >= 1
#define VECTOR3_INLINE inline
#else
#define VECTOR3_INLINE
#endif

#include <iostream>
#include <math.h>
#include <string>

//#include "Foundation/Error.h"

using std::ostream;
using std::istream;
using std::string;

//class Matrix3;

/*
class VecErr:public MError
{
 public:
  VecErr(const string&);
  virtual ~VecErr(){};
};
*/

struct VDMulVadd;
struct VDMul;

class Vector3
{
protected:
  double data[3];

public:
  static const Vector3 ZERO; //! The zero vector.
  // constructors
  VECTOR3_INLINE Vector3();
  VECTOR3_INLINE explicit Vector3(double s);
  VECTOR3_INLINE Vector3(double,double,double);
  VECTOR3_INLINE Vector3(const Vector3&);

  // vec-vec operators
  VECTOR3_INLINE Vector3& operator=(const Vector3&);
  VECTOR3_INLINE Vector3& operator=(double s);
  VECTOR3_INLINE Vector3& operator-=(const Vector3&);
  VECTOR3_INLINE Vector3& operator+=(const Vector3&);
  VECTOR3_INLINE Vector3 operator+(const Vector3&) const;
  VECTOR3_INLINE Vector3 operator-(const Vector3&) const;
//wangyc added !
//  VECTOR3_INLINE Vector3 operator*(const Matrix3 &m) const;
  VECTOR3_INLINE double operator*(const Vector3&) const; 
  VECTOR3_INLINE Vector3 operator-() const;
  
  // vec-dbl ops
  VECTOR3_INLINE Vector3 operator*(double) const;
  VECTOR3_INLINE Vector3& operator*=(double);
  VECTOR3_INLINE Vector3 operator/(double) const;
  VECTOR3_INLINE Vector3 operator-(double) const;
  VECTOR3_INLINE Vector3 operator+(double) const;
  VECTOR3_INLINE Vector3& operator+=(double);
  VECTOR3_INLINE Vector3& operator-=(double);

// wangyc added !
  VECTOR3_INLINE Vector3& operator/=(double);
  VECTOR3_INLINE double norm() const;
  VECTOR3_INLINE double wnorm(double,double,double) const;
  VECTOR3_INLINE double norm2() const;
  VECTOR3_INLINE double wnorm2(double,double,double) const;
  VECTOR3_INLINE Vector3 unit() const;
//  VECTOR3_INLINE Vector3 unit_s() const; //safe version (throw exceptions)
  VECTOR3_INLINE double max() const;
  VECTOR3_INLINE double min() const;

  VECTOR3_INLINE Vector3 rotate(const Vector3 &axis, const Vector3 &axisPt) const;

  VECTOR3_INLINE bool operator==(const Vector3&) const;
  VECTOR3_INLINE bool operator!=(const Vector3&) const;

  VECTOR3_INLINE friend Vector3 cmax(const Vector3&,const Vector3&);
  VECTOR3_INLINE friend Vector3 cmin(const Vector3&,const Vector3&);

  VECTOR3_INLINE friend Vector3 cross(const Vector3&,const Vector3&);
  VECTOR3_INLINE friend double dot(const Vector3&,const Vector3&); 
  VECTOR3_INLINE friend Vector3 operator*(double,const Vector3&);

  //n+1-ary operators
  VECTOR3_INLINE void mul_add_and_assign(const Vector3*,const Vector3*,const double&);
  VECTOR3_INLINE void mul_and_assign(const Vector3*,const double&);

  VECTOR3_INLINE Vector3(const VDMulVadd&);
  VECTOR3_INLINE Vector3& operator=(const VDMulVadd&);

  VECTOR3_INLINE Vector3(const VDMul&);
  VECTOR3_INLINE Vector3& operator=(const VDMul&);

  //access stuff
  VECTOR3_INLINE void set_x(double x) {data[0] = x;}
  VECTOR3_INLINE void set_y(double y) {data[1] = y;}
  VECTOR3_INLINE void set_z(double z) {data[2] = z;}
//  void set_xyz(double x, double y, double z)
//  { data[0] = x; data[1] = y; data[2] = z;}
  
  VECTOR3_INLINE double& X() {return data[0];};
  VECTOR3_INLINE double& Y() {return data[1];};
  VECTOR3_INLINE double& Z() {return data[2];};
  VECTOR3_INLINE double x() const {return data[0];};
  VECTOR3_INLINE double y() const {return data[1];};
  VECTOR3_INLINE double z() const {return data[2];};
  VECTOR3_INLINE const double &operator[](int i) const {return data[i];}
  VECTOR3_INLINE double& operator[](int i) {return data[i];}

  // in/output
  VECTOR3_INLINE friend ostream& operator << (ostream&,const Vector3&);
  VECTOR3_INLINE friend istream& operator >> (istream&,Vector3&);

  // comparison -> enable to use of Vector3 as key in STL map and set
  bool operator<(const Vector3&) const; 

//  friend class Matrix3;
};

VECTOR3_INLINE Vector3 comp_max(const Vector3&,const Vector3&); //!< per component maximum
VECTOR3_INLINE Vector3 comp_min(const Vector3&,const Vector3&); //!< per component minimum

#if DO_INLINE_VECTOR3 >= 1
#include "vector3.hh"
#endif

#endif // __VECTOR3_H