From b019bc5e8aaac9845d926bcf1b8b11237bc6174e Mon Sep 17 00:00:00 2001 From: Jiaming Guo Date: Mon, 9 Jan 2017 09:20:24 -0600 Subject: [PATCH] add function to render a tube around the centerline --- stim/visualization/gl_network.h | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 53 insertions(+), 1 deletion(-) diff --git a/stim/visualization/gl_network.h b/stim/visualization/gl_network.h index 7ff4309..62bdb90 100644 --- a/stim/visualization/gl_network.h +++ b/stim/visualization/gl_network.h @@ -43,6 +43,36 @@ public: return bb; //return the bounding box } + void renderCylinder(T x1, T y1, T z1, T x2, T y2, T z2, T radius, int subdivisions) { + T dx = x2 - x1; + T dy = y2 - y1; + T dz = z2 - z1; + /// handle the degenerate case with an approximation + if (dz == 0) + dz = .00000001; + T d = sqrt(dx*dx + dy*dy + dz*dz); // distance between two points = length/height + T ax = 57.2957795*acos(dz / d); // 180°/pi + if (dz < 0.0) + ax = -ax; + T rx = -dy*dz; + T ry = dx*dz; + + glPushMatrix(); + glTranslatef(x1, y1, z1); + glRotatef(ax, rx, ry, 0.0); + + glutSolidCylinder(radius, d, subdivisions, 1); + glPopMatrix(); + } + + void renderBall(T x, T y, T z, T radius, int subdivisions) { + glPushMatrix(); + glTranslatef(x, y, z); + glutSolidSphere(radius, subdivisions, subdivisions); + glPopMatrix(); + } + + /// Render the network centerline as a series of line strips. /// glCenterline0 is for only one input void glCenterline0(){ @@ -66,7 +96,7 @@ public: void glCenterline(){ if(!glIsList(dlist)){ //if dlist isn't a display list, create it - dlist = glGenLists(3); //generate a display list + dlist = glGenLists(1); //generate a display list glNewList(dlist, GL_COMPILE); //start a new display list for(unsigned e = 0; e < E.size(); e++){ //for each edge in the network //unsigned errormag_id = E[e].nmags() - 1; @@ -84,6 +114,7 @@ public: void glRandColorCenterlineGT(GLuint &dlist1, std::vector map, std::vector colormap){ if(!glIsList(dlist1)){ + dlist1 = glGenLists(1); glNewList(dlist1, GL_COMPILE); for(unsigned e = 0; e < E.size(); e++){ if(map[e] != unsigned(-1)){ @@ -93,6 +124,9 @@ public: glVertex3f(E[e][p][0], E[e][p][1], E[e][p][2]); } glEnd(); + for (unsigned p = 0; p < E[e].size() - 1; p++) { + renderCylinder(E[e][p][0], E[e][p][1], E[e][p][2], E[e][p + 1][0], E[e][p + 1][1], E[e][p + 1][2], 10, 20); + } } else{ glColor3f(1.0, 1.0, 1.0); @@ -103,6 +137,13 @@ public: glEnd(); } } + for (unsigned v = 0; v < V.size(); v++) { + size_t num_edge = V[v].e[0].size() + V[v].e[1].size(); + if (num_edge > 1) { + glColor3f(0.3, 0.3, 0.3); // gray color for vertex + renderBall(V[v][0], V[v][1], V[v][2], 20, 20); + } + } glEndList(); } glCallList(dlist1); @@ -110,6 +151,7 @@ public: void glRandColorCenterlineT(GLuint &dlist2, std::vector map, std::vector colormap){ if(!glIsList(dlist2)){ + dlist2 = glGenLists(1); glNewList(dlist2, GL_COMPILE); for(unsigned e = 0; e < E.size(); e++){ if(map[e] != unsigned(-1)){ @@ -119,6 +161,9 @@ public: glVertex3f(E[e][p][0], E[e][p][1], E[e][p][2]); } glEnd(); + for (unsigned p = 0; p < E[e].size() - 1; p++) { + renderCylinder(E[e][p][0], E[e][p][1], E[e][p][2], E[e][p + 1][0], E[e][p + 1][1], E[e][p + 1][2], 10, 20); + } } else{ glColor3f(1.0, 1.0, 1.0); @@ -129,6 +174,13 @@ public: glEnd(); } } + for (unsigned v = 0; v < V.size(); v++) { + size_t num_edge = V[v].e[0].size() + V[v].e[1].size(); + if (num_edge > 1) { + glColor3f(0.3, 0.3, 0.3); // gray color for vertex + renderBall(V[v][0], V[v][1], V[v][2], 20, 20); + } + } glEndList(); } glCallList(dlist2); -- libgit2 0.21.4