Commit 0d0ef1a95d99ca400df0ccbad7c68b0f373e806e

Authored by David Mayerich
1 parent 32ba91f2

Adapted classes to work with the new stim::cylinder class.

stim/biomodels/centerline.h
@@ -57,10 +57,14 @@ protected: @@ -57,10 +57,14 @@ protected:
57 ///finds the index of the point closest to the length l on the lower bound. 57 ///finds the index of the point closest to the length l on the lower bound.
58 ///binary search. 58 ///binary search.
59 size_t findIdx(T l) { 59 size_t findIdx(T l) {
60 - size_t i = L.size() / 2; 60 + for (size_t i = 1; i < L.size(); i++) { //for each point in the centerline
  61 + if (L[i] > l) return i - 1; //if we have passed the desired length value, return i-1
  62 + }
  63 + return L.size() - 1;
  64 + /*size_t i = L.size() / 2;
61 size_t max = L.size() - 1; 65 size_t max = L.size() - 1;
62 size_t min = 0; 66 size_t min = 0;
63 - while (i > 0 && i < L.size() - 1){ 67 + while (i < L.size() - 1){
64 if (l < L[i]) { 68 if (l < L[i]) {
65 max = i; 69 max = i;
66 i = min + (max - min) / 2; 70 i = min + (max - min) / 2;
@@ -73,7 +77,7 @@ protected: @@ -73,7 +77,7 @@ protected:
73 i = min + (max - min) / 2; 77 i = min + (max - min) / 2;
74 } 78 }
75 } 79 }
76 - return i; 80 + return i;*/
77 } 81 }
78 82
79 ///Returns a position vector at the given length into the fiber (based on the pvalue). 83 ///Returns a position vector at the given length into the fiber (based on the pvalue).
@@ -118,6 +122,10 @@ public: @@ -118,6 +122,10 @@ public:
118 return p(l, idx); 122 return p(l, idx);
119 } 123 }
120 124
  125 + ///Update centerline internal parameters (currently the L vector)
  126 + void update() {
  127 + init();
  128 + }
121 ///Return the length of the entire centerline 129 ///Return the length of the entire centerline
122 T length() { 130 T length() {
123 return L.back(); 131 return L.back();
stim/biomodels/network.h
@@ -338,6 +338,7 @@ public: @@ -338,6 +338,7 @@ public:
338 stim::centerline<T> c3(c.size()); 338 stim::centerline<T> c3(c.size());
339 for(size_t j = 0; j < c.size(); j++) 339 for(size_t j = 0; j < c.size(); j++)
340 c3[j] = c[j]; 340 c3[j] = c[j];
  341 + c3.update();
341 342
342 // edge new_edge = c3; ///This is dangerous. 343 // edge new_edge = c3; ///This is dangerous.
343 edge new_edge(c3); 344 edge new_edge(c3);
@@ -512,8 +513,8 @@ public: @@ -512,8 +513,8 @@ public:
512 kdt.create(c, n_data, MaxTreeLevels); // build a KD tree 513 kdt.create(c, n_data, MaxTreeLevels); // build a KD tree
513 514
514 for(unsigned e = 0; e < R.E.size(); e++){ //for each edge in A 515 for(unsigned e = 0; e < R.E.size(); e++){ //for each edge in A
515 - R.E[e].add_mag(0); //add a new magnitude for the metric  
516 - size_t errormag_id = R.E[e].nmags() - 1; //get the id for the new magnitude 516 + //R.E[e].add_mag(0); //add a new magnitude for the metric
  517 + //size_t errormag_id = R.E[e].nmags() - 1; //get the id for the new magnitude
517 518
518 size_t n = R.E[e].size(); // the number of points in current edge 519 size_t n = R.E[e].size(); // the number of points in current edge
519 T* queryPt = new T[3 * n]; 520 T* queryPt = new T[3 * n];
@@ -540,7 +541,7 @@ public: @@ -540,7 +541,7 @@ public:
540 cudaMemcpy(m1, d_m1, n * sizeof(T), cudaMemcpyDeviceToHost); 541 cudaMemcpy(m1, d_m1, n * sizeof(T), cudaMemcpyDeviceToHost);
541 542
542 for(unsigned p = 0; p < n; p++){ 543 for(unsigned p = 0; p < n; p++){
543 - R.E[e].set_mag(errormag_id, p, m1[p]); 544 + R.E[e].set_r(p, m1[p]);
544 } 545 }
545 546
546 //d_set_mag<<<blocks, threads>>>(R.E[e].M, errormag_id, n, m1); 547 //d_set_mag<<<blocks, threads>>>(R.E[e].M, errormag_id, n, m1);
@@ -608,8 +609,8 @@ public: @@ -608,8 +609,8 @@ public:
608 relation.resize(A.E.size()); 609 relation.resize(A.E.size());
609 610
610 for(unsigned e = 0; e < A.E.size(); e++){ //for each edge in A 611 for(unsigned e = 0; e < A.E.size(); e++){ //for each edge in A
611 - A.E[e].add_mag(0); //add a new magnitude for the metric  
612 - size_t errormag_id = A.E[e].nmags() - 1; 612 + //A.E[e].add_mag(0); //add a new magnitude for the metric
  613 + //size_t errormag_id = A.E[e].nmags() - 1;
613 614
614 size_t n = A.E[e].size(); // the number of edges in A 615 size_t n = A.E[e].size(); // the number of edges in A
615 616
@@ -643,7 +644,7 @@ public: @@ -643,7 +644,7 @@ public:
643 cudaMemcpy(m1, d_m1, n * sizeof(T), cudaMemcpyDeviceToHost); 644 cudaMemcpy(m1, d_m1, n * sizeof(T), cudaMemcpyDeviceToHost);
644 645
645 for(unsigned p = 0; p < n; p++){ 646 for(unsigned p = 0; p < n; p++){
646 - A.E[e].set_mag(errormag_id, p, m1[p]); // set the error(radius) value to every point in current edge 647 + A.E[e].set_r(p, m1[p]); // set the error(radius) value to every point in current edge
647 } 648 }
648 649
649 relation[e].resize(n); // resize every edge relation size 650 relation[e].resize(n); // resize every edge relation size
@@ -723,10 +724,10 @@ public: @@ -723,10 +724,10 @@ public:
723 if(p == E[e].size() - 2) // if there is no splitting index, set the id to the last point index of current edge 724 if(p == E[e].size() - 2) // if there is no splitting index, set the id to the last point index of current edge
724 id = p + 1; 725 id = p + 1;
725 } 726 }
726 - unsigned errormag_id = E[e].nmags() - 1; 727 + //unsigned errormag_id = E[e].nmags() - 1;
727 T G = 0; // test to see whether it has its nearest neighbor 728 T G = 0; // test to see whether it has its nearest neighbor
728 for(unsigned i = 0; i < E[e].size(); i++) 729 for(unsigned i = 0; i < E[e].size(); i++)
729 - G += E[e].m(i, errormag_id); // won't split special edges 730 + G += E[e].r(i); // won't split special edges
730 if(G / E[e].size() > metric_fac) // should based on the color map 731 if(G / E[e].size() > metric_fac) // should based on the color map
731 id = E[e].size() - 1; // set split idx to outgoing direction vertex 732 id = E[e].size() - 1; // set split idx to outgoing direction vertex
732 733
@@ -795,12 +796,12 @@ public: @@ -795,12 +796,12 @@ public:
795 kdt.create(c, n_data, MaxTreeLevels); // build a KD tree 796 kdt.create(c, n_data, MaxTreeLevels); // build a KD tree
796 797
797 for(unsigned e = 0; e < n; e++){ //for each edge in A 798 for(unsigned e = 0; e < n; e++){ //for each edge in A
798 - size_t errormag_id = A.E[e].nmags() - 1; //get the id for the new magnitude 799 + //size_t errormag_id = A.E[e].nmags() - 1; //get the id for the new magnitude
799 800
800 //pre-judge to get rid of impossibly mapping edges 801 //pre-judge to get rid of impossibly mapping edges
801 T M = 0; 802 T M = 0;
802 for(unsigned p = 0; p < A.E[e].size(); p++) 803 for(unsigned p = 0; p < A.E[e].size(); p++)
803 - M += A.E[e].m(p, errormag_id); 804 + M += A.E[e].r(p);
804 M = M / A.E[e].size(); 805 M = M / A.E[e].size();
805 if(M > metric_fac) 806 if(M > metric_fac)
806 C[e] = (unsigned)-1; //set the nearest edge of impossibly mapping edges to maximum of unsigned 807 C[e] = (unsigned)-1; //set the nearest edge of impossibly mapping edges to maximum of unsigned
@@ -862,9 +863,9 @@ public: @@ -862,9 +863,9 @@ public:
862 } 863 }
863 864
864 /// Returns the number of magnitude values stored in each edge. This should be uniform across the network. 865 /// Returns the number of magnitude values stored in each edge. This should be uniform across the network.
865 - unsigned nmags(){  
866 - return E[0].nmags();  
867 - } 866 + //unsigned nmags(){
  867 + // return E[0].nmags();
  868 + //}
868 // split a string in text by the character sep 869 // split a string in text by the character sep
869 stim::vec<T> split(std::string &text, char sep) 870 stim::vec<T> split(std::string &text, char sep)
870 { 871 {
stim/visualization/camera.h
1 #include <stim/math/vector.h> 1 #include <stim/math/vector.h>
2 #include <stim/math/quaternion.h> 2 #include <stim/math/quaternion.h>
3 -#include <stim/math/matrix.h> 3 +#include <stim/math/matrix_sq.h>
4 4
5 #include <ostream> 5 #include <ostream>
6 6
@@ -92,7 +92,7 @@ public: @@ -92,7 +92,7 @@ public:
92 quaternion<float> final = qz*qy*qx; 92 quaternion<float> final = qz*qy*qx;
93 93
94 //get the rotation matrix 94 //get the rotation matrix
95 - matrix<float, 3> rot_matrix = final.toMatrix3(); 95 + matrix_sq<float, 3> rot_matrix = final.toMatrix3();
96 96
97 //apply the rotation 97 //apply the rotation
98 d = rot_matrix*d; 98 d = rot_matrix*d;
stim/visualization/cylinder.h
@@ -21,6 +21,7 @@ protected: @@ -21,6 +21,7 @@ protected:
21 // this function assumes that the centerline has already been set 21 // this function assumes that the centerline has already been set
22 void init() { 22 void init() {
23 U.resize(size()); //allocate space for the frenet frame vectors 23 U.resize(size()); //allocate space for the frenet frame vectors
  24 + R.resize(size());
24 25
25 stim::circle<T> c; //create a circle 26 stim::circle<T> c; //create a circle
26 stim::vec3<T> d0, d1; 27 stim::vec3<T> d0, d1;
@@ -44,13 +45,13 @@ public: @@ -44,13 +45,13 @@ public:
44 45
45 cylinder(centerline& c, T r) : centerline(c) { 46 cylinder(centerline& c, T r) : centerline(c) {
46 init(); 47 init();
47 - add_mag(r); 48 + //add_mag(r);
48 } 49 }
49 50
50 //initialize a cylinder with a list of points and magnitude values 51 //initialize a cylinder with a list of points and magnitude values
51 cylinder(centerline& c, std::vector<T> r) : centerline(c){ 52 cylinder(centerline& c, std::vector<T> r) : centerline(c){
52 init(); 53 init();
53 - add_mag(r); 54 + //add_mag(r);
54 } 55 }
55 56
56 ///Returns magnitude i at the given length into the fiber (based on the pvalue). 57 ///Returns magnitude i at the given length into the fiber (based on the pvalue).
@@ -73,15 +74,15 @@ public: @@ -73,15 +74,15 @@ public:
73 74
74 T l = pvalue*L[L.size() - 1]; 75 T l = pvalue*L[L.size() - 1];
75 int idx = findIdx(l); 76 int idx = findIdx(l);
76 - return r(l, idx, i); 77 + return r(l, idx);
77 } 78 }
78 79
79 /// Returns the magnitude at the given index 80 /// Returns the magnitude at the given index
80 /// @param i is the index of the desired point 81 /// @param i is the index of the desired point
81 /// @param r is the index of the magnitude value 82 /// @param r is the index of the magnitude value
82 - T r(unsigned i) {  
83 - return R[i];  
84 - } 83 + //T r(unsigned i) {
  84 + // return R[i];
  85 + //}
85 86
86 ///adds a magnitude to each point in the cylinder 87 ///adds a magnitude to each point in the cylinder
87 /*void add_mag(V val = 0) { 88 /*void add_mag(V val = 0) {
@@ -210,9 +211,37 @@ public: @@ -210,9 +211,37 @@ public:
210 c.R[i] = r(t); //retrieve the interpolated magnitude from the current cylinder and store it in the new one 211 c.R[i] = r(t); //retrieve the interpolated magnitude from the current cylinder and store it in the new one
211 //} 212 //}
212 } 213 }
  214 + return c;
  215 + }
213 216
  217 + std::vector< stim::cylinder<T> > split(unsigned int idx) {
  218 +
  219 + unsigned N = size();
  220 + std::vector< stim::centerline<T> > LL;
  221 + LL.resize(2);
  222 + LL = (*this).centerline<T>::split(idx);
  223 + std::vector< stim::cylinder<T> > C(LL.size());
  224 + unsigned i = 0;
  225 + C[0] = LL[0];
  226 + //C[0].R.resize(idx);
  227 + for (; i < idx; i++) {
  228 + //for(unsigned d = 0; d < 3; d++)
  229 + //C[0][i][d] = LL[0].c[i][d];
  230 + C[0].R[i] = R[i];
  231 + //C[0].R[i].resize(1);
  232 + }
  233 + if (C.size() == 2) {
  234 + C[1] = LL[1];
  235 + //C[1].M.resize(N - idx);
  236 + for (; i < N; i++) {
  237 + //for(unsigned d = 0; d < 3; d++)
  238 + //C[1][i - idx][d] = LL[1].c[i - idx][d];
  239 + C[1].R[i - idx] = R[i];
  240 + //C[1].M[i - idx].resize(1);
  241 + }
  242 + }
214 243
215 - return c; 244 + return C;
216 } 245 }
217 246
218 247
stim/visualization/gl_network.h
@@ -63,17 +63,17 @@ public: @@ -63,17 +63,17 @@ public:
63 } 63 }
64 64
65 /// @param m specifies the magnitude value used as the vertex weight (radius, error, etc.) 65 /// @param m specifies the magnitude value used as the vertex weight (radius, error, etc.)
66 - void glCenterline(unsigned m = 0){ 66 + void glCenterline(){
67 67
68 if(!glIsList(dlist)){ //if dlist isn't a display list, create it 68 if(!glIsList(dlist)){ //if dlist isn't a display list, create it
69 dlist = glGenLists(3); //generate a display list 69 dlist = glGenLists(3); //generate a display list
70 glNewList(dlist, GL_COMPILE); //start a new display list 70 glNewList(dlist, GL_COMPILE); //start a new display list
71 for(unsigned e = 0; e < E.size(); e++){ //for each edge in the network 71 for(unsigned e = 0; e < E.size(); e++){ //for each edge in the network
72 - unsigned errormag_id = E[e].nmags() - 1; 72 + //unsigned errormag_id = E[e].nmags() - 1;
73 glBegin(GL_LINE_STRIP); 73 glBegin(GL_LINE_STRIP);
74 for(unsigned p = 0; p < E[e].size(); p++){ //for each point on that edge 74 for(unsigned p = 0; p < E[e].size(); p++){ //for each point on that edge
75 glVertex3f(E[e][p][0], E[e][p][1], E[e][p][2]); //set the vertex position based on the current point 75 glVertex3f(E[e][p][0], E[e][p][1], E[e][p][2]); //set the vertex position based on the current point
76 - glTexCoord1f(E[e].m(p, errormag_id)); //set the texture coordinate based on the specified magnitude index 76 + glTexCoord1f(E[e].r(p)); //set the texture coordinate based on the specified magnitude index
77 } 77 }
78 glEnd(); 78 glEnd();
79 } 79 }