Commit 58ee2b2161d82073123935023a6026ec7e79e7f3
1 parent
a42c92ae
incorporated stim::cylinder into stim::network, replacing stim::fiber
Showing
2 changed files
with
76 additions
and
12 deletions
Show diff stats
stim/biomodels/network.h
@@ -10,7 +10,7 @@ | @@ -10,7 +10,7 @@ | ||
10 | #include <math.h> | 10 | #include <math.h> |
11 | #include <stim/math/vector.h> | 11 | #include <stim/math/vector.h> |
12 | #include <stim/visualization/obj.h> | 12 | #include <stim/visualization/obj.h> |
13 | -#include <stim/biomodels/fiber.h> | 13 | +#include <stim/visualization/cylinder.h> |
14 | #include <ANN/ANN.h> | 14 | #include <ANN/ANN.h> |
15 | #include <boost/tuple/tuple.hpp> | 15 | #include <boost/tuple/tuple.hpp> |
16 | 16 | ||
@@ -28,23 +28,23 @@ class network{ | @@ -28,23 +28,23 @@ class network{ | ||
28 | 28 | ||
29 | ///Each edge is a fiber with two nodes. | 29 | ///Each edge is a fiber with two nodes. |
30 | ///Each node is an in index to the endpoint of the fiber in the nodes array. | 30 | ///Each node is an in index to the endpoint of the fiber in the nodes array. |
31 | - class edge : public fiber<T> | 31 | + class edge : public cylinder<T> |
32 | { | 32 | { |
33 | public: | 33 | public: |
34 | unsigned v[2]; //unique id's designating the starting and ending | 34 | unsigned v[2]; //unique id's designating the starting and ending |
35 | // default constructor | 35 | // default constructor |
36 | - edge() : fiber<T>(){v[1] = -1; v[0] = -1;} | 36 | + edge() : cylinder<T>(){v[1] = -1; v[0] = -1;} |
37 | /// Constructor - creates an edge from a list of points by calling the stim::fiber constructor | 37 | /// Constructor - creates an edge from a list of points by calling the stim::fiber constructor |
38 | 38 | ||
39 | ///@param p is an array of positions in space | 39 | ///@param p is an array of positions in space |
40 | - edge(std::vector< stim::vec<T> > p) : fiber<T>(p){} | 40 | + edge(std::vector< stim::vec<T> > p) : cylinder<T>(p){} |
41 | 41 | ||
42 | /// Copy constructor creates an edge from a fiber | 42 | /// Copy constructor creates an edge from a fiber |
43 | - edge(stim::fiber<T> f) : fiber<T>(f) {} | 43 | + edge(stim::cylinder<T> f) : cylinder<T>(f) {} |
44 | 44 | ||
45 | /// Resamples an edge by calling the fiber resampling function | 45 | /// Resamples an edge by calling the fiber resampling function |
46 | edge resample(T spacing){ | 46 | edge resample(T spacing){ |
47 | - edge e(fiber<T>::resample(spacing)); //call the fiber->edge constructor | 47 | + edge e(cylinder<T>::resample(spacing)); //call the fiber->edge constructor |
48 | e.v[0] = v[0]; //copy the vertex data | 48 | e.v[0] = v[0]; //copy the vertex data |
49 | e.v[1] = v[1]; | 49 | e.v[1] = v[1]; |
50 | 50 | ||
@@ -54,7 +54,7 @@ class network{ | @@ -54,7 +54,7 @@ class network{ | ||
54 | /// Output the edge information as a string | 54 | /// Output the edge information as a string |
55 | std::string str(){ | 55 | std::string str(){ |
56 | std::stringstream ss; | 56 | std::stringstream ss; |
57 | - ss<<"("<<fiber<T>::N<<")\tl = "<<length()<<"\t"<<v[0]<<"----"<<v[1]; | 57 | + ss<<"("<<cylinder<T>::size()<<")\tl = "<<length()<<"\t"<<v[0]<<"----"<<v[1]; |
58 | return ss.str(); | 58 | return ss.str(); |
59 | } | 59 | } |
60 | 60 | ||
@@ -109,7 +109,7 @@ class network{ | @@ -109,7 +109,7 @@ class network{ | ||
109 | return V.size(); | 109 | return V.size(); |
110 | } | 110 | } |
111 | 111 | ||
112 | - stim::fiber<T> get_fiber(unsigned f){ | 112 | + stim::cylinder<T> get_cylinder(unsigned f){ |
113 | return E[f]; //return the specified edge (casting it to a fiber) | 113 | return E[f]; //return the specified edge (casting it to a fiber) |
114 | } | 114 | } |
115 | 115 | ||
@@ -130,6 +130,7 @@ class network{ | @@ -130,6 +130,7 @@ class network{ | ||
130 | O.getLine(l, c); //get the fiber centerline | 130 | O.getLine(l, c); //get the fiber centerline |
131 | 131 | ||
132 | edge new_edge = c; //create an edge from the given centerline | 132 | edge new_edge = c; //create an edge from the given centerline |
133 | + unsigned int I = new_edge.size(); //calculate the number of points on the centerline | ||
133 | 134 | ||
134 | //get the first and last vertex IDs for the line | 135 | //get the first and last vertex IDs for the line |
135 | std::vector< unsigned > id; //create an array to store the centerline point IDs | 136 | std::vector< unsigned > id; //create an array to store the centerline point IDs |
@@ -158,7 +159,7 @@ class network{ | @@ -158,7 +159,7 @@ class network{ | ||
158 | it = find(id2vert.begin(), id2vert.end(), i[1]); //look for the second ID | 159 | it = find(id2vert.begin(), id2vert.end(), i[1]); //look for the second ID |
159 | it_idx = std::distance(id2vert.begin(), it); | 160 | it_idx = std::distance(id2vert.begin(), it); |
160 | if(it == id2vert.end()){ //if i[1] hasn't already been used | 161 | if(it == id2vert.end()){ //if i[1] hasn't already been used |
161 | - vertex new_vertex = new_edge.back(); //create a new vertex, assign it a position | 162 | + vertex new_vertex = new_edge[I-1]; //create a new vertex, assign it a position |
162 | new_vertex.e[1].push_back(E.size()); //add the current edge as incoming | 163 | new_vertex.e[1].push_back(E.size()); //add the current edge as incoming |
163 | new_edge.v[1] = V.size(); | 164 | new_edge.v[1] = V.size(); |
164 | V.push_back(new_vertex); //add the new vertex to the vertex list | 165 | V.push_back(new_vertex); //add the new vertex to the vertex list |
@@ -193,7 +194,6 @@ class network{ | @@ -193,7 +194,6 @@ class network{ | ||
193 | 194 | ||
194 | /// This function resamples all fibers in a network given a desired minimum spacing | 195 | /// This function resamples all fibers in a network given a desired minimum spacing |
195 | stim::network<T> resample(T spacing){ | 196 | stim::network<T> resample(T spacing){ |
196 | - std::cout<<"network::resample()"<<std::endl; | ||
197 | stim::network<T> n; //create a new network that will be an exact copy, with resampled fibers | 197 | stim::network<T> n; //create a new network that will be an exact copy, with resampled fibers |
198 | n.V = V; //copy all vertices | 198 | n.V = V; //copy all vertices |
199 | 199 | ||
@@ -201,9 +201,7 @@ class network{ | @@ -201,9 +201,7 @@ class network{ | ||
201 | 201 | ||
202 | //copy all fibers, resampling them in the process | 202 | //copy all fibers, resampling them in the process |
203 | for(unsigned e = 0; e < edges(); e++){ //for each edge in the edge list | 203 | for(unsigned e = 0; e < edges(); e++){ //for each edge in the edge list |
204 | - std::cout<<"edge: "<<e<<std::endl; | ||
205 | n.E[e] = E[e].resample(spacing); //resample the edge and copy it to the new network | 204 | n.E[e] = E[e].resample(spacing); //resample the edge and copy it to the new network |
206 | - std::cout<<"resampled"<<std::endl; | ||
207 | } | 205 | } |
208 | 206 | ||
209 | return n; //return the resampled network | 207 | return n; //return the resampled network |
stim/visualization/cylinder.h
@@ -48,6 +48,8 @@ class cylinder | @@ -48,6 +48,8 @@ class cylinder | ||
48 | 48 | ||
49 | } | 49 | } |
50 | 50 | ||
51 | + | ||
52 | + | ||
51 | ///returns the total length of the line at index j. | 53 | ///returns the total length of the line at index j. |
52 | T | 54 | T |
53 | getl(int j) | 55 | getl(int j) |
@@ -98,6 +100,21 @@ class cylinder | @@ -98,6 +100,21 @@ class cylinder | ||
98 | init(inP, inM); | 100 | init(inP, inM); |
99 | } | 101 | } |
100 | 102 | ||
103 | + ///Constructor defines a cylinder with centerline inP and magnitudes of zero | ||
104 | + ///@param inP: Vector of stim vecs composing the points of the centerline | ||
105 | + cylinder(std::vector< stim::vec<T> > inP){ | ||
106 | + std::vector< stim::vec<T> > inM; //create an array of arbitrary magnitudes | ||
107 | + inM.resize(inP.size(), 0); //initialize the magnitude values to zero | ||
108 | + init(inP, inM); | ||
109 | + } | ||
110 | + | ||
111 | + | ||
112 | + ///Returns the number of points on the cylinder centerline | ||
113 | + | ||
114 | + unsigned int size(){ | ||
115 | + return pos.size(); | ||
116 | + } | ||
117 | + | ||
101 | 118 | ||
102 | ///Returns a position vector at the given p-value (p value ranges from 0 to 1). | 119 | ///Returns a position vector at the given p-value (p value ranges from 0 to 1). |
103 | ///interpolates the position along the line. | 120 | ///interpolates the position along the line. |
@@ -189,6 +206,55 @@ class cylinder | @@ -189,6 +206,55 @@ class cylinder | ||
189 | return points; | 206 | return points; |
190 | } | 207 | } |
191 | } | 208 | } |
209 | + | ||
210 | + /// Allows a point on the centerline to be accessed using bracket notation | ||
211 | + | ||
212 | + vec<T> operator[](unsigned int i){ | ||
213 | + | ||
214 | + return pos[i]; | ||
215 | + | ||
216 | + } | ||
217 | + | ||
218 | + /// Returns the total length of the cylinder centerline | ||
219 | + T length(){ | ||
220 | + return L.back(); | ||
221 | + } | ||
222 | + | ||
223 | + /// Resamples the cylinder to provide a maximum distance of "spacing" between centerline points. All current | ||
224 | + /// centerline points are guaranteed to exist in the new cylinder | ||
225 | + /// @param spacing is the maximum spacing allowed between sample points | ||
226 | + cylinder<T> resample(T spacing){ | ||
227 | + | ||
228 | + std::vector< vec<T> > result; | ||
229 | + | ||
230 | + vec<T> p0 = pos[0]; //initialize p0 to the first point on the centerline | ||
231 | + vec<T> p1; | ||
232 | + unsigned N = size(); //number of points in the current centerline | ||
233 | + | ||
234 | + //for each line segment on the centerline | ||
235 | + for(unsigned int i = 1; i < N; i++){ | ||
236 | + p1 = pos[i]; //get the second point in the line segment | ||
237 | + | ||
238 | + vec<T> v = p1 - p0; //calculate the vector between these two points | ||
239 | + T d = v.len(); //calculate the distance between these two points (length of the line segment) | ||
240 | + | ||
241 | + unsigned nsteps = d / spacing; //calculate the number of steps to take along the segment to meet the spacing criteria | ||
242 | + T stepsize = 1.0 / nsteps; //calculate the parametric step size between new centerline points | ||
243 | + | ||
244 | + //for each step along the line segment | ||
245 | + for(unsigned s = 0; s < nsteps; s++){ | ||
246 | + T alpha = stepsize * s; //calculate the fraction of the distance along the line segment covered | ||
247 | + result.push_back(p0 + alpha * v); //push the point at alpha position along the line segment | ||
248 | + } | ||
249 | + | ||
250 | + p0 = p1; //shift the points to move to the next line segment | ||
251 | + } | ||
252 | + | ||
253 | + result.push_back(pos[size() - 1]); //push the last point in the centerline | ||
254 | + | ||
255 | + return cylinder<T>(result); | ||
256 | + | ||
257 | + } | ||
192 | 258 | ||
193 | }; | 259 | }; |
194 | 260 |