GVector.cpp
4.42 KB
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
/***************************************************************************
* GVector.cpp - vector class *
* ----------------------------------------------------------------------- *
* copyright : (C) 2006 by Jurgen Knodlseder *
* ----------------------------------------------------------------------- *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
/* __ Includes ___________________________________________________________ */
#include "GVector.hpp"
/***************************************************************************
* GVector constructor *
***************************************************************************/
GVector::GVector(unsigned num)
{
// Throw exception if requested vector length is zero
if (num == 0)
throw empty("GVector constructor");
// Allocate vector array. Throw exception if allocation failed
m_data = new double[num];
if (m_data == NULL)
throw mem_alloc("GVector constructor", num);
// Store vector size and initialize elements to 0.0
m_num = num;
for (unsigned i = 0; i < m_num; ++i)
m_data[i] = 0.0;
}
/***************************************************************************
* GVector destructor *
***************************************************************************/
GVector::~GVector()
{
// Deallocate only if memory has indeed been allocated
if (m_num > 0) {
m_num = 0;
delete[] m_data;
}
}
/***************************************************************************
* GVector output operator *
***************************************************************************/
ostream& operator<< (ostream& os, const GVector& v)
{
for (unsigned i = 0; i < v.m_num; ++i) {
os << v(i);
if (i != v.m_num-1)
os << ", ";
}
return os;
}
/***************************************************************************
* GVector cross product *
***************************************************************************/
GVector cross(const GVector &a, const GVector &b)
{
if (a.m_num != b.m_num)
throw GVector::dim_mismatch("GVector cross product", a.m_num, b.m_num);
if (a.m_num != 3)
throw GVector::bad_cross_dim(a.m_num);
GVector result(3);
result(0) = a.m_data[1]*b.m_data[2] - a.m_data[2]*b.m_data[1];
result(1) = a.m_data[2]*b.m_data[0] - a.m_data[0]*b.m_data[2];
result(2) = a.m_data[0]*b.m_data[1] - a.m_data[1]*b.m_data[0];
return result;
}
/***************************************************************************
* Class exception handlers *
***************************************************************************/
// Vector index out of range
GVector::out_of_range::out_of_range(string origin, unsigned inx,
unsigned elements)
{
m_origin = origin;
if (elements > 0) {
ostringstream s_inx;
ostringstream s_elements;
s_inx << inx;
s_elements << elements-1;
m_message = "Vector index (" + s_inx.str() + ") out of range [0," +
s_elements.str() + "]";
}
else {
m_message = "Empty vector";
}
}
// Vector dimensions differ
GVector::dim_mismatch::dim_mismatch(string origin, unsigned size1,
unsigned size2)
{
m_origin = origin;
ostringstream s_size1;
ostringstream s_size2;
s_size1 << size1;
s_size2 << size2;
m_message = "Vector dimensions differ (" + s_size1.str() + " <-> " +
s_size2.str() + ")";
}
// Invalid vector dimension for cross product
GVector::bad_cross_dim::bad_cross_dim(unsigned elements)
{
ostringstream s_elements;
s_elements << elements;
m_message = "Vector cross product only defined for 3 dimensions but vector size is " +
s_elements.str();
}