Commit 964b489815c44baab10fe2f6b2d952cf7a6fe549
1 parent
cc7e4705
added function to resample stim vec of points on fiber
Showing
1 changed file
with
58 additions
and
15 deletions
Show diff stats
stim/biomodels/fiber.h
@@ -18,11 +18,11 @@ protected: | @@ -18,11 +18,11 @@ protected: | ||
18 | double **c; //centerline (array of double pointers) | 18 | double **c; //centerline (array of double pointers) |
19 | 19 | ||
20 | T* r; // array of fiber radii | 20 | T* r; // array of fiber radii |
21 | -// // fibers this fiber intersects. | ||
22 | ANNkd_tree* kdt; //kd-tree stores all points in the fiber for fast searching | 21 | ANNkd_tree* kdt; //kd-tree stores all points in the fiber for fast searching |
23 | 22 | ||
24 | /// Initialize an empty fiber | 23 | /// Initialize an empty fiber |
25 | - void init(){ | 24 | + void init() |
25 | + { | ||
26 | kdt = NULL; | 26 | kdt = NULL; |
27 | c=NULL; | 27 | c=NULL; |
28 | r=NULL; | 28 | r=NULL; |
@@ -30,7 +30,8 @@ protected: | @@ -30,7 +30,8 @@ protected: | ||
30 | } | 30 | } |
31 | 31 | ||
32 | /// Initialize a fiber with N centerline points (all located at [0, 0, 0] with radius 0) | 32 | /// Initialize a fiber with N centerline points (all located at [0, 0, 0] with radius 0) |
33 | - void init(unsigned int n){ | 33 | + void init(unsigned int n) |
34 | + { | ||
34 | 35 | ||
35 | N = n; //set the number of points | 36 | N = n; //set the number of points |
36 | kdt = NULL; | 37 | kdt = NULL; |
@@ -61,27 +62,25 @@ protected: | @@ -61,27 +62,25 @@ protected: | ||
61 | gen_kdtree(); //generate the kd tree for the new fiber | 62 | gen_kdtree(); //generate the kd tree for the new fiber |
62 | } | 63 | } |
63 | 64 | ||
64 | - void gen_kdtree(){ | ||
65 | - | ||
66 | - //create an array of data points | ||
67 | - int n_data = N; | ||
68 | - | 65 | + /// generate a KD tree for points on fiber |
66 | + void gen_kdtree() | ||
67 | + { | ||
68 | + int n_data = N; //create an array of data points | ||
69 | ANNpointArray pts = (ANNpointArray)c; //cast the centerline list to an ANNpointArray | 69 | ANNpointArray pts = (ANNpointArray)c; //cast the centerline list to an ANNpointArray |
70 | - | ||
71 | kdt = new ANNkd_tree(pts, n_data, 3); //build a KD tree | 70 | kdt = new ANNkd_tree(pts, n_data, 3); //build a KD tree |
72 | } | 71 | } |
73 | 72 | ||
74 | - | 73 | + /// find distance between two points |
75 | double dist(double* p0, double* p1){ | 74 | double dist(double* p0, double* p1){ |
76 | 75 | ||
77 | - double sum = 0; | 76 | + double sum = 0; // initialize variables |
78 | float v; | 77 | float v; |
79 | - for(unsigned int d = 0; d < 3; d++){ | 78 | + for(unsigned int d = 0; d < 3; d++) |
79 | + { | ||
80 | v = p1[d] - p0[d]; | 80 | v = p1[d] - p0[d]; |
81 | sum +=v * v; | 81 | sum +=v * v; |
82 | 82 | ||
83 | } | 83 | } |
84 | - | ||
85 | return sqrt(sum); | 84 | return sqrt(sum); |
86 | } | 85 | } |
87 | 86 | ||
@@ -112,8 +111,6 @@ protected: | @@ -112,8 +111,6 @@ protected: | ||
112 | } | 111 | } |
113 | 112 | ||
114 | 113 | ||
115 | - | ||
116 | - | ||
117 | public: | 114 | public: |
118 | 115 | ||
119 | fiber(){ | 116 | fiber(){ |
@@ -490,6 +487,52 @@ public: | @@ -490,6 +487,52 @@ public: | ||
490 | stim::vec<T> back(){ | 487 | stim::vec<T> back(){ |
491 | return get_vec(N-1); | 488 | return get_vec(N-1); |
492 | } | 489 | } |
490 | + ////resample a fiber in the network | ||
491 | + std::vector<stim::vec<T> > Resample(std::vector< stim::vec<T> > fiberPositions, float spacing=25.0) | ||
492 | + { | ||
493 | + | ||
494 | + std::vector<T> v(3); //v-direction vector of the segment | ||
495 | + stim::vec<T> p(3); //- intermediate point to be added | ||
496 | + std::vector<T> p1(3); // p1 - starting point of an segment on the fiber, | ||
497 | + std::vector<T> p2(3); // p2 - ending point, | ||
498 | + double sum=0; //distance summation | ||
499 | + | ||
500 | + std::vector<stim::vec<T> > newPointList; // initialize list of new resampled points on the fiber | ||
501 | + // for each point on the centerline (skip if it is the last point on centerline) | ||
502 | + unsigned int N = fiberPositions.size(); // number of points on the fiber | ||
503 | + for(unsigned int f=0; f< N-1; f++) | ||
504 | + { | ||
505 | + for(unsigned int d = 0; d < 3; d++) | ||
506 | + { | ||
507 | + p1[d] = fiberPositions[f][d]; // starting point of the segment on the centerline | ||
508 | + p2[d] = fiberPositions[f + 1][d]; // ending point of the segment on the centerline | ||
509 | + v[d] = p2[d] - p1[d]; //direction vector | ||
510 | + sum +=v[d] * v[d]; //length of segment-distance between starting and ending point | ||
511 | + } | ||
512 | + newPointList.push_back(fiberPositions[f]); //always push the starting point | ||
513 | + | ||
514 | + T lengthSegment = sqrt(sum); //find Length of the segment as distance between the starting and ending points of the segment | ||
515 | + | ||
516 | + if(lengthSegment >= spacing) // if length of the segment is greater than standard deviation resample | ||
517 | + { | ||
518 | + // repeat resampling until accumulated stepsize is equsl to length of the segment | ||
519 | + for(T step=0.0; step<lengthSegment; step+=spacing) | ||
520 | + { | ||
521 | + // calculate the resampled point by travelling step size in the direction of normalized gradient vector | ||
522 | + for(unsigned int i=0; i<3;i++) | ||
523 | + { | ||
524 | + p[i] = p1[i] + v[i]*(step/lengthSegment); | ||
525 | + } //for each dimension | ||
526 | + // add this resampled points to the new fiber list | ||
527 | + newPointList.push_back(p); | ||
528 | + } | ||
529 | + } | ||
530 | + else // length of the segment is now less than standard deviation, push the ending point of the segment and proceed to the next point in the fiber | ||
531 | + newPointList.push_back(fiberPositions[f+1]); | ||
532 | + } | ||
533 | + newPointList.push_back(fiberPositions[N-1]); //add the last point on the fiber to the new fiber list | ||
534 | + return newPointList; | ||
535 | + } | ||
493 | 536 | ||
494 | }; | 537 | }; |
495 | 538 |