Commit 2988ca4d8397907b6cba14fc32004798e7a2665b

Authored by David Mayerich
2 parents 424c1475 b7624d0d

Merge branch 'master' of https://git.stim.ee.uh.edu/codebase/stimlib

stim/biomodels/network.h
@@ -175,21 +175,49 @@ public: @@ -175,21 +175,49 @@ public:
175 return E[e].r(i); 175 return E[e].r(i);
176 } 176 }
177 177
  178 + ///Returns the average radius of specific edge
  179 + T get_average_R(unsigned e) {
  180 + T result = 0.0;
  181 + unsigned n = E[e].size();
  182 + for (unsigned p = 0; p < n; p++)
  183 + result += E[e].r(p);
  184 +
  185 + return (T)result / n;
  186 + }
  187 +
178 ///Returns the length of current edge 188 ///Returns the length of current edge
179 T get_L(unsigned e) { 189 T get_L(unsigned e) {
180 return E[e].length(); 190 return E[e].length();
181 } 191 }
182 192
183 ///Returns the start vertex of current edge 193 ///Returns the start vertex of current edge
184 - size_t get_SP(unsigned e) { 194 + size_t get_start_vertex(unsigned e) {
185 return E[e].v[0]; 195 return E[e].v[0];
186 } 196 }
187 197
188 ///Returns the end vertex of current edge 198 ///Returns the end vertex of current edge
189 - size_t get_EP(unsigned e) { 199 + size_t get_end_vertex(unsigned e) {
190 return E[e].v[1]; 200 return E[e].v[1];
191 } 201 }
192 202
  203 + ///Returns one vertex
  204 + stim::vec3<T> get_vertex(unsigned i) {
  205 + return V[i];
  206 + }
  207 +
  208 + ///Returns the boundary vertices' indices
  209 + std::vector<unsigned> get_boundary_vertex() {
  210 + std::vector<unsigned> result;
  211 +
  212 + for (unsigned v = 0; v < V.size(); v++) {
  213 + if (V[v].e[0].size() + V[v].e[1].size() == 1) { // boundary vertex
  214 + result.push_back(v);
  215 + }
  216 + }
  217 +
  218 + return result;
  219 + }
  220 +
193 //scale the network by some constant value 221 //scale the network by some constant value
194 // I don't think these work?????? 222 // I don't think these work??????
195 /*std::vector<vertex> operator*(T s){ 223 /*std::vector<vertex> operator*(T s){
stim/visualization/gl_aaboundingbox.h
@@ -4,44 +4,44 @@ @@ -4,44 +4,44 @@
4 #include <stim/visualization/aaboundingbox.h> 4 #include <stim/visualization/aaboundingbox.h>
5 #include <GL/gl.h> 5 #include <GL/gl.h>
6 6
7 -namespace stim{ 7 +namespace stim {
8 8
9 -template <typename T>  
10 -class gl_aaboundingbox : public aaboundingbox<T>{ 9 + template <typename T>
  10 + class gl_aaboundingbox : public aaboundingbox<T> {
11 11
12 -public: 12 + public:
13 13
14 - using stim::aaboundingbox<T>::A;  
15 - using stim::aaboundingbox<T>::B; 14 + using stim::aaboundingbox<T>::A;
  15 + using stim::aaboundingbox<T>::B;
16 16
17 - //default constructor  
18 - gl_aaboundingbox() : stim::aaboundingbox<T>(){} 17 + //default constructor
  18 + gl_aaboundingbox() : stim::aaboundingbox<T>() {}
19 19
20 - //constructor takes an AABB  
21 - gl_aaboundingbox(stim::aaboundingbox<T> b) : stim::aaboundingbox<T>(b){} 20 + //constructor takes an AABB
  21 + gl_aaboundingbox(stim::aaboundingbox<T> b) : stim::aaboundingbox<T>(b) {}
22 22
23 23
24 - /// Specifies vertices of the bounding box using CW winding. Use GL_LINE_LOOP for wireframe or GL_QUADS for a solid.  
25 - void glWire(){ 24 + /// Specifies vertices of the bounding box using CW winding. Use GL_LINE_LOOP for wireframe or GL_QUADS for a solid.
  25 + void glWire() {
26 26
27 - //front plane (in A[2])  
28 - glBegin(GL_LINE_LOOP); 27 + //front plane (in A[2])
  28 + glBegin(GL_LINE_LOOP);
29 glVertex3f(A[0], A[1], A[2]); 29 glVertex3f(A[0], A[1], A[2]);
30 glVertex3f(A[0], B[1], A[2]); 30 glVertex3f(A[0], B[1], A[2]);
31 glVertex3f(B[0], B[1], A[2]); 31 glVertex3f(B[0], B[1], A[2]);
32 glVertex3f(B[0], A[1], A[2]); 32 glVertex3f(B[0], A[1], A[2]);
33 - glEnd(); 33 + glEnd();
34 34
35 - //back plane (in B[2])  
36 - glBegin(GL_LINE_LOOP); 35 + //back plane (in B[2])
  36 + glBegin(GL_LINE_LOOP);
37 glVertex3f(B[0], B[1], B[2]); 37 glVertex3f(B[0], B[1], B[2]);
38 glVertex3f(A[0], B[1], B[2]); 38 glVertex3f(A[0], B[1], B[2]);
39 - glVertex3f(A[0], A[1], B[2]); 39 + glVertex3f(A[0], A[1], B[2]);
40 glVertex3f(B[0], A[1], B[2]); 40 glVertex3f(B[0], A[1], B[2]);
41 - glEnd(); 41 + glEnd();
42 42
43 - //fill out the rest of the lines to connect the two faces  
44 - glBegin(GL_LINES); 43 + //fill out the rest of the lines to connect the two faces
  44 + glBegin(GL_LINES);
45 glVertex3f(A[0], B[1], A[2]); 45 glVertex3f(A[0], B[1], A[2]);
46 glVertex3f(A[0], B[1], B[2]); 46 glVertex3f(A[0], B[1], B[2]);
47 glVertex3f(B[0], B[1], B[2]); 47 glVertex3f(B[0], B[1], B[2]);
@@ -50,12 +50,12 @@ public: @@ -50,12 +50,12 @@ public:
50 glVertex3f(B[0], A[1], B[2]); 50 glVertex3f(B[0], A[1], B[2]);
51 glVertex3f(A[0], A[1], B[2]); 51 glVertex3f(A[0], A[1], B[2]);
52 glVertex3f(A[0], A[1], A[2]); 52 glVertex3f(A[0], A[1], A[2]);
53 - glEnd(); 53 + glEnd();
54 54
55 - } 55 + }
56 56
57 57
58 -}; //end stim::gl_aabb 58 + }; //end stim::gl_aabb
59 59
60 60
61 }; //end namespace stim 61 }; //end namespace stim
stim/visualization/gl_network.h
@@ -155,6 +155,39 @@ public: @@ -155,6 +155,39 @@ public:
155 glCallList(dlist); //render the display list 155 glCallList(dlist); //render the display list
156 } 156 }
157 157
  158 + ///render the network cylinder as a series of tubes(when only one network loaded)
  159 + void glCylinder0() {
  160 +
  161 + if (!glIsList(dlist)) { // if dlist isn't a display list, create it
  162 + dlist = glGenLists(1); // generate a display list
  163 + glNewList(dlist, GL_COMPILE); // start a new display list
  164 + T radius = 0.0;
  165 + for (unsigned e = 0; e < E.size(); e++) { // for each edge in the network
  166 + radius = get_average_R(e) / get_average_R(0); // calculate the radius
  167 + for (unsigned p = 1; p < E[e].size(); p++) { // for each point on that edge
  168 + stim::circle<T> C1 = E[e].circ(p - 1);
  169 + stim::circle<T> C2 = E[e].circ(p);
  170 + C1.set_R(2 * radius); // re-scale the circle to the same
  171 + C2.set_R(2 * radius);
  172 + std::vector< stim::vec3<T> > Cp1 = C1.glpoints(20);// get 20 points on the circle plane
  173 + std::vector< stim::vec3<T> > Cp2 = C2.glpoints(20);
  174 + glBegin(GL_QUAD_STRIP);
  175 + for (unsigned i = 0; i < Cp1.size(); i++) {
  176 + glVertex3f(Cp1[i][0], Cp1[i][1], Cp1[i][2]);
  177 + glVertex3f(Cp2[i][0], Cp2[i][1], Cp2[i][2]);
  178 + }
  179 + glEnd();
  180 + } // set the texture coordinate based on the specified magnitude index
  181 + }
  182 + for (unsigned n = 0; n < V.size(); n++) {
  183 + size_t num = V[n].e[0].size(); // store the number of outgoing edge of that vertex
  184 + renderBall(V[n][0], V[n][1], V[n][2], 2 * radius, 20);
  185 + }
  186 + glEndList(); // end the display list
  187 + }
  188 + glCallList(dlist); // render the display list
  189 + }
  190 +
158 ///render the network cylinder as a series of tubes 191 ///render the network cylinder as a series of tubes
159 ///colors are based on metric values 192 ///colors are based on metric values
160 void glCylinder(float sigma, float radius) { 193 void glCylinder(float sigma, float radius) {