main.cpp


1
#include <iostream>
2
#include <math.h>
3
using namespace std;
4
5
class fvec_t
6
{
7
public:
8
    float x,y,z;
9
    fvec_t(){x=0;y=0;z=0;}
10
    fvec_t(float x1,float y1,float z1)
11
       {x=x1;y=y1;z=z1;}
12
    fvec_t(const fvec_t &vec){
13
       x=vec.x;y=vec.y;z=vec.z;}
14
};
15
16
fvec_t operator+(const fvec_t &veca){
17
   return fvec_t(veca.x,veca.y,veca.z);};
18
fvec_t operator+(const fvec_t &veca, const fvec_t &vecb){
19
   return fvec_t(veca.x+vecb.x,veca.y+vecb.y,veca.z+vecb.z);};
20
fvec_t operator+(const float val,const fvec_t &veca){
21
   return fvec_t(veca.x+val,veca.y+val,veca.z+val);};
22
fvec_t operator+(const fvec_t &veca,const float val){
23
   return fvec_t(veca.x+val,veca.y+val,veca.z+val);};
24
fvec_t operator+(const double val,const fvec_t &veca){
25
   return fvec_t(veca.x+val,veca.y+val,veca.z+val);};
26
fvec_t operator+(const fvec_t &veca,const double val){
27
   return fvec_t(veca.x+val,veca.y+val,veca.z+val);};
28
fvec_t operator+(const int val,const fvec_t &veca){
29
   return fvec_t(veca.x+val,veca.y+val,veca.z+val);};
30
fvec_t operator+(const fvec_t &veca,const int val){
31
   return fvec_t(veca.x+val,veca.y+val,veca.z+val);};
32
fvec_t operator-(const fvec_t &veca){
33
   return fvec_t(-veca.x,-veca.y,-veca.z);};
34
fvec_t operator-(const fvec_t &veca, const fvec_t &vecb){
35
   return fvec_t(veca.x-vecb.x,veca.y-vecb.y,veca.z-vecb.z);};
36
fvec_t operator-(const float val,const fvec_t &veca){
37
   return fvec_t(-veca.x+val,-veca.y+val,-veca.z+val);};
38
fvec_t operator-(const fvec_t &veca,const float val){
39
   return fvec_t(veca.x-val,veca.y-val,veca.z-val);};
40
fvec_t operator-(const double val,const fvec_t &veca){
41
   return fvec_t(-veca.x+val,-veca.y+val,-veca.z+val);};
42
fvec_t operator-(const fvec_t &veca,const double val){
43
   return fvec_t(veca.x-val,veca.y-val,veca.z-val);};
44
fvec_t operator-(const int val,const fvec_t &veca){
45
   return fvec_t(-veca.x+val,-veca.y+val,-veca.z+val);};
46
fvec_t operator-(const fvec_t &veca,const int val){
47
   return fvec_t(veca.x-val,veca.y-val,veca.z-val);};
48
//fvec_t operator*(const fvec_t &veca){
49
//   return fvec_t(veca.x,veca.y,veca.z);};
50
float operator*(const fvec_t &veca, const fvec_t &vecb){
51
   return (veca.x*vecb.x+veca.y*vecb.y+veca.z*vecb.z);};
52
fvec_t operator*(const float val,const fvec_t &veca){
53
   return fvec_t(veca.x*val,veca.y*val,veca.z*val);};
54
fvec_t operator*(const fvec_t &veca,const float val){
55
   return fvec_t(veca.x*val,veca.y*val,veca.z*val);};
56
fvec_t operator*(const double val,const fvec_t &veca){
57
   return fvec_t(veca.x*val,veca.y*val,veca.z*val);};
58
fvec_t operator*(const fvec_t &veca,const double val){
59
   return fvec_t(veca.x*val,veca.y*val,veca.z*val);};
60
fvec_t operator*(const int val,const fvec_t &veca){
61
   return fvec_t(veca.x*val,veca.y*val,veca.z*val);};
62
fvec_t operator*(const fvec_t &veca,const int val){
63
   return fvec_t(veca.x*val,veca.y*val,veca.z*val);};
64
fvec_t cross(const fvec_t &a, const fvec_t &b){
65
return fvec_t(a.y*b.z-a.z*b.y,a.z*b.x-a.x*b.z,a.x*b.y-a.y*b.x);};
66
float norm(const fvec_t &a){return sqrtf(a*a);};
67
68
69
template<typename T>
70
class vec_t
71
{
72
public:
73
  typedef T element_type;
74
    T x,y,z;
75
    //vec_t () : vec_t (0, 0, 0) {} // Oder std::nan
76
    vec_t (const T &x, const T &y, const T &z)
77
        : x(x), y(y), z(z) {}
78
79
    template<typename U>
80
    vec_t(const vec_t<U>& v) : x(v.x), y(v.y), z(v.z) {}
81
82
    vec_t operator+(){ return vec_t (x,y,z); }
83
84
    template<typename U>
85
    vec_t operator+(const vec_t<U>& w){
86
        return vec_t (x+w.x,y+w.y,z+w.z);}
87
88
    template<typename U>
89
    vec_t cross(const vec_t<U>& w){
90
      return vec_t (y*w.z-z*w.y,
91
                    z*w.x-x*w.z,
92
                    x*w.y-y*w.x); }
93
94
    T norm(){return( sqrt(x*x+y*y+z*z));}
95
96
    vec_t operator-(){return vec_t (-x,-y,-z);}
97
98
    template<typename U>
99
    vec_t operator-(const vec_t<U>& w){
100
      return vec_t (x-w.x,y-w.y,z-w.z);}
101
102
    T operator * (const vec_t &w) const
103
           { return x*w.x+y*w.y+z*w.z;}
104
};
105
106
/**********************************************************/
107
int main()
108
/**********************************************************/
109
{
110
111
112
fvec_t  ea (1,2,3);
113
fvec_t  eb {1,2,3};
114
115
fvec_t  ec=ea+eb;
116
117
printf("%f \r\n",norm(ec)-sqrt(2*2+4*4+6*6));
118
printf("%f \r\n",norm(+ea+fvec_t(1,2,3))-sqrt(2*2+4*4+6*6));
119
printf("%f \r\n",norm(+ea-fvec_t(1,2,3)));
120
ec=fvec_t(3,2,1);
121
printf("%f \r\n",norm(cross(ea,ec)-fvec_t(-4,8,-4)));
122
printf("%f \r\n",norm(ea-fvec_t(1,2,3)));
123
printf("%f \r\n",norm(-fvec_t(1,2,3)+ea));
124
printf("%f \r\n",norm(1+ea-fvec_t(2,3,4)));
125
printf("%f \r\n",norm(ea-fvec_t(2,3,4)+1));
126
printf("%f \r\n",ea*ea-(1+4+9));
127
128
printf("xxxxxxxxxxxxxxxxxxxxxxxxxxx\r\n");
129
130
vec_t<double> ab(1,2,3);
131
vec_t<double> aa(1,2,3);
132
printf("%f \r\n",aa.norm()-sqrt(1*1+2*2+3*3));
133
printf("%f \r\n",vec_t<double>(1,2,3).norm()-sqrt(1*1+2*2+3*3));
134
printf("%f \r\n", (vec_t<double>(1,2,3)-aa).norm());
135
printf("%f \r\n", (aa-vec_t<double>(1,2,3)).norm());
136
printf("%f \r\n", (-vec_t<double>(1,2,3)+aa).norm());
137
printf("%f \r\n", (vec_t<double>(1,2,3)*vec_t<double>(1,2,3)-(1+4+9)));
138
139
vec_t<float> af(1,2,3);
140
printf("%f \r\n",af.norm()-sqrt(1*1+2*2+3*3));
141
printf("%f \r\n",vec_t<float>(1,2,3).norm()-sqrt(1*1+2*2+3*3));
142
printf("%f \r\n", (vec_t<float>(1,2,3)-aa).norm());
143
printf("%f \r\n", (aa-vec_t<float>(1,2,3)).norm());
144
printf("%f \r\n", (-vec_t<float>(1,2,3)+af).norm());
145
printf("%f \r\n", (vec_t<float>(1,2,3)*vec_t<float>(1,2,3)-(1+4+9)));
146
printf("%f \r\n",vec_t<int>(1,2,3).norm());
147
148
vec_t<float> ag(1,2,3);
149
vec_t<float> ah(3,2,1);
150
vec_t<float> ai = ag.cross(ah)-vec_t<float>(-4,8,-4);
151
printf("%f \r\n",ai.norm());
152
vec_t<float> ak = vec_t<float>(1,2,3).cross(vec_t<float>(3,2,1))-vec_t<float>(-4,8,-4);
153
printf("%f  \r\n",(vec_t<float>(1,2,3).cross(vec_t<float>(3,2,1))-vec_t<float>(-4,8,-4)).norm());
154
155
return 0;
156
}