00001
00002
00003
00004
00005
00006
00007
00008 #ifndef IMPALGEBRA_VECTOR_3D_H
00009 #define IMPALGEBRA_VECTOR_3D_H
00010
00011 #include <IMP/base_types.h>
00012 #include <IMP/macros.h>
00013 #include <IMP/exception.h>
00014
00015 #include <numeric>
00016 #include <cmath>
00017
00018 #include "VectorD.h"
00019
00020 IMPALGEBRA_BEGIN_NAMESPACE
00021
00022 IMPALGEBRA_EXPORT_TEMPLATE(VectorD<3>);
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 inline VectorD<3> get_vector_product(const VectorD<3>& p1,
00034 const VectorD<3>& p2) {
00035 return VectorD<3>(p1[1]*p2[2]-p1[2]*p2[1],
00036 p1[2]*p2[0]-p1[0]*p2[2],
00037 p1[0]*p2[1]-p1[1]*p2[0]);
00038 }
00039
00040
00041
00042
00043 inline VectorD<3> get_orthogonal_vector(const VectorD<3> &v) {
00044 if (v[0] != 0) {
00045 return VectorD<3>((-v[1]-v[2])/v[0],1,1);
00046 } else if (v[1] != 0.0) {
00047 return VectorD<3>(1,(-v[0]-v[2])/v[1],1);
00048 } else if (v[2] != 0.0) {
00049 return VectorD<3>(1,1,(-v[0]-v[1])/v[2]);
00050 } else {
00051 return VectorD<3>(0.0,0.0,0.0);
00052 }
00053 }
00054
00055
00056
00057
00058 inline VectorD<3> get_centroid(const std::vector<VectorD<3> > &ps) {
00059 return std::accumulate(ps.begin(), ps.end(),
00060 get_zero_vector_d<3>())/ps.size();
00061 }
00062
00063
00064
00065 inline const VectorD<3> &get_geometry(const VectorD<3> &v) {
00066 return v;
00067 }
00068
00069 IMPALGEBRA_END_NAMESPACE
00070
00071 #endif