24 #include <GL/freeglut.h>
26 #include "mesh_view.h"
34 MeshView::MeshView(
const char* title, WinGeom* wg)
35 : View(title, wg), lin(NULL)
44 MeshView::MeshView(
char* title, WinGeom* wg)
45 : View(title, wg), lin(NULL)
56 if(nodes != NULL)
delete [] nodes;
57 if(elems != NULL)
delete [] elems;
62 void MeshView::show(Mesh* mesh)
64 ZeroSolution<double> sln(mesh);
65 if(mesh == NULL)
throw Hermes::Exceptions::Exception(
"mesh == NULL in MeshView::show().");
66 if(mesh->get_max_element_id() == 0)
throw Hermes::Exceptions::Exception(
"Attempt to visualize empty mesh in MeshView::show().");
71 lin =
new Linearizer();
73 lin->process_solution(&sln);
75 lin->calc_vertices_aabb(&vertices_min_x, &vertices_max_x, &vertices_min_y, &vertices_max_y);
80 if(elems != NULL)
delete [] elems;
81 ne = mesh->get_max_element_id() + 1;
82 elems =
new ObjInfo[ne];
83 for (i = 0; i < ne; i++)
86 int active_element_cnt = 0;
87 float min_error = -1, max_error = -1;
89 for_all_active_elements(e, mesh)
91 ObjInfo* oi = elems + e->id;
95 for (
unsigned i = 0; i < e->get_nvert(); i++)
100 oi->x /= e->get_nvert();
101 oi->y /= e->get_nvert();
111 void MeshView::set_b_elem_mrk(
bool set)
115 b_elem_mrk = !b_elem_mrk;
119 void MeshView::on_display()
121 set_ortho_projection();
122 glDisable(GL_TEXTURE_1D);
123 glDisable(GL_LIGHTING);
124 glDisable(GL_DEPTH_TEST);
128 int i, nv = lin->get_num_vertices();
129 double3* vert = lin->get_vertices();
130 double2* tvert =
new double2[nv];
131 for (i = 0; i < nv; i++)
133 tvert[i][0] = transform_x(vert[i][0]);
134 tvert[i][1] = transform_y(vert[i][1]);
138 int3* tris = lin->get_triangles();
139 glColor3f(0.9f, 0.9f, 0.9f);
140 glBegin(GL_TRIANGLES);
141 for (i = 0; i < lin->get_num_triangles(); i++)
143 glVertex2d(tvert[tris[i][0]][0], tvert[tris[i][0]][1]);
144 glVertex2d(tvert[tris[i][1]][0], tvert[tris[i][1]][1]);
145 glVertex2d(tvert[tris[i][2]][0], tvert[tris[i][2]][1]);
150 glLineStipple(5, 0x5555);
151 int2* edges = lin->get_edges();
152 int* edge_markers = lin->get_edge_markers();
153 for (i = 0; i < lin->get_num_edges(); i++)
155 int mrk = b_markers ? edges[i][2] : 0;
157 if(!edge_markers[i] &&
158 ((tvert[edges[i][0]][1] == tvert[edges[i][1]][1] &&
159 tvert[edges[i][0]][0] < tvert[edges[i][1]][0]) ||
160 tvert[edges[i][0]][1] < tvert[edges[i][1]][1]))
continue;
162 float* color = get_marker_color(mrk);
163 glColor3f(color[0], color[1], color[2]);
164 glLineWidth(mrk ? 1.5f : 1.0f);
166 glVertex2d(tvert[edges[i][0]][0], tvert[edges[i][0]][1]);
167 glVertex2d(tvert[edges[i][1]][0], tvert[edges[i][1]][1]);
172 glEnable(GL_LINE_STIPPLE);
173 glColor3f(0.4f, 0.4f, 0.4f);
175 glVertex2d(tvert[edges[i][0]][0], tvert[edges[i][0]][1]);
176 glVertex2d(tvert[edges[i][1]][0], tvert[edges[i][1]][1]);
178 glDisable(GL_LINE_STIPPLE);
186 for (i = 0; i < ne; i++)
188 if(elems[i].
id < 0)
continue;
190 sprintf(text,
"#%d", elems[i].
id);
191 draw_text(transform_x(elems[i].x), transform_y(elems[i].y), text, 0);
197 for (i = 0; i < ne; i++)
199 if(elems[i].
id < 0)
continue;
201 sprintf(text,
"%s", mesh->get_element_markers_conversion().get_user_marker(elems[i].
type).marker.c_str());
202 draw_text(transform_x(elems[i].x), transform_y(elems[i].y), text, 0);
210 void MeshView::on_key_down(
unsigned char key,
int x,
int y)
220 b_markers = !b_markers;
225 if(b_elem_mrk) b_elem_mrk =
false;
231 if(b_ids) b_ids =
false;
232 b_elem_mrk = !b_elem_mrk;
237 View::on_key_down(key, x, y);
242 float* MeshView::get_marker_color(
int marker)
244 static float edgecol[3] = { 0.3f, 0.3f, 0.3f };
245 static float randcol[3];
246 static float mc[8][3] =
248 { 1.0f, 0.3f, 0.3f },
249 { 0.0f, 0.9f, 0.0f },
250 { 0.0f, 0.0f, 0.7f },
251 { 1.0f, 1.0f, 0.2f },
252 { 0.7f, 0.0f, 0.0f },
253 { 0.0f, 0.5f, 0.0f },
254 { 0.3f, 0.5f, 1.0f },
255 { 0.8f, 0.8f, 0.0f },
260 else if(marker > 0 && marker < 8)
265 randcol[0] = (float) rand() / RAND_MAX;
266 randcol[1] = (float) rand() / RAND_MAX;
267 randcol[2] = (float) rand() / RAND_MAX;
272 const char* MeshView::get_help_text()
const
277 " Left mouse - pan\n"
278 " Right mouse - zoom\n"
279 " C - center image\n"
280 " H - render high-quality frame\n"
281 " B - toggle boundary markers\n"
282 " I - toggle element IDs\n"
283 " M - toggle element markers\n"
284 " S - save screenshot\n"