1
/*****************************************************************************
2
TRAVIS - Trajectory Analyzer and Visualizer
3
http://www.travis-analyzer.de/
5
Copyright (c) 2009-2013 Martin Brehm
6
2012-2013 Martin Thomas
8
This file written by Martin Brehm.
10
This program is free software: you can redistribute it and/or modify
11
it under the terms of the GNU General Public License as published by
12
the Free Software Foundation, either version 3 of the License, or
13
(at your option) any later version.
15
This program is distributed in the hope that it will be useful,
16
but WITHOUT ANY WARRANTY; without even the implied warranty of
17
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18
GNU General Public License for more details.
20
You should have received a copy of the GNU General Public License
21
along with this program. If not, see <http://www.gnu.org/licenses/>.
22
*****************************************************************************/
25
#ifndef CXVECTOR3_DEFINED
26
#define CXVECTOR3_DEFINED
30
#include "backtrace.h"
31
#include "xdvector3.h"
34
class CxVector3 : public CxObject
37
inline CxVector3() { }
39
inline ~CxVector3() { }
41
/* CxVector3(CxVector3 v)
43
m_pData[0] = v.m_pData[0];
44
m_pData[1] = v.m_pData[1];
45
m_pData[2] = v.m_pData[2];
48
inline CxVector3(const CxVector3 &v) : CxObject()
51
m_pData[0] = v.m_pData[0];
52
m_pData[1] = v.m_pData[1];
53
m_pData[2] = v.m_pData[2];
57
inline CxVector3(const CxDVector3 &v)
60
m_pData[0] = (float)v.GetAt(0);
61
m_pData[1] = (float)v.GetAt(1);
62
m_pData[2] = (float)v.GetAt(2);
66
inline CxVector3(float f)
75
inline CxVector3(float x, float y, float z)
84
inline float &GetAt(int i)
87
mprintf("@ CxVector3::GetAt(int): %d...",i);
92
inline float &operator [] (int i)
95
mprintf("@ CxVector3::operator [] (int): %d\n",i);
100
inline float GetAt(int i) const
102
#ifdef DEBUG_CVECTOR3
103
mprintf("@ CxVector3::GetAt(int): %d...",i);
108
mprintf("CxVector3::GetAt(int): Boundary Error (%d/3)...",i);
115
inline float operator [] (int i) const
117
#ifdef DEBUG_CVECTOR3
118
mprintf("@ CxVector3::operator [] (int): %d\n",i);
123
inline CxVector3 operator + (const CxVector3 &v) const
125
#ifdef DEBUG_CVECTOR3
126
mprintf("@ CxVector3::operator + (CxVector3&)\n");
128
return CxVector3(m_pData[0]+v.m_pData[0],m_pData[1]+v.m_pData[1],m_pData[2]+v.m_pData[2]);
131
inline CxVector3 operator - (const CxVector3 &v) const
133
#ifdef DEBUG_CVECTOR3
134
mprintf("@ CxVector3::operator - (CxVector3&)\n");
136
return CxVector3(m_pData[0]-v.m_pData[0],m_pData[1]-v.m_pData[1],m_pData[2]-v.m_pData[2]);
139
inline CxVector3 operator * (const float &f) const
141
#ifdef DEBUG_CVECTOR3
142
mprintf("@ CxVector3::operator * (float)\n");
144
return CxVector3(m_pData[0]*f,m_pData[1]*f,m_pData[2]*f);
147
inline CxVector3 operator / (const float &f) const
149
#ifdef DEBUG_CVECTOR3
150
mprintf("@ CxVector3::operator / (float)\n");
152
return CxVector3(m_pData[0]/f,m_pData[1]/f,m_pData[2]/f);
155
inline void operator += (const CxVector3 &v)
158
#ifdef DEBUG_CVECTOR3
159
mprintf("@ CxVector3::operator += (CxVector3&)\n");
161
m_pData[0] += v.m_pData[0];
162
m_pData[1] += v.m_pData[1];
163
m_pData[2] += v.m_pData[2];
167
inline void operator -= (const CxVector3 &v)
170
#ifdef DEBUG_CVECTOR3
171
mprintf("@ CxVector3::operator -= (CxVector3&)\n");
173
m_pData[0] -= v.m_pData[0];
174
m_pData[1] -= v.m_pData[1];
175
m_pData[2] -= v.m_pData[2];
179
inline void operator *= (const float &f)
182
#ifdef DEBUG_CVECTOR3
183
mprintf("@ CxVector3::operator *= (float)\n");
191
inline void operator /= (const float &f)
194
#ifdef DEBUG_CVECTOR3
195
mprintf("@ CxVector3::operator /= (float)\n");
203
inline float GetLength() const
205
return (float)sqrt(m_pData[0]*m_pData[0]+m_pData[1]*m_pData[1]+m_pData[2]*m_pData[2]);
208
inline float GetLengthSqr() const
210
return (float)(m_pData[0]*m_pData[0]+m_pData[1]*m_pData[1]+m_pData[2]*m_pData[2]);
213
inline void Normalize()
224
void PointRoot(const CxVector3 &vec1, const CxVector3 &vec2, const CxVector3 &point);
233
float Dihedral(const CxVector3 &vec1, const CxVector3 &vec2, const CxVector3 &norm, bool absolute);
235
float Dihedral2(const CxVector3 &vec1, const CxVector3 &vec2, const CxVector3 &norm, bool absolute);
238
inline void Swap(CxVector3 &vec1, CxVector3 &vec2)
249
inline CxVector3 operator * (const float &f, const CxVector3 &v)
255
inline CxVector3 CrossP(const CxVector3 &vec1, const CxVector3 &vec2)
257
return CxVector3(vec1[1]*vec2[2] - vec1[2]*vec2[1],
258
vec1[2]*vec2[0] - vec1[0]*vec2[2],
259
vec1[0]*vec2[1] - vec1[1]*vec2[0]);
263
inline float DotP(const CxVector3 &vec1, const CxVector3 &vec2)
265
return vec1[0]*vec2[0]+vec1[1]*vec2[1]+vec1[2]*vec2[2];
269
inline float Angle(const CxVector3 &vec1, const CxVector3 &vec2)
273
t = DotP(vec1,vec2) / vec1.GetLength() / vec2.GetLength();
278
return (float)acos(t);
283
inline float Angle_Deg(const CxVector3 &vec1, const CxVector3 &vec2)
287
t = DotP(vec1,vec2) / vec1.GetLength() / vec2.GetLength();
294
return (float)fabs(t*180.0f / Pi);
298
inline float VecDist(const CxVector3 &vec1, const CxVector3 &vec2)
300
return (float)sqrt((vec1[0]-vec2[0])*(vec1[0]-vec2[0]) + (vec1[1]-vec2[1])*(vec1[1]-vec2[1]) + (vec1[2]-vec2[2])*(vec1[2]-vec2[2]));
304
CxVector3 PointFromRAD(CxVector3 r1, CxVector3 r2, CxVector3 r3, float r, float a, float d);
1
/*****************************************************************************
2
TRAVIS - Trajectory Analyzer and Visualizer
3
http://www.travis-analyzer.de/
5
Copyright (c) 2009-2014 Martin Brehm
6
2012-2014 Martin Thomas
8
This file written by Martin Brehm.
10
This program is free software: you can redistribute it and/or modify
11
it under the terms of the GNU General Public License as published by
12
the Free Software Foundation, either version 3 of the License, or
13
(at your option) any later version.
15
This program is distributed in the hope that it will be useful,
16
but WITHOUT ANY WARRANTY; without even the implied warranty of
17
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18
GNU General Public License for more details.
20
You should have received a copy of the GNU General Public License
21
along with this program. If not, see <http://www.gnu.org/licenses/>.
22
*****************************************************************************/
25
#ifndef CXVECTOR3_DEFINED
26
#define CXVECTOR3_DEFINED
30
#include "backtrace.h"
31
#include "xdvector3.h"
34
class CxVector3 : public CxObject
37
inline CxVector3() { }
39
inline ~CxVector3() { }
41
/* CxVector3(CxVector3 v)
43
m_pData[0] = v.m_pData[0];
44
m_pData[1] = v.m_pData[1];
45
m_pData[2] = v.m_pData[2];
48
inline CxVector3(const CxVector3 &v) : CxObject()
51
m_pData[0] = v.m_pData[0];
52
m_pData[1] = v.m_pData[1];
53
m_pData[2] = v.m_pData[2];
57
inline CxVector3(const CxDVector3 &v)
60
m_pData[0] = (float)v.GetAt(0);
61
m_pData[1] = (float)v.GetAt(1);
62
m_pData[2] = (float)v.GetAt(2);
66
inline CxVector3(float f)
75
inline CxVector3(float x, float y, float z)
84
inline float &GetAt(int i)
87
mprintf("@ CxVector3::GetAt(int): %d...",i);
92
inline float &operator [] (int i)
95
mprintf("@ CxVector3::operator [] (int): %d\n",i);
100
inline float GetAt(int i) const
102
#ifdef DEBUG_CVECTOR3
103
mprintf("@ CxVector3::GetAt(int): %d...",i);
108
mprintf("CxVector3::GetAt(int): Boundary Error (%d/3)...",i);
115
inline float operator [] (int i) const
117
#ifdef DEBUG_CVECTOR3
118
mprintf("@ CxVector3::operator [] (int): %d\n",i);
123
inline CxVector3 operator + (const CxVector3 &v) const
125
#ifdef DEBUG_CVECTOR3
126
mprintf("@ CxVector3::operator + (CxVector3&)\n");
128
return CxVector3(m_pData[0]+v.m_pData[0],m_pData[1]+v.m_pData[1],m_pData[2]+v.m_pData[2]);
131
inline CxVector3 operator - (const CxVector3 &v) const
133
#ifdef DEBUG_CVECTOR3
134
mprintf("@ CxVector3::operator - (CxVector3&)\n");
136
return CxVector3(m_pData[0]-v.m_pData[0],m_pData[1]-v.m_pData[1],m_pData[2]-v.m_pData[2]);
139
inline CxVector3 operator * (const float &f) const
141
#ifdef DEBUG_CVECTOR3
142
mprintf("@ CxVector3::operator * (float)\n");
144
return CxVector3(m_pData[0]*f,m_pData[1]*f,m_pData[2]*f);
147
inline CxVector3 operator / (const float &f) const
149
#ifdef DEBUG_CVECTOR3
150
mprintf("@ CxVector3::operator / (float)\n");
152
return CxVector3(m_pData[0]/f,m_pData[1]/f,m_pData[2]/f);
155
inline void operator += (const CxVector3 &v)
158
#ifdef DEBUG_CVECTOR3
159
mprintf("@ CxVector3::operator += (CxVector3&)\n");
161
m_pData[0] += v.m_pData[0];
162
m_pData[1] += v.m_pData[1];
163
m_pData[2] += v.m_pData[2];
167
inline void operator -= (const CxVector3 &v)
170
#ifdef DEBUG_CVECTOR3
171
mprintf("@ CxVector3::operator -= (CxVector3&)\n");
173
m_pData[0] -= v.m_pData[0];
174
m_pData[1] -= v.m_pData[1];
175
m_pData[2] -= v.m_pData[2];
179
inline void operator *= (const float &f)
182
#ifdef DEBUG_CVECTOR3
183
mprintf("@ CxVector3::operator *= (float)\n");
191
inline void operator /= (const float &f)
194
#ifdef DEBUG_CVECTOR3
195
mprintf("@ CxVector3::operator /= (float)\n");
203
inline float GetLength() const
205
return (float)sqrt(m_pData[0]*m_pData[0]+m_pData[1]*m_pData[1]+m_pData[2]*m_pData[2]);
208
inline float GetLengthSqr() const
210
return (float)(m_pData[0]*m_pData[0]+m_pData[1]*m_pData[1]+m_pData[2]*m_pData[2]);
213
inline void Normalize()
224
void PointRoot(const CxVector3 &vec1, const CxVector3 &vec2, const CxVector3 &point);
233
float Dihedral(const CxVector3 &vec1, const CxVector3 &vec2, const CxVector3 &norm, bool absolute);
235
float Dihedral2(const CxVector3 &vec1, const CxVector3 &vec2, const CxVector3 &norm, bool absolute);
238
inline void Swap(CxVector3 &vec1, CxVector3 &vec2)
249
inline CxVector3 operator * (const float &f, const CxVector3 &v)
255
inline CxVector3 CrossP(const CxVector3 &vec1, const CxVector3 &vec2)
257
return CxVector3(vec1[1]*vec2[2] - vec1[2]*vec2[1],
258
vec1[2]*vec2[0] - vec1[0]*vec2[2],
259
vec1[0]*vec2[1] - vec1[1]*vec2[0]);
263
inline float DotP(const CxVector3 &vec1, const CxVector3 &vec2)
265
return vec1[0]*vec2[0]+vec1[1]*vec2[1]+vec1[2]*vec2[2];
269
inline float Angle(const CxVector3 &vec1, const CxVector3 &vec2)
273
t = DotP(vec1,vec2) / vec1.GetLength() / vec2.GetLength();
278
return (float)acos(t);
283
inline float Angle_Deg(const CxVector3 &vec1, const CxVector3 &vec2)
287
t = DotP(vec1,vec2) / vec1.GetLength() / vec2.GetLength();
294
return (float)fabs(t*180.0f / Pi);
298
inline float VecDist(const CxVector3 &vec1, const CxVector3 &vec2)
300
return (float)sqrt((vec1[0]-vec2[0])*(vec1[0]-vec2[0]) + (vec1[1]-vec2[1])*(vec1[1]-vec2[1]) + (vec1[2]-vec2[2])*(vec1[2]-vec2[2]));
304
CxVector3 PointFromRAD(CxVector3 r1, CxVector3 r2, CxVector3 r3, float r, float a, float d);