Commit 2df16996ceaf47335cca5459ad72020c69c384f3
1 parent
2b28db3e
add a new way to draw vertex as sphere instead of using GLUT build-in function
Showing
1 changed file
with
52 additions
and
5 deletions
Show diff stats
stim/visualization/gl_network.h
@@ -55,7 +55,7 @@ public: | @@ -55,7 +55,7 @@ public: | ||
55 | //glFlush(); | 55 | //glFlush(); |
56 | } | 56 | } |
57 | 57 | ||
58 | - ///render the vertex as sphere | 58 | + ///render the vertex as sphere based on glut build-in function |
59 | ///@param x, y, z are the three coordinates of the center point | 59 | ///@param x, y, z are the three coordinates of the center point |
60 | ///@param radius is the radius of the sphere | 60 | ///@param radius is the radius of the sphere |
61 | ///@param subdivisions is the slice/stride along/around z-axis | 61 | ///@param subdivisions is the slice/stride along/around z-axis |
@@ -66,6 +66,53 @@ public: | @@ -66,6 +66,53 @@ public: | ||
66 | glPopMatrix(); | 66 | glPopMatrix(); |
67 | } | 67 | } |
68 | 68 | ||
69 | + ///render the vertex as sphere based on transformation | ||
70 | + ///@param x, y, z are the three coordinates of the center point | ||
71 | + ///@param radius is the radius of the sphere | ||
72 | + ///@param slice is the number of subdivisions around the z-axis | ||
73 | + ///@param stack is the number of subdivisions along the z-axis | ||
74 | + void renderBall(T x, T y, T z, T radius, T slice, T stack) { | ||
75 | + T step_z = stim::PI / slice; // step angle along z-axis | ||
76 | + T step_xy = 2 * stim::PI / stack; // step angle in xy-plane | ||
77 | + T xx[4], yy[4], zz[4]; // store coordinates | ||
78 | + | ||
79 | + T angle_z = 0.0; // start angle | ||
80 | + T angle_xy = 0.0; | ||
81 | + | ||
82 | + glBegin(GL_QUADS); | ||
83 | + for (unsigned i = 0; i < slice; i++) // around the z-axis | ||
84 | + { | ||
85 | + angle_z = i * step_z; // step step_z each time | ||
86 | + | ||
87 | + for (unsigned j = 0; j < stack; j++) // along the z-axis | ||
88 | + { | ||
89 | + angle_xy = j * step_xy; // step step_xy each time, draw floor by floor | ||
90 | + | ||
91 | + xx[0] = radius * std::sin(angle_z) * std::cos(angle_xy); // four vertices | ||
92 | + yy[0] = radius * std::sin(angle_z) * std::sin(angle_xy); | ||
93 | + zz[0] = radius * std::cos(angle_z); | ||
94 | + | ||
95 | + xx[1] = radius * std::sin(angle_z + step_z) * std::cos(angle_xy); | ||
96 | + yy[1] = radius * std::sin(angle_z + step_z) * std::sin(angle_xy); | ||
97 | + zz[1] = radius * std::cos(angle_z + step_z); | ||
98 | + | ||
99 | + xx[2] = radius * std::sin(angle_z + step_z) * std::cos(angle_xy + step_xy); | ||
100 | + yy[2] = radius * std::sin(angle_z + step_z) * std::sin(angle_xy + step_xy); | ||
101 | + zz[2] = radius * std::cos(angle_z + step_z); | ||
102 | + | ||
103 | + xx[3] = radius * std::sin(angle_z) * std::cos(angle_xy + step_xy); | ||
104 | + yy[3] = radius * std::sin(angle_z) * std::sin(angle_xy + step_xy); | ||
105 | + zz[3] = radius * std::cos(angle_z); | ||
106 | + | ||
107 | + for (unsigned k = 0; k < 4; k++) | ||
108 | + { | ||
109 | + glVertex3f(x + xx[k], y + yy[k], z + zz[k]); // draw the floor plane | ||
110 | + } | ||
111 | + } | ||
112 | + } | ||
113 | + glEnd(); | ||
114 | + } | ||
115 | + | ||
69 | /// Render the network centerline as a series of line strips. | 116 | /// Render the network centerline as a series of line strips. |
70 | /// glCenterline0 is for only one input | 117 | /// glCenterline0 is for only one input |
71 | void glCenterline0(){ | 118 | void glCenterline0(){ |
@@ -145,7 +192,7 @@ public: | @@ -145,7 +192,7 @@ public: | ||
145 | unsigned idx = V[n].e[1][0]; // find the index of first incoming edge of that vertex | 192 | unsigned idx = V[n].e[1][0]; // find the index of first incoming edge of that vertex |
146 | glTexCoord1f(E[idx].r(E[idx].size() - 1)); // bind the texture as metric of last point on that edge | 193 | glTexCoord1f(E[idx].r(E[idx].size() - 1)); // bind the texture as metric of last point on that edge |
147 | } | 194 | } |
148 | - renderBall(V[n][0], V[n][1], V[n][2], 2*radius, 20); | 195 | + renderBall(V[n][0], V[n][1], V[n][2], 2*radius, 20, 20); |
149 | } | 196 | } |
150 | glEndList(); // end the display list | 197 | glEndList(); // end the display list |
151 | } | 198 | } |
@@ -183,7 +230,7 @@ public: | @@ -183,7 +230,7 @@ public: | ||
183 | else { | 230 | else { |
184 | unsigned idx = V[n].e[1][0]; // find the index of first incoming edge of that vertex | 231 | unsigned idx = V[n].e[1][0]; // find the index of first incoming edge of that vertex |
185 | } | 232 | } |
186 | - renderBall(V[n][0], V[n][1], V[n][2], 2 * radius, 20); | 233 | + renderBall(V[n][0], V[n][1], V[n][2], 2 * radius, 20, 20); |
187 | } | 234 | } |
188 | glEndList(); | 235 | glEndList(); |
189 | } | 236 | } |
@@ -236,11 +283,11 @@ public: | @@ -236,11 +283,11 @@ public: | ||
236 | size_t num_edge = V[v].e[0].size() + V[v].e[1].size(); | 283 | size_t num_edge = V[v].e[0].size() + V[v].e[1].size(); |
237 | if (num_edge > 1) { // if it is the joint vertex | 284 | if (num_edge > 1) { // if it is the joint vertex |
238 | glColor3f(0.3, 0.3, 0.3); // gray color | 285 | glColor3f(0.3, 0.3, 0.3); // gray color |
239 | - renderBall(V[v][0], V[v][1], V[v][2], 3*radius, 20); | 286 | + renderBall(V[v][0], V[v][1], V[v][2], 3*radius, 20, 20); |
240 | } | 287 | } |
241 | else { // if it is the terminal vertex | 288 | else { // if it is the terminal vertex |
242 | glColor3f(0.6, 0.6, 0.6); // more white gray | 289 | glColor3f(0.6, 0.6, 0.6); // more white gray |
243 | - renderBall(V[v][0], V[v][1], V[v][2], 3*radius, 20); | 290 | + renderBall(V[v][0], V[v][1], V[v][2], 3*radius, 20, 20); |
244 | } | 291 | } |
245 | } | 292 | } |
246 | glEndList(); | 293 | glEndList(); |