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 fvec_t &veca, const fvec_t &vecb){
37
   return fvec_t(veca.y*vecb.z-veca.z*vecb.y,
38
                 veca.z*vecb.x-veca.x*vecb.z,
39
                 veca.x*vecb.y-veca.y*vecb.x);};
40
fvec_t operator-(const float 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 float val){
43
   return fvec_t(veca.x-val,veca.y-val,veca.z-val);};
44
fvec_t operator-(const double 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 double val){
47
   return fvec_t(veca.x-val,veca.y-val,veca.z-val);};
48
fvec_t operator-(const int val,const fvec_t &veca){
49
   return fvec_t(-veca.x+val,-veca.y+val,-veca.z+val);};
50
fvec_t operator-(const fvec_t &veca,const int val){
51
   return fvec_t(veca.x-val,veca.y-val,veca.z-val);};
52
//fvec_t operator*(const fvec_t &veca){
53
//   return fvec_t(veca.x,veca.y,veca.z);};
54
float operator*(const fvec_t &veca, const fvec_t &vecb){
55
   return (veca.x*vecb.x+veca.y*vecb.y+veca.z*vecb.z);};
56
fvec_t operator*(const float 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 float val){
59
   return fvec_t(veca.x*val,veca.y*val,veca.z*val);};
60
fvec_t operator*(const double 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 double val){
63
   return fvec_t(veca.x*val,veca.y*val,veca.z*val);};
64
fvec_t operator*(const int val,const fvec_t &veca){
65
   return fvec_t(veca.x*val,veca.y*val,veca.z*val);};
66
fvec_t operator*(const fvec_t &veca,const int val){
67
   return fvec_t(veca.x*val,veca.y*val,veca.z*val);};
68
fvec_t cross(const fvec_t &a, const fvec_t &b){
69
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);};
70
float norm(const fvec_t &a){return sqrtf(a*a);};
71
72
73
template<typename T>
74
class vec_t
75
{
76
public:
77
  typedef T element_type;
78
    T x,y,z;
79
    //vec_t () : vec_t (0, 0, 0) {} // Oder std::nan
80
    vec_t (const T &x, const T &y, const T &z)
81
        : x(x), y(y), z(z) {}
82
83
    template<typename U>
84
    vec_t(const vec_t<U>& v) : x(v.x), y(v.y), z(v.z) {}
85
86
    vec_t operator+(){ return vec_t (x,y,z); }
87
88
    template<typename U>
89
    vec_t operator+(const vec_t<U>& w){
90
        return vec_t (x+w.x,y+w.y,z+w.z);}
91
92
   template<typename U>
93
    vec_t operator%(const vec_t<U>& w){
94
        return vec_t (y*w.z-z*w.y,
95
                    z*w.x-x*w.z,
96
                    x*w.y-y*w.x);}
97
98
    template<typename U>
99
    vec_t cross(const vec_t<U>& w){
100
      return vec_t (y*w.z-z*w.y,
101
                    z*w.x-x*w.z,
102
                    x*w.y-y*w.x); }
103
104
    T norm(){return( sqrt(x*x+y*y+z*z));}
105
106
    vec_t operator-(){return vec_t (-x,-y,-z);}
107
108
    template<typename U>
109
    vec_t operator-(const vec_t<U>& w){
110
      return vec_t (x-w.x,y-w.y,z-w.z);}
111
112
    T operator * (const vec_t &w) const
113
           { return x*w.x+y*w.y+z*w.z;}
114
};
115
116
/**********************************************************/
117
int main()
118
/**********************************************************/
119
{
120
121
122
fvec_t  ea (1,2,3);
123
fvec_t  eb {1,2,3};
124
125
fvec_t  ec=ea+eb;
126
127
printf("%f \r\n",norm(ec)-sqrt(2*2+4*4+6*6));
128
printf("%f \r\n",norm(+ea+fvec_t(1,2,3))-sqrt(2*2+4*4+6*6));
129
printf("%f \r\n",norm(+ea-fvec_t(1,2,3)));
130
ec=fvec_t(3,2,1);
131
printf("%f \r\n",norm(cross(ea,ec)-fvec_t(-4,8,-4)));
132
printf("%f \r\n",norm(ea%ec-fvec_t(-4,8,-4)));
133
printf("%f \r\n",norm(ea-fvec_t(1,2,3)));
134
printf("%f \r\n",norm(-fvec_t(1,2,3)+ea));
135
printf("%f \r\n",norm(1+ea-fvec_t(2,3,4)));
136
printf("%f \r\n",norm(ea-fvec_t(2,3,4)+1));
137
printf("%f \r\n",ea*ea-(1+4+9));
138
139
printf("xxxxxxxxxxxxxxxxxxxxxxxxxxx\r\n");
140
141
vec_t<double> ab(1,2,3);
142
vec_t<double> aa(1,2,3);
143
printf("%f \r\n",aa.norm()-sqrt(1*1+2*2+3*3));
144
printf("%f \r\n",vec_t<double>(1,2,3).norm()-sqrt(1*1+2*2+3*3));
145
printf("%f \r\n", (vec_t<double>(1,2,3)-aa).norm());
146
printf("%f \r\n", (aa-vec_t<double>(1,2,3)).norm());
147
printf("%f \r\n", (-vec_t<double>(1,2,3)+aa).norm());
148
printf("%f \r\n", (vec_t<double>(1,2,3)*vec_t<double>(1,2,3)-(1+4+9)));
149
150
vec_t<float> af(1,2,3);
151
printf("%f \r\n",af.norm()-sqrt(1*1+2*2+3*3));
152
printf("%f \r\n",vec_t<float>(1,2,3).norm()-sqrt(1*1+2*2+3*3));
153
printf("%f \r\n", (vec_t<float>(1,2,3)-aa).norm());
154
printf("%f \r\n", (aa-vec_t<float>(1,2,3)).norm());
155
printf("%f \r\n", (-vec_t<float>(1,2,3)+af).norm());
156
printf("%f \r\n", (vec_t<float>(1,2,3)*vec_t<float>(1,2,3)-(1+4+9)));
157
printf("%f \r\n",vec_t<int>(1,2,3).norm());
158
159
vec_t<float> ag(1,2,3);
160
vec_t<float> ah(3,2,1);
161
vec_t<float> ai = ag.cross(ah)-vec_t<float>(-4,8,-4);
162
vec_t<float> aj = ag%ah-vec_t<float>(-4,8,-4);
163
printf("%f %f\r\n",ai.norm(),aj.norm());
164
vec_t<float> ak = vec_t<float>(1,2,3).cross(vec_t<float>(3,2,1))-vec_t<float>(-4,8,-4);
165
printf("%f  \r\n",(vec_t<float>(1,2,3).cross(vec_t<float>(3,2,1))-vec_t<float>(-4,8,-4)).norm());
166
167
return 0;
168
}