versor  3.0
C++11 library for Geometric algebra
vsr_simplex.h
1 /*
2  * =====================================================================================
3  *
4  * Filename: vsr_simplex.h
5  *
6  * Description:
7  *
8  * Version: 1.0
9  * Created: 06/03/2014 12:17:02
10  * Revision: none
11  * Compiler: gcc
12  *
13  * Author: Pablo Colapinto (), gmail -> wolftype
14  * Organization:
15  *
16  * =====================================================================================
17  */
18 
19 #ifndef vsr_simplex_INC
20 #define vsr_simplex_INC
21 
22 #include "vsr.h"
23 
24 namespace vsr{
25 
26 
27 
28 template<int N>
29 struct Simplex {
30 
31  struct Edge{
32  int a, b;
33  Edge(int _a, int _b) : a(_a), b(_b){}
34  // void print() { printf("%d, %d\n", a, b);}
35  };
36 
37  struct Face{
38  int a,b,c;
39  Face(int _a, int _b, int _c) : a(_a), b(_b), c(_c) {}
40  };
41 
42  typedef NEVec<N> Vec;
43  typedef NEBiv<N> Biv;
44 
45  //temporary higher dimensional elements for coordinate init
46  //this will be projected out after rotation
47  typedef NEVec<N+1> TVec;
48 
49  vector<Vec> verts;
50  vector<TVec> roots;
51  vector<Edge> edges;
52  vector<Face> faces;
53 
54  Simplex() { init(); }
55 
56  TVec vec;
57 
58  TVec doBary(){
59  TVec center;
60  for (auto i : roots){
61  center += i;
62  }
63  center /= (N+1);
64  return center;
65  }
66 
67  Vec bary(){
68  Vec center;
69  for (auto i : verts){
70  center += i;
71  }
72  center /= (N+1);
73  return center;
74  }
75 
76 
77  void doRot(){
78  //Rotate out of extra dimension
79  auto rot = Gen::ratio(doBary().unit(), vec);
80  using B = NE<>::template e<N+1>;// NE<>::e<N+1>;
81  using SubRot = decltype( doBary().unit() * B() );
82  for(auto& i : roots){
83  i = i.sp( SubRot(rot) );
84  }
85  //And project down by flattening
86  for(auto& i : roots){
87  verts.push_back(i);
88  }
89  //Rotate last to last
90  Vec tvec; tvec[N-1] = 1;
91  auto nrot = Gen::ratio( verts.back().unit(), tvec );
92  using B2 = NE<>::template e<N>;// NE<>::e<N>;
93  using SubRot2 = decltype( verts.back().unit() * B2() );
94 
95  for(auto& i : verts){
96  i = i.sp( SubRot2(nrot) );
97  }
98 
99  }
100 
101  void init(){
102  TVec center;
103  //Roots in N+1 space
104  for (int i=0;i<N+1;++i){
105  TVec t; t[i] = 1;
106  center +=t;
107  roots.push_back( t );
108  //Edges
109  for (int j=i+1;j<N+1;++j){
110  edges.push_back( Edge(i,j) );
111  //Faces
112  bool bSwitch = false;
113  for (int k=j+1;k<N+1;++k){
114  faces.push_back( bSwitch ? Face(i, j, k) : Face(i, k, j) );
115  bSwitch = !bSwitch;
116  }
117  }
118  }
119 
120  center /= (N+1);
121  vec[N] = 1;
122  doRot();
123 
124  }
125 
126  Biv biv(int which, float amt = 1.0) {
127  return (verts[N] ^ verts[int(which)%N]) * amt;
128  }
129 
130  void spin( const Biv& biv){
131  for (auto& i : verts){
132  i = i.sp( Gen::rot( biv ) );
133  }
134  }
135 
136  void spin(int which, float amt = 1.0){
137  spin( biv(which,amt) );
138  }
139 
140  vector<NEVec<3>> project (float dist, bool bOrtho=false) const{
141  vector< NEVec<3> > proj;
142  for (auto i : verts){
143  auto tmp = Proj<N>::Call(dist, i);
144  NEVec<3> tmp2 = NEVec<3>(i);//Proj<N>::Ortho3(i);
145  proj.push_back( bOrtho ? tmp2 : tmp );
146  }
147  return proj;
148  }
149 
150 
151 
152 };
153 
154 } // vsr::
155 
156 #endif /* ----- #ifndef vsr_simplex_INC ----- */
Definition: vsr_simplex.h:29
Generic Geometric Number Types (templated on an algebra and a basis )
Definition: vsr_algebra.h:69
static Rot rot(const Biv &b)
vsr::cga::Rotor from vsr::cga::Bivector
Definition: vsr_simplex.h:37
Definition: vsr_simplex.h:31
static Rot ratio(const Vec &v, const Vec &v2)
vsr::cga::Rotor that takes one vec to another
the versor library namespace
Definition: vsr_algebra.h:29