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 | }
|